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

Jenkins嵌套Stage锁获取报错:lock step必须传入代码块

解决Jenkins流水线lock报错及实现全局锁保护

错误原因

你遇到的java.lang.IllegalStateException: lock step must be called with a body,是因为Jenkins的lock步骤必须传入代码块(body),用来定义锁保护下要执行的逻辑。你当前只是调用了lock方法,但没有指定锁内执行的内容,所以触发了这个错误。

解决方案

要实现「Start QA阶段加锁,内部所有Stage执行完成后释放锁」的需求,你需要把Start QA下的所有嵌套Stage都包裹在lock的代码块中,而不是单独创建一个lock testbedStage。修改后的代码如下:

pipeline {
    agent { label 'tierra-devops-sjc-01' }
    environment {
        td3_device_label = ''
    }
    stages {
        stage('determine testbed') {
            steps {
                script {
                    load "/home/jenkins/DUT1.env"
                }
            }
        }
        stage('Start QA') {
            when {
                not { environment name: 'skip_qa', value: '1' }
            }
            steps {
                script {
                    // 将所有QA相关步骤包裹在lock的代码块内
                    lock(label: "${DUT_LABEL}", quantity: 1, variable: 'testbed') {
                        // 执行嵌套的QA步骤
                        stage ('step1') {
                            sh "echo step1"
                        }
                        stage ('step2') {
                            sh "echo step2"
                        }
                    }
                }
            }
        }
    }
}

修改说明

  1. 移除单独的lock testbedStage,把lock调用移到Start QA的steps中,用代码块包裹所有内部Stage逻辑
  2. lock代码块会确保其中所有步骤都在获取锁后执行,全部完成后自动释放锁
  3. 保留when条件,确保只有在不跳过QA时才尝试获取锁
  4. 去掉resource: null参数,lock步骤默认不需要该参数(若有特殊资源需求可再添加)

这样修改后,既能解决报错问题,也能实现你预期的锁保护逻辑。

内容的提问来源于stack exchange,提问作者darknight1906

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 12:17:14