如何限制Jenkins多分支流水线的并发构建数量
Jenkins多分支流水线并发构建限制方案
你使用的properties([disableConcurrentBuilds()])仅能禁止单分支内部的并发构建,无法限制跨分支的总并发数,且你当前的资源锁逻辑是在构建启动后才执行,因此会出现构建先占用执行器、再等待锁释放的问题,可通过以下两种方案解决:
方案1:使用Throttle Concurrent Builds插件实现精准限流
- 先安装Jenkins官方插件「Throttle Concurrent Builds」
- 在Jenkinsfile的pipeline块之外添加限流配置,该配置会在任务进入调度队列时就做并发校验,未达并发上限才会分配执行器,从根源避免占用执行器空等的问题:
properties([ throttleJobProperty( // 自定义资源分类名,所有共享同一套测试资源的任务配置相同分类即可 categories: ['unit-test-resource-pool'], throttleEnabled: true, throttleOption: 'category', // 单节点并发数,0代表不限制 maxConcurrentPerNode: 0, // 全局最大并发数,按需调整为你需要的数值 maxConcurrentTotal: 3 ) ])
- 若需要针对不同分支设置不同的并发规则,可增加分支判断逻辑:
// 仅限制主干分支的并发数,特性分支可正常并行 if (env.BRANCH_NAME ==~ /(master|main|develop)/) { properties([ throttleJobProperty( categories: ['main-branch-test'], throttleEnabled: true, throttleOption: 'category', maxConcurrentTotal: 2 ) ]) }
方案2:调整Lockable Resources插件锁的配置(无需额外安装插件)
如果你当前已经在使用Lockable Resources插件做资源控制,可将锁逻辑移到pipeline的options块中,调度阶段就会先抢锁,没拿到锁不会分配执行器:
pipeline { agent any options { // 提前声明需要抢占的全局测试资源锁 lock(resource: 'unit-test-global-lock', quantity: 1) } stages { stage('单元测试') { steps { // 原有单元测试逻辑 } } } }
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

