Jenkins多分支流水线并行运行死锁及BuildBlockerProperty配置问题
解决Jenkins多分支流水线并发死锁问题
我来帮你搞定这个多分支流水线的死锁难题——核心问题就是两条流水线同时占满节点,导致各自的Job都没法启动。下面给你几个实用的解决方案:
方案1:用Lockable Resources Plugin实现全局流水线互斥
这个插件是解决这类全局并发控制问题的首选,它能让你定义一个全局"锁",任何流水线必须先拿到锁才能执行,同一时间只有一条流水线能获取锁,其他的会自动排队等待。
操作步骤:
- 先在Jenkins插件管理里安装Lockable Resources Plugin
- 进入Jenkins全局配置页面,找到「Lockable Resources」选项,添加一个全局资源,比如命名为
global_pipeline_exclusive_lock(名称自定义就行) - 在Jenkinsfile里添加锁指令:
- 如果你用的是声明式流水线:
pipeline { agent any options { // 获取全局锁,确保同一时间只有一条流水线执行 lock(resource: 'global_pipeline_exclusive_lock') } stages { stage('Checkout') { steps { checkout scm } } stage('Build') { steps { // 你的构建命令,比如Maven打包 sh 'mvn clean package' } } stage('Run Job') { steps { // 此时会有空闲节点可用,放心运行你的Job build 'your-target-job-name' } } } } - 如果是脚本式流水线:
// 先获取全局锁,再执行整个流水线逻辑 lock(resource: 'global_pipeline_exclusive_lock', inversePrecedence: true) { stage('Checkout') { checkout scm } stage('Build') { sh 'mvn clean package' } stage('Run Job') { build 'your-target-job-name' } }
- 如果你用的是声明式流水线:
方案2:正确配置Build Blocker Plugin
你之前的报错是因为把properties放在了options块里,这不符合声明式流水线的语法规则。properties是声明式流水线的顶层块,得单独写:
声明式流水线正确写法:
pipeline { agent any // 顶层properties块,专门用来配置Build Blocker属性 properties([ [$class: 'BuildBlockerProperty', blockLevel: 'GLOBAL', blockingJobs: '*', // 匹配所有流水线,阻止其他任何流水线并发执行 scanQueueFor: 'ALL', useBuildBlocker: true], disableConcurrentBuilds() ]) stages { // 你的流水线阶段代码 } }
如果是脚本式流水线,直接在开头调用properties()方法就行:
properties([ [$class: 'BuildBlockerProperty', blockLevel: 'GLOBAL', blockingJobs: '*', scanQueueFor: 'ALL', useBuildBlocker: true], disableConcurrentBuilds() ]) // 后续的流水线逻辑代码 stage('Checkout') { ... }
方案3:全局节点并发限制
如果你的两个节点都有同一个标签(比如build-agent),可以通过限制该标签的并发数来实现全局控制:
- 进入Jenkins全局配置→「节点管理」,给两个节点都添加同一个标签(比如
shared-build-node) - 在Jenkinsfile里指定使用该标签的节点,并限制并发数:
这个方法需要先安装Throttle Concurrent Builds Plugin。pipeline { agent { label 'shared-build-node' } options { // 限制该标签的流水线只能同时运行1条 throttleConcurrentBuilds( maxPerNode: 1, maxTotal: 1 ) } stages { ... } }
总结
个人最推荐方案1(Lockable Resources Plugin),它逻辑清晰、配置简单,能精准控制全局流水线的并发,从根源上避免死锁问题。
内容的提问来源于stack exchange,提问作者jhojho-gino
相关产品推荐
相关产品推荐

