仅针对特定分支限制 Jenkins 并发构建

Limit Jenkins concurrent build only for specific branches

我一直在寻找如何做到这一点,我开始认为这是不可能的。每个与此类似的问题似乎都与限制某些节点 运行ning 或整个管道有关。

我们在 Jenkins 中有一个多分支管道,用于处理 PR 构建、暂存测试和生产发布。这三个中的每一个都是通过每个阶段的 when 选项处理的,因为区别在于是否 运行 或某些阶段。

虽然我希望能够为 PR 进行并发构建,因为我们可以打开许多需要更新的内容,但我们希望限制暂存测试的并发执行数量,因为我们需要进行一次暂存 运行到时候才能控制得当。

在以前的版本中,我们有几个不同的管道处理每个场景,但我们将其更新为只有一个多分支管道和 运行 一个场景或另一个场景,具体取决于正在考虑的分支。在之前的版本中,我们使用 disableConcurrentBuilds() 进行暂存测试构建,它运行良好,但使用此选项后,我们现在看到整个管道 运行 当时只有一个构建,这使得它非常慢完成 PR 构建。如果 PR 构建是 运行ning,因为不能并发 运行s,其余的 PR 只是等待它完成,以便下一个可以开始 运行ning。

有没有办法限制某些分支或每个分支的并发构建数量?这将允许我们仅对我们 运行 进行测试的分支禁用此功能,同时仍然能够 运行 同时为打开的 PRs

谢谢!

Jenkins UI 不允许您在 per-branch 的基础上指定它,但是如果您通过 jenkinsfile

配置作业是可能的
if(env.BRANCH_NAME.startsWith("develop")){
  properties([disableConcurrentBuilds()])
} else{
  properties([])
}

如果这对您来说太粗略了,因为您不希望多个分支同时到达测试或部署阶段,您可以使用locks and milestones尽可能允许并发,但只允许一个管道在通过给定阶段的时间

虽然前面的答案当然值得研究,但您也可以 fiddle 使用执行程序和标签来实现您想要的。

这是我的意思的一个例子:

    stage('Run Staging tests') {
        agent { node { label 'staging' }}
        when {
            expression { 
                return someCondition() 
                // analyse a branch and return true if need to run
            }
            beforeAgent true // evaluate the condition on master
        }
        steps {
            ...

如果只有一个节点带有标签 staging 并且该节点配置了一个执行程序,那么任何时候该节点上都只能 运行ning 一个作业。其他想要使用该标签的作业(大概是 运行 暂存测试)将等到上一个作业完成。其他不打算使用该标签的作业(因为不满足条件)将像往常一样在其他节点上简单地 运行,无需任何等待。