如何创建一个 Gitlab webhook 来更新 Github 上的镜像仓库?

Posted

技术标签:

【中文标题】如何创建一个 Gitlab webhook 来更新 Github 上的镜像仓库?【英文标题】:How to create a Gitlab webhook to update a mirror repo on Github? 【发布时间】:2014-03-24 15:30:55 【问题描述】:

我想在 Gitlab 中创建一个 webhook,以便在发生 push 事件时自动更新 Github 上的镜像存储库。我已经检查了这个page,但我不明白它是如何完成的。

我的 Gitlab 版本是 6.5。这是配置页面:

我应该在 URL 中输入什么?我需要将脚本放在哪里来更新存储库?

【问题讨论】:

Gitlab repository mirroring的可能重复 【参考方案1】:

如果您没有托管自己的 GitLab,GitLab.com 已直接引入此功能,没有任何变通方法。

    在项目中使用齿轮图标选择Mirror Repository 向下滚动到推送到远程存储库 勾选远程镜像存储库:每小时自动从该存储库更新远程镜像的分支、标签和提交。 输入要更新的仓库;对于 GitHub,您可以在 URL 中包含您的用户名和密码,如下所示:https://yourgithubusername:yourgithubpassword@github.com/agaric/guts_discuss_resource.git — 如 cmets 中所述,在此处使用您的 GitHub 访问令牌而不是登录凭据要安全得多;我测试后会更新答案。

【讨论】:

目前,如果您使用 GitLab.com,这种新方法似乎是最简单的。但是,@novalore 的答案更为笼统,涵盖了任何 GitLab 设置。因此,我将保留它作为问题的答案,但这个也可能是有效的。 在 GitLab.com 中,此选项目前仅适用于青铜级用户 为了更好的安全性,生成一个具有“repo”范围的访问令牌以用于您的镜像:github.com/settings/tokens 然后在配置步骤 #4 时使用此令牌而不是您的密码 请注意,从安全角度来看,以这种方式向 gitlab 提供您的 github 用户和密码可能不是最好的。这些不仅是您的主要凭据,而且您还授予 gitlab 访问您拥有推送权限的任何其他 github 存储库的权限。 gitlab 中正在实现对基于 ssh 的推送镜像的支持,您可以将其与 github 的单个 repo 部署密钥结合起来,并且应该很快在 gitlab 11.6 中可用:gitlab.com/gitlab-org/gitlab-ce/issues/49565 'todo' 是旧版本,新版本的 gitlab 工作方式不同【参考方案2】:

您不需要为此使用 webhook。一个常规的 post-receive 钩子会很好用。

要创建和使用这样的钩子,您只需登录安装 gitlab 的服务器并为 git 用户创建一个 ssh 密钥。

sudo -u git ssh-keygen -f /home/git/.ssh/reponame_key

(提示时不要输入任何密码)

转到您的 github 帐户并将公钥(它已创建为 /home/git/ssh/reponame_key.pub)作为部署密钥添加到您的项目中。 如果您需要帮助,请查看https://help.github.com/articles/managing-deploy-keys。

完成后,您只需配置 git 服务器和 github 之间的连接: 为 git 用户的 ssh 配置添加别名(将以下行添加到 /home/git/.ssh/config - 如果它不存在则创建它)

Host reponame  
IdentityFile /home/git/.ssh/reponame_key  
HostName github.com  
User git 

现在将新的远程(使用您刚刚创建的别名)添加到您的存储库:

cd /home/git/repositories/namespace/reponame.git

git remote add --mirror github reponame:youruser/reponame.git

现在一切就绪,您必须创建实际的钩子:

cd /home/git/repositories/namespace/reponame.git/hooks

echo "exec git push --quiet github &" >> post-receive

chmod 755 post-receive

最后一条命令非常重要,因为 git 会在运行之前检查钩子是否可执行。

就是这样!

(根据你的真实账户替换reponame、namespace和youruser并享受)。

最后一点:如果您希望您的姓名和头像靠近 github 上的提交,请确保您在 gitlab 上使用的电子邮件地址也是与您的 github 帐户相关的地址之一。否则你会看到你的 gitlab 用户名。

【讨论】:

另外,Gitlab 6.5 目录的名称末尾有.git(例如dotfiles.git),它们不是git 存储库。所以,我无法执行添加 GitHub 镜像的命令。 @VictorHugo 您对目录的 .git 结尾也是正确的。但是,当您说它们不是 git 存储库时,您错了,它们是 bare repositories 并包含一个专门为我所说明的用途而设计的钩子目录。 成功了。非常感谢@novalore。我想分享一些调试步骤,看看是否一切正常。在/home/git/.ssh/config 中包含新主机名后,可以通过运行sudo -u git ssh reponame 来查看它是否有效。它将显示:Hi youruser/reponame! You've successfully authenticated, but GitHub does not provide shell access. Connection to github.com closed. 将命令加入post-receive文件后,我的手动运行命令exec git push github后才开始工作。 警告:这将影响所有存储库!见:***.com/questions/14288288/…【参考方案3】:

对于 WebHooks 处理,我使用的是 sinatra 网络服务器。

require 'sinatra'
post '/pew' do
  puts JSON.parse request.body.read
  # here can be placed signal code to run commit processing script
end

在 GitLab 中注册用于推送事件(或其他)的 webhook 到 http://localhost:4567/pew 并且由于每次提交的这一刻,gitlab 都会将提交信息发送到 url。

【讨论】:

以上是关于如何创建一个 Gitlab webhook 来更新 Github 上的镜像仓库?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Gitlab webhook 事件负载中获取项目名称

通过webhook构建Jenkins项目

Django实现自动发布(2视图-任务接收)

如何创建 GitLab 网络钩子?

我如何将从gitlab传入的Webhook设置为Messenger(不是松弛的,不是著名的?)?

gitlab webhook推送通知到飞书群消息