Jenkins:多分支流水线disableConcurrentBuilds不生效,需单次仅执行一个构建
解决多分支流水线全局单构建限制的方案
我来帮你搞定这个多分支流水线的并发控制问题!首先得明确:你当前配置里的disableConcurrentBuilds()只能限制单个分支自己不能同时跑多个构建,但多分支项目里不同分支是独立的作业,所以它管不了跨分支的并发——这就是问题的核心所在!结合你说的「代理还有其他作业在不同工作区运行,不能设单执行器」的前提,给你推荐两个靠谱的方案:
方案一:用Throttle Concurrent Builds插件全局限制
你已经在使用这个插件了,只要稍微调整配置就能实现全局单构建:
全局配置类别:
进入Jenkins的「全局配置」,找到「Throttle Concurrent Builds」板块,添加一个新的类别(比如叫MultiBranchGlobalLock),把「Maximum concurrent builds for this category」设为1。修改流水线脚本:
在你的properties里更新ThrottleJobProperty的配置,指定刚才创建的类别,让整个多分支项目的所有分支都归到这个类别下受限制:properties([ disableConcurrentBuilds(), // 先保证单个分支自身不并发 gitLabConnection('Gitlab'), [$class: 'RebuildSettings', autoRebuild: false, rebuildDisabled: true], [$class: 'JobRestrictionProperty'], [$class: 'ThrottleJobProperty', categories: ['MultiBranchGlobalLock'], // 绑定全局限制类别 limitOneJobWithMatchingParams: false, maxConcurrentPerNode: 0, // 0表示使用全局配置的数值 maxConcurrentTotal: 0, throttleEnabled: true, throttleOption: 'category'] // 指定按类别限流 ])
方案二:用Lockable Resources插件实现全局锁
这个插件的逻辑更直观:创建一个全局的「锁资源」,所有分支的构建都必须先拿到这个锁才能运行,没拿到的就排队等待。
安装并配置锁资源:
- 先在Jenkins插件市场安装「Lockable Resources Plugin」
- 进入「全局配置」,找到「Lockable Resources」板块,添加一个新资源(比如叫
SingleMultiBranchBuildLock),把「Quantity」设为1(表示同一时间只能有一个构建使用这个锁)
修改流水线脚本:
用lock块把你的整个构建逻辑包裹起来,确保只有拿到锁的构建才能执行:properties([ gitLabConnection('Gitlab'), [$class: 'RebuildSettings', autoRebuild: false, rebuildDisabled: true], [$class: 'JobRestrictionProperty'] ]) // 全局锁:所有分支的构建都必须先拿到这个锁才能继续 lock(resource: 'SingleMultiBranchBuildLock', inversePrecedence: false) { stage('Checkout') { checkout scm } stage('Build') { sh 'mvn clean package' // 替换成你的构建命令 } // 后续的测试、部署等阶段都要放在lock块里 }
注意事项
- 方案一的
Throttle插件适合已经在使用它的场景,配置起来无缝衔接; - 方案二的
Lockable Resources更灵活,你还可以给不同的多分支项目设置不同的锁,互不干扰; - 不管用哪个方案,都要确保所有关键构建步骤都被限制逻辑覆盖,避免出现部分步骤不受控的情况;
- 如果构建被中止或失败,插件都会自动释放锁/限流配额,不用担心死锁问题。
内容的提问来源于stack exchange,提问作者Milan
相关产品推荐
相关产品推荐

