如何限制Jenkins并发多分支管道构建?

irlmq6kh  于 2022-10-06  发布在  Jenkins
关注(0)|答案(5)|浏览(326)

我正在考虑在Jenkins中将并发构建的数量限制在特定数量,利用多分支管道工作流,但在Docs或Google中还没有找到任何好的方法来做到这一点。

一些文档说这可以在Jenkinsfile的stage步骤中使用并发来完成,但我也read elsewhere认为这是一种不推荐使用的方法。

看起来最近有something released用于通过Job Properties限制并发性,但我找不到它的文档,并且我在遵循代码时遇到了问题。我发现的唯一一件事是PR显示以下内容:

properties([concurrentBuilds(false)])

但我很难让它工作起来。

有没有人知道或有一个很好的例子来说明如何限制给定的多分支项目的并发构建数量?也许是一个Jenkinsfile片段,它展示了如何限制或限制多分支并发构建的数量?

h5qlskok

h5qlskok1#

找到了我要找的东西。您可以使用Jenkinsfile中的以下块限制并发构建。

node {
  // This limits build concurrency to 1 per branch
  properties([disableConcurrentBuilds()])

  //do stuff
  ...
}

使用声明性语法也可以实现同样的目的:

pipeline {
    options {
        disableConcurrentBuilds()
    }
}
ie3xauqp

ie3xauqp2#

使用Lockable Resources插件(GitHub)可以限制并发构建或阶段。我总是使用这种机制来确保不会同时执行任何发布/发布步骤,而可以同时构建正常的阶段。

echo 'Starting'
lock('my-resource-name') {
  echo 'Do something here that requires unique access to the resource'
  // any other build will wait until the one locking the resource leaves this block
}
echo 'Finish'
czq61nw1

czq61nw13#

正如@VadminKotov指出的,也可以禁用使用Jenkins声明性管道的并发构建:

pipeline {
    agent any
    options { disableConcurrentBuilds() }
    stages {
        stage('Build') {
            steps {
                echo 'Hello Jenkins Declarative Pipeline'
            }
        }
    }
}

disableConcurrentBuilds

不允许并行执行管道。可用于防止同时访问共享资源等。例如:options { disableConcurrentBuilds() }

yqyhoc1h

yqyhoc1h4#

谢谢Jazzschmidt,我希望轻松锁定所有阶段,这对我很有效(source)

pipeline {
  agent any
  options {
    lock('shared_resource_lock')
  }
  ...
  ...
}
lhcgjxsq

lhcgjxsq5#

我也得到了多分支锁定的解决方案,使用可解锁的资源插件,这里的共享库是:

Jenkins文件:

@Library('my_pipeline_lib@master') _
myLockablePipeline()

MyLockablePipeline.groovy:

call(Map config){
        def jobIdentifier = env.JOB_NAME.tokenize('/') as String[];

        def projectName = jobIdentifier[0];
        def repoName = jobIdentifier[1];
        def branchName = jobIdentifier[2];

        //now you can use either part of the jobIdentifier to lock or 
    limit the concurrents build
        //here I choose to lock any concurrent build for PR but you can choose all

        if(branchName.startsWith("PR-")){
           lock(projectName+"/"+repoName){
              yourTruePipelineFromYourSharedLib(config);
           }
        }else{
           // Others branches can freely concurrently build
           yourTruePipelineFromYourSharedLib(config);
        }
}

要锁定所有分支,只需在myLockablePipeline.groovy中执行以下操作:

call(Map config){

def jobIdentifier = env.JOB_NAME.tokenize('/') as String[];

def projectName = jobIdentifier[0];
def repoName = jobIdentifier[1];
def branchName = jobIdentifier[2];

 lock(projectName+"/"+repoName){
    yourTruePipelineFromYourSharedLib(config);
 }
}

相关问题