【问题标题】:Is there an alternative to a "push" hook?有没有“推”钩的替代品?
【发布时间】:2015-03-17 02:46:27
【问题描述】:

Bitbucket、Github 和其他服务往往有一个“推送”钩子,这样当您将代码推送到存储库时,该服务可以点击一个 url(可能在生产服务器上),告诉它拉取最新的代码。

问题是,如果我在云中有许多服务器(根据负载进出),我无法知道在任何给定时间云中有多少服务器,所以我无法配置要“推送”到哪些 url。有其他方法吗?

有没有办法让所有生产服务器访问 github、bitbucket 等上的 url,并检查它们是否需要更新?这并不特定于任何一项服务,因为我想如果任何一项服务都拥有它,它们都会。我只是不知道“功能”会被称为什么。

【问题讨论】:

    标签: git deployment


    【解决方案1】:

    Bitbucket、Github 等服务往往有“推”钩

    实际上,Git 存储库托管服务器将具有 Git 2.10(2016 年第三季度)的另一个选项:推送选项

    commit 3ac8703commit f6a4e61commit c714e45commit 77a9745(2016 年 7 月 14 日)Stefan Beller (stefanbeller)
    (由 Junio C Hamano -- gitster -- 合并到 commit cf27c79,2016 年 8 月 3 日)

    该功能是在this thread:

    中提出的

    允许用户通过推送将信息传递到遥控器上的 pre/post-receive 挂钩。

    当使用的远程不仅仅是一个普通的 Git 主机(例如 Gerrit, Git{hub/lab} 等)这可能会变得更加明显:(特定于服务器后端的)推送选项可以指示服务器:

    • 打开拉取请求
    • 发送电子邮件要求审核
    • (未)触发持续集成
    • 为持续集成设置优先级(即机器人推送可能会要求 与人类相比,优先级较低)
    • ...

    大多数这些操作也可以在客户端完成,但在这些以远程为中心的工作流程中,在远程执行此操作更容易,这就是我们需要在那里传输信息的原因。

    更具体的例子:

    • 当您希望将 Gerrit 中的更改提交给 refs/heads/master,您 而是推送到魔术分支 refs/for/master,Gerrit 将为您创建更改(类似于拉取请求)。
      相反,我们可以想象您使用推送选项“create-change”推送到神奇的refs/heads/master
    • 当推送到 Gerrit 时,您已经可以通过在 ref 中添加“%”后跟参数来附加其中的一些信息,即在与 Gerrit 交互时,可以执行类似1 的操作:
    git push origin HEAD:refs/for/master%draft%topic=example%cc=jon.doe@xxxxxxxxxxx
    

    这对我们的用户没有吸引力,因为它看起来像是为了让它起作用。

    如果写成这样会更好读:

    git push origin HEAD:refs/for/master \
      --push-option draft \
      --push-option topic=example \
      --push-option cc=jon.doe@xxxxxxxxxxx
    

    (使用更容易输入的简短形式,但这已经更直观了)

    【讨论】:

      【解决方案2】:

      GitHub webhookpush event 允许存储库服务器 (GitHub) 联系存储库客户端(您在云中的服务器)

      但如果这不起作用,您将有两种方法:

      • 拥有一个专用的 repo 客户端(您的一个专用服务器),此 GitHub Webhook 将联系该客户端,并知道云上哪些服务器可用且需要联系。
      • 或切换到拉取方法,其中云上的服务器定期执行git pull,然后是git push 到裸仓库(仍在同一云服务器上):该裸仓库上的接收后挂钩如果git push 推送了任何内容,则可以触发(正如我在“How to execute a command right after a fetch or pull command in git?”的 cmets 中提到的)。

      【讨论】:

      • 我将创建一个裸镜像存储库,而不是第二个选项;在这种情况下,您只需 git fetch 而不是 git pullgit push
      • @JonasBerlin 但是有一个获取钩子吗? git push 背后的所有想法是能够关联一个接收后挂钩。目标是能够在 GitHub 上完成推送时触发某些东西(在第一个选项中没有提到推送事件监听器的情况下)
      • 好吧抱歉我有点跑题了。是的,在这种情况下,我会定期将第二个选项减少到 git pull;如果在发生变化时需要采取一些措施,可以在拉取前后git rev-parse HEAD 看看该命令的输出是否发生了变化。
      • @JonasBerlin 手动拉动扳机,然后...我希望有一个原生拉钩,但到目前为止,没有运气(stackoverflow.com/q/4185400/6309)。
      猜你喜欢
      • 2011-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-26
      • 2015-03-11
      • 1970-01-01
      • 1970-01-01
      • 2023-04-03
      相关资源
      最近更新 更多