You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jenkins多分支流水线并行运行死锁及BuildBlockerProperty配置问题

解决Jenkins多分支流水线并发死锁问题

我来帮你搞定这个多分支流水线的死锁难题——核心问题就是两条流水线同时占满节点,导致各自的Job都没法启动。下面给你几个实用的解决方案:

方案1:用Lockable Resources Plugin实现全局流水线互斥

这个插件是解决这类全局并发控制问题的首选,它能让你定义一个全局"锁",任何流水线必须先拿到锁才能执行,同一时间只有一条流水线能获取锁,其他的会自动排队等待。

操作步骤:

  1. 先在Jenkins插件管理里安装Lockable Resources Plugin
  2. 进入Jenkins全局配置页面,找到「Lockable Resources」选项,添加一个全局资源,比如命名为global_pipeline_exclusive_lock(名称自定义就行)
  3. 在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),可以通过限制该标签的并发数来实现全局控制:

  1. 进入Jenkins全局配置→「节点管理」,给两个节点都添加同一个标签(比如shared-build-node)
  2. 在Jenkinsfile里指定使用该标签的节点,并限制并发数:
    pipeline {
        agent { label 'shared-build-node' }
        options {
            // 限制该标签的流水线只能同时运行1条
            throttleConcurrentBuilds(
                maxPerNode: 1,
                maxTotal: 1
            )
        }
        stages { ... }
    }
    
    这个方法需要先安装Throttle Concurrent Builds Plugin。

总结

个人最推荐方案1(Lockable Resources Plugin),它逻辑清晰、配置简单,能精准控制全局流水线的并发,从根源上避免死锁问题。

内容的提问来源于stack exchange,提问作者jhojho-gino

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 10:05:51