在 Jenkins 多分支管道上触发重复构建

问题描述 投票:0回答:6

我们看到 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(以及所有最新的管道插件)。

git jenkins bitbucket jenkins-pipeline bitbucket-server
6个回答
7
投票

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

Jenkinsfile
:

获得该信息
 properties ([
      buildDiscarder(logRotator(artifactNumToKeepStr: '5', daysToKeepStr: '15')),
      disableConcurrentBuilds()
    ])

编辑:

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


2
投票

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


1
投票

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

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

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

然后,Jenkins 一旦发现有新的提交被提交,就会自动触发构建(只要配置了 Jenkins-Git webhook)。

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

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

我希望这能让我们对此事有所了解。


0
投票

您表示您正在使用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/服务器/概述。请注意它如何表示您需要“至少需要 Bitbucket 服务器的 bitbucket-webhooks-plugin 的此提交”在 bitbucket 分支源插件文档中。我们正在使用它,我从未见过同一个推送通知触发两个构建。当您手动触发构建时,是的,但不是通过相同的推送通知。 :)


0
投票

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

Supress Automatic SCM Trigger Property

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

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


0
投票

当多分支管道配置为“发现分支”时,检查构建脚本是否没有额外的触发器。在我们的例子中,管道 Groovy 脚本中有一个

trigger
部分,有时会触发单独的构建:

pipeline {
    triggers {
        bitbucketPush()
    }
...

从 groovy 脚本中删除

trigger
部分会停止双重构建。

我知道这是一个老问题。希望这个答案能让其他人对检查内容有更多的了解。

© www.soinside.com 2019 - 2024. All rights reserved.