【问题标题】:Duplicate builds triggered on Jenkins multibranch pipeline在 Jenkins 多分支管道上触发重复构建
【发布时间】:2017-03-30 17:54:16
【问题描述】:

我们看到 Jenkins 多分支管道项目触发了重复构建。构建通常使用来自 Bitbucket 的使用此插件的推送通知触发:https://marketplace.atlassian.com/plugins/com.nerdwin15.stash-stash-webhook-jenkins/server/overview

但是,出于某种原因,我们现在看到了“双重”构建。如果您查看触发的 2 个构建,一个由“提交通知”触发,另一个由“分支索引”触发。

是什么导致了分支索引,为什么它会触发构建?我们没有添加或删除分支,这只是一个正常的提交/推送。

为了让它更复杂,它并不是一直都在发生。有一次我认为它只发生在合并之后,但事实并非如此。此外,阻止它的一种方法似乎是删除作业的构建历史记录(这显然不理想)。

我们正在通过管道脚本设置作业的属性,但只是为了丢弃旧版本:

properties([buildDiscarder(logRotator(artifactDaysToKeepStr: '', artifactNumToKeepStr: '', daysToKeepStr: '', numToKeepStr: '20'))])

另一个混乱的来源似乎是是否应该启用轮询(没有间隔)以便推送通知适用于 Git 插件。 Git 插件的文档表明这是必需的,并且确实似乎适用于“正常”管道构建,但似乎不需要多分支管道构建。 这是正确的吗?来自 Jenkins Git 插件 wiki:

这将扫描所有符合以下条件的作业:

已启用构建触发器 > 轮询 SCM。没有轮询时间表 必需的。配置为在指定的 URL 构建存储库 配置为构建可选指定的分支或提交 ID 对于满足这些条件的职位,将立即进行轮询 触发。如果轮询发现值得构建的更改,则构建将 依次被触发。

我们正在使用 Bitbucket 4.8.4 和 Jenkins 2.30(以及所有最新的管道插件)。

【问题讨论】:

  • 这只是一个猜测:如果存储库服务器上的时钟与 Jenkins 服务器上的时钟相比,我已经看到了类似的问题。您可以尝试添加静默期 (jenkins.io/blog/2010/08/11/quiet-period-feature)。
  • @jherb 感谢您提供信息 - 但我找不到如何在 Jenkinsfile 的管道构建中设置静默期(我们需要在脚本上设置它,因为我们正在设置其他构建属性 -这将覆盖通过 GUI 设置的任何其他设置)
  • 我猜你可以使用 sleep 60 之类的东西,如本例所示:jenkins.io/doc/pipeline/examples/#timestamper-wrapper(在调用 scm 或 git 命令之前)
  • 您的 2 个构建是否在推送时立即启动?

标签: git jenkins bitbucket jenkins-pipeline bitbucket-server


【解决方案1】:

正如其他答案已经建议的那样,“不允许并发构建”选项是您想要的。 你可以通过Jenkinsfile

 properties ([
      buildDiscarder(logRotator(artifactNumToKeepStr: '5', daysToKeepStr: '15')),
      disableConcurrentBuilds()
    ])

编辑:

这不是这里实际问题的解决方案。但它似乎对某些人仍然有帮助,所以只要我们没有更好的答案,我就会留下它。

【讨论】:

  • 是的,但是我们想要并发构建。禁用它们只会将它们排队,不是吗?我不希望触发不应该触发的构建。
  • 你对排队是正确的。我将编辑我的答案,以便至少明确它没有回答您的具体问题。
  • 这就是我真正想要的。我只是一直感到沮丧,因为谷歌一直把我送到“Throttle concurrent builds”插件。但这不是我真正的问题,我只是想要这个。谢谢留下答案。
【解决方案2】:

在 Jenkins 多分支项目配置中,将“发现分支”从“所有分支”更改为“排除提交为 PR 的分支”。

【讨论】:

    【解决方案3】:

    我也在使用多分支管道,我可能会为您提供一些信息。

    当您在 Jenkins 中创建“GitHub 组织”作业并添加相关 Git 信息时,您还需要选择触发 Jenkins 构建的方式和频率:

    Jenkins 将按照您设置的频率扫描您配置的 GitHub 组织下的存储库。

    然后,Jenkins 将在发现已提交新提交后立即自动触发构建(只要配置了 Jenkins-Git webhook)。

    发生分支索引时,也会触发构建。

    在其他 Jenkins 作业样式中,您可以配置“不允许并发构建”,但我找不到多分支作业样式的此设置。

    我希望这能对此事有所启发。

    【讨论】:

    • 该设置(如果不运行,则定期运行)似乎是失败推送通知的备份。例如,如果构建在 1 天后没有收到任何通知,则运行索引。这不是我们需要的。此外,“不允许并发构建”也不是我们需要的——我们想要并发构建。我们遇到的问题是推送通知似乎触发了 2 个构建 - 一个构建更改(正确),另一个没有列出任何更改(它只是说'分支索引)......跨度>
    【解决方案4】:

    您表示您正在使用https://marketplace.atlassian.com/plugins/com.nerdwin15.stash-stash-webhook-jenkins/server/overview。如果您仍在使用该插件,我怀疑您会更高兴现在似乎支持 jenkins/stash(又名 bitbucket 服务器)集成的插件:https://marketplace.atlassian.com/plugins/nl.topicus.bitbucket.bitbucket-webhooks/server/overview。请注意它是如何说您需要“至少提交 Bitbucket 服务器的 bitbucket-webhooks-plugin”in the bitbucket branch source plugin docs。我们正在使用它,我从未见过两个构建被同一个推送通知触发。当您手动触发构建时,是的,但不是通过相同的推送通知。 :)

    【讨论】:

      【解决方案5】:

      您可以在作业配置中添加属性“抑制自动 SCM 触发器”:

      Supress Automatic SCM Trigger Property

      这将阻止由于“分支索引”而执行的构建。

      缺点是您可能需要至少手动触发一次特定于分支的构建才能从 Jenkinsfile 应用配置。

      【讨论】:

        猜你喜欢
        • 2020-08-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-28
        • 2017-05-20
        相关资源
        最近更新 更多