如何创建Gitlab Webhook以更新Github上的镜像仓库?

37

我想在Gitlab中创建一个Webhook,以便在发生push事件时自动更新Github上的镜像存储库。我查看了这个页面,但我不知道如何操作。

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

inserir a descrição da imagem aqui

URL字段应该填什么?我需要把脚本放在哪里来更新存储库?


可能是Gitlab仓库镜像的重复问题。 - Ciro Santilli OurBigBook.com
3个回答

40

你不需要使用Webhook来实现这个功能。一个常规的post-receive hook就可以非常好地工作。

为了创建和使用这样的hook,你只需要在安装了你的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 

现在将新的远程仓库(使用您刚创建的别名)添加到您的代码库中:

Now add the new remote (using the alias you just created) to your repository:

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、命名空间和youruser,并享受它)。

最后注意:如果您想在GitHub上显示提交时使用的名称和头像,请确保您在GitLab上使用的电子邮件地址也是链接到您GitHub帐户的地址之一。否则,您将看到您的GitLab用户名。


另外一件事,Gitlab 6.5目录的名称末尾带有.git(例如dotfiles.git),但它们不是git仓库。因此,我无法执行添加GitHub镜像的命令。 - Yamaneko
1
@VictorHugo,你对目录的.git结尾也是正确的。但是,当你说它们不是git仓库时,你是错误的。它们是裸仓库,并包含一个专门设计用于像我所示范的用途的钩子目录。 - novalore
1
它起作用了。非常感谢@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. - Yamaneko
将命令包含在 post-receive 文件中后,我的只有在手动运行命令 exec git push github 后才开始工作。 - Yamaneko
2
警告:这将影响所有存储库!请参见:https://dev59.com/k2Yq5IYBdhLWcg3wridD#mjsPoYgBc1ULPQZFjxD_ - Ciro Santilli OurBigBook.com
如何在 Bitbucket 中实现呢? - Geshan

32

如果您不想自己托管GitLab,GitLab.com已经直接引入了此功能,无需任何变通方法。

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

目前来看,如果你在使用GitLab.com,这种新方法似乎是最简单的。但是,@novalore的答案更通用,适用于任何GitLab设置。因此,我将保留它作为问题的答案,但这个也可能是有效的。 - Yamaneko
1
在GitLab.com上,目前只有Bronze用户才能使用此选项。 - Francisco Puga
3
为了更好的安全性,生成一个带有“repo”作用域的访问令牌,并将其用于您的镜像:https://github.com/settings/tokens在配置第4步时,请使用此令牌代替密码。 - CenterOrbit
3
请注意,在安全角度来看,以这种方式向GitLab提供您的GitHub用户名和密码可能不是最佳选择。这不仅是您的主要凭据,而且您还在授权GitLab访问您拥有推送权限的任何其他GitHub存储库。GitLab正在实现支持基于SSH的推送镜像,您可以将其与GitHub的单个存储库部署密钥结合使用,并且很快将在GitLab 11.6中提供: https://gitlab.com/gitlab-org/gitlab-ce/issues/49565 - dlouzan
'todo'已经过时,新版本的GitLab工作方式不同。 - carlo denaro

1

为了处理WebHooks,我使用sinatra web服务器。

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。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接