如何使用webhooks从Gitlab推送到Github

时间:2014-10-13 15:02:53

标签: ruby git github gitlab webhooks

如果我只能找到合适的手册,我的Google-fu就会让我失望。

我有一个由我们的托管服务提供商安装的Gitlab服务器 Gitlab服务器有很多项目。 对于其中一些项目,我希望Gitlab每次从本地客户端推送到Gitlab时自动推送到远程存储库(在本例中为Github)。 像这样:客户 - > gitlab - > github上 还应该推送任何标签和分支。

AFAICT我有3个选择:

  1. 使用两个遥控器配置本地客户端,并同时推送到Gitlab和Github。我想避免这种情况,因为开发人员
  2. 在Gitlab服务器的存储库中添加一个git post-receive钩子。这将是最灵活的(我有足够的Linux经验将shell脚本编写为git hooks)并且我已经找到了关于如何执行此操作的文档,但我也想避免这种情况,因为托管服务提供商需要给我shell访问权限。
  3. 我在Gitlab中使用webhooks。我不熟悉webhooks的基础知识,我无法找到可理解的文档,甚至是一个简单的分步示例。这是我发现的Gitlab文档,我不明白它:http://demo.gitlab.com/help/web_hooks/web_hooks
  4. 我希望得到好的指示,当我找到它时,我会总结并记录解决方案。

    修改

    我正在使用这个Ruby代码进行Web挂钩:

    class PewPewPew < Sinatra::Base
      post '/pew' do
        push = JSON.parse(request.body.read)
        puts "I got some JSON: #{push.inspect}"
      end
    end
    

    下一步:了解如何告诉gitlab服务器必须推送存储库。我将回到GitLab API。

    修改

    我想我有个主意。在我运行webhook的服务器上,我从GitLab拉出然后我推送到Github。在推送到GitHub之前,我甚至可以做一些“魔术”(运行测试,构建jar,部署到Artifactory,......)。事实上,如果Jenkins能够在成功构建之后能够推送到远程存储库,那将是很棒的,然后我不需要编写自己的webhook,因为我非常确定Jenkins已经为Gitlab提供了一个webhook,无论是本机还是通过插件。但我不知道。爱好。

    修改

    我在詹金斯解决了这个问题。 您可以在Jenkins作业中设置多个git远程。我使用Git Publisher作为后构建动作,它就像一个魅力,正是我想要的。

2 个答案:

答案 0 :(得分:3)

  1. 当然会有效。

  2. 可能但很危险,因为GitLab shell会自动将符号链接挂钩到您的存储库中,这些是权限检查所必需的:https://github.com/gitlabhq/gitlab-shell/tree/823aba63e444afa2f45477819770fec3cb5f0159/hooks所以我宁愿远离它。

  3. Web hooks不适合直接使用:它们会针对某些事件发出固定格式的HTTP请求,在您的情况下是推送,而不是Git协议请求。

    当然,您可以编写一个消耗钩子,克隆和推送的服务器,但是服务(单推和无部署)或GitLab CI(已实现挂钩管理)将是更好的解决方案。

    < / LI>
  4. services是有人实现它的最佳选择:在源代码树中生存,只需一次推送,不需要额外的部署开销。

  5. GitLab CI或其他像Jenkins这样的CI是目前可用的最佳选择。它们基本上已经实现了webhooks的服务器,它会自动为你克隆:你所要做的就是从中推送它们。

  6. 您想要Google的关键字是“gitlab mirror github”。这导致我:Gitlab repository mirroring。今天似乎没有完美,简单的解决方案。

    此功能请求论坛上已经提出了这一点:http://feedback.gitlab.com/forums/176466-general/suggestions/4614663-automatic-push-to-remote-mirror-repo-after-push-to请务必在那里查看;)转发并提出请求。

    现在的关键难点是如何存储推送凭证。

答案 1 :(得分:2)

我在詹金斯解决了这个问题。您可以在Jenkins作业中设置多个git远程。我使用Git Publisher作为后构建动作,它就像一个魅力,正是我想要的。

我添加了&#34; -publisher&#34;在&#34;&#34;之后运行的工作建成功。我本可以在一份工作中完成它,但我决定把它分开。构建作业由GitLab中的Web钩子触发;发布者作业正在使用BuildResultTrigger插件中的@daily计划。