【问题标题】:Git push: change on a branch doesn't always trigger Jenkins to runGit push:分支上的更改并不总是触发 Jenkins 运行
【发布时间】:2012-05-10 16:19:06
【问题描述】:

我有 3 个 Git 分支,master、br2 和 br3。我有 3 个 Jenkins 工作;每个人都克隆相同的 repo,但签出不同的分支。我的理解是,在 post-receive 钩子中使用以下命令 (http://kohsuke.org/2011/12/01/polling-must-die-triggering-jenkins-builds-from-a-git-hook/) 应该会触发 Jenkins 为已完成推送的分支启动工作。

卷曲http://smfosbuild:8080/git/notifyCommit?url=git@vfilvgit2:scmtest.git

在 br2 上进行更改并推送,正确的 Jenkins 作业将开始。但是推送对 master 或 br3 所做的更改不会导致关联作业启动。

我还激活了电子邮件触发器,并且我收到一封电子邮件,用于指示正​​确分支的所有推送。因此,接收后挂钩正在获取有关已更改分支的正确信息。有什么想法是我上面的命令不正确还是我的 Jenkins 配置中缺少某些设置?

【问题讨论】:

    标签: git jenkins


    【解决方案1】:

    好吧,为了调查这个问题,我必须查看您的 GIT 和 Jenkins 安装。但与此同时,我可以建议一条更轻松的道路:

    在项目配置中,您可以将任何构建设置为通过常规 HTTP 调用远程触发(作业 -> 配置 -> 构建触发器 -> 远程触发构建(例如,从脚本))。这不会验证任何存储库信息,而是无论如何都执行构建。这实际上很有帮助,因为您描述的方法也给我们带来了很多麻烦。 因此,在 post-receive 钩子中添加这个,我们只是像这样调用带有作业名称的 URL:

    JENKINS_URL/job/Our$20Project%20-%20${BRANCH_NAME}/build?token=TOKEN_NAME
    

    显然,分支名称是分支的名称。

    后来,当我接手该构建时,我进行了更改,只对所有分支使用一个项目,并将分支名称作为参数传递。分支被添加到构建名称中(我们不再使用数字)并且它更容易和更灵活的解决方案。但它并不适合所有人。

    如果您愿意,我可以为您提供 post-receive 挂钩的源代码,但它真的很容易编写 - 我们根据 Git 源代码中的 post-receive-email 制作了它。

    【讨论】:

    • 谢谢卢卡斯。我已经按照您的建议作为临时解决方案;从 post-receive 钩子中获取分支名称并调用我自己的脚本来创建 http 调用。这很好用,但不可扩展。它在 Jenkins 中强制使用命名约定——这可能不是一件坏事。此外,我有 30 多个存储库,每个存储库都需要使用 Jenkins 作业名称的根进行调整。对 Jenkins 作业名称的任何更改都会触发触发器,直到在钩子中完成名称更改。这是一个非常好的建议,但我仍然希望获得推荐的命令以减少未来的维护。
    • 那么我真的很抱歉,但是如果不检查您的 Jenkins 配置和日志文件,将很难解决这个问题。如果您愿意,我们可以将其切换为通过电子邮件发送,我很乐意为您提供进一步的帮助。
    【解决方案2】:

    您是否知道,即使您使用 Kohsuke 博客文章中描述的通知方法,您也需要为该作业配置轮询?轮询间隔可以很长,例如“@daily”,但它必须存在,因为通知仅用于触发立即轮询。

    此外,您的作业需要使用 git 存储库“git@vfilvgit2:scmtest.git”。请仔细检查您没有使用 ssh://git@vfilvgit2/scmtest.git。

    【讨论】:

    • 谢谢,是的,我已将轮询配置为空白时间表 - 根据我在 Jenkins 博客上的内容,这没关系。我已经仔细检查过,我使用的是 git 存储库,而不是 ssh://。
    猜你喜欢
    • 2020-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-30
    • 2019-07-28
    • 1970-01-01
    相关资源
    最近更新 更多