【问题标题】:How to push from Gitlab to Github with webhooks如何使用 webhooks 从 Gitlab 推送到 Github
【发布时间】:2014-12-08 04:47:04
【问题描述】:

如果我只能找到正确的手册,我的 Google-fu 会让我失望。

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

AFAICT 我有 3 个选项:

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

我会很感激好的指点,当我找到它时,我会总结并记录一个解决方案。

编辑

我正在将此 Ruby 代码用于网络挂钩:

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 中解决了这个问题。 您可以在 Jenkins 作业中设置多个 git 远程。我将 Git Publisher 用作构建后操作,它就像一个魅力,正是我想要的。

【问题讨论】:

    标签: ruby git github gitlab webhooks


    【解决方案1】:
    1. 当然可以。

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

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

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

    4. services 是如果有人实现它的最佳选择:位于源代码树中,会执行一次推送,并且不需要额外的部署开销。

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

    你想用谷歌搜索的关键字是“gitlab mirror github”。这导致我:例如Gitlab repository mirroring。今天似乎没有完美、简单的解决方案。

    这也已经在功能请求论坛上提出了:http://feedback.gitlab.com/forums/176466-general/suggestions/4614663-automatic-push-to-remote-mirror-repo-after-push-to 总是在那里检查 ;) 去支持请求。

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

    【讨论】:

    • 很抱歉,我不明白您的回答“网络挂钩不适合”。我的 Ruby 经验为零,但在不到一天的时间里,我就能够编写一个 Web 挂钩,在使用该 Web 挂钩的服务器上打印出最新的提交消息。接下来我需要的是在同一个 Ruby 脚本中,从 Web 服务器向 GitLab 服务器发出命令,将分支推送到 GitHub。我还不知道怎么做,但我觉得我在正确的轨道上。您的 Google 搜索不正确,因为 GitLab 不再使用 Gitolite。
    • @AmedeeVanGasse 是的,如果您编写一个使用钩子的服务器,那当然可以:只需使用钩子,然后 git clone,git push。但我认为这不是最简单的解决方案:例如,服务会更高效(单推)并且更容易部署。
    • 是的,但我(还)不知道如何以最简单的方式做到这一点,我只知道如何以一种可行的方式做到这一点。我的原则是:先让它好用,再让它更好用。反之亦然,过早的优化甚至在许多项目开始之前就扼杀了它们。
    • @AmedeeVanGasse 我同意。您的评论让我思考,我已经更新了答案。我相信 gitlab CI 是最简单的方法,因为它已经为您实现了推送 webhook 消费者服务器。
    • 我决定升级 Jenkins 并从那里继续。似乎 jenkins 的 git 插件能够在成功构建后推送到任意 git 存储库。这将回答我的问题。
    【解决方案2】:

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

    我添加了在“”成功构建后运行的“-publisher”作业。我本可以在一份工作中完成它,但我决定将它分开。构建作业由 GitLab 中的网络挂钩触发;发布者作业使用来自 BuildResultTrigger 插件的@daily 计划。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-21
      • 2021-10-21
      • 2020-11-28
      • 2018-12-30
      相关资源
      最近更新 更多