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

如何在Jenkins两个作业间传递资源锁且不释放?

Jenkins作业间传递资源锁的实现方案

针对你提出的需求——在JobA锁定device-1后调用JobB修复设备,且全程不释放锁,同时解决阶段自动释放锁的问题,以下是几种可行的实现方式:

1. 利用Lockable Resources插件的可传递锁功能

这是最直接的方案,该插件支持将锁在父子作业间传递,且能控制锁的释放时机。

核心配置与Pipeline示例

JobA Pipeline(锁发起方)

pipeline {
    agent any
    stages {
        stage('操作设备并检查状态') {
            steps {
                // 开启可传递锁,锁会在整个代码块内保持,包括调用JobB期间
                lock(resource: 'device-1', transferable: true) {
                    script {
                        // 模拟设备状态检查
                        def deviceStatus = 'failed'
                        if (deviceStatus == 'failed') {
                            // 调用JobB并传递锁标识
                            build job: 'JobB', 
                                  parameters: [string(name: 'TARGET_RESOURCE', value: 'device-1')],
                                  wait: true
                        }
                        // 锁仍持有,执行后续操作
                        echo "继续在JobA中使用device-1"
                    }
                }
            }
        }
    }
}

JobB Pipeline(锁接收方)

pipeline {
    agent any
    parameters {
        string(name: 'TARGET_RESOURCE', defaultValue: '', description: '需传递的锁定资源名')
    }
    stages {
        stage('修复故障设备') {
            steps {
                // 接收传递的锁,继续持有该资源
                lock(resource: params.TARGET_RESOURCE, transferable: true) {
                    echo "正在修复device-1..."
                    // 执行修复逻辑
                    // repairDevice()
                }
            }
        }
    }
}

关键说明

  • transferable: true是核心参数,开启后锁可以在调用其他作业时保持持有状态,不会在阶段结束或作业调用节点释放。
  • 确保Lockable Resources插件版本≥11.0,该参数是较新版本引入的。

2. 规避阶段自动释放锁的技巧

默认情况下Jenkins会在阶段结束后释放锁,解决这个问题的核心是将需要保持锁的多个阶段包裹在同一个lock代码块内,而非每个阶段单独加锁:

pipeline {
    agent any
    stages {
        lock(resource: 'device-1', transferable: true) {
            stage('设备检查') {
                steps {
                    echo "检查device-1状态"
                }
            }
            stage('触发修复') {
                steps {
                    build job: 'JobB', parameters: [string(name: 'TARGET_RESOURCE', value: 'device-1')], wait: true
                }
            }
            stage('后续操作') {
                steps {
                    echo "锁仍持有,执行后续任务"
                }
            }
        }
    }
}

这种方式下,锁会在整个包裹的阶段序列执行完成后才释放,避免了阶段间的锁丢失。

3. 自由风格作业的配置方式

如果使用自由风格作业而非Pipeline,可按以下步骤配置:

  • 在JobA的构建步骤中,添加“Lock resources”步骤,选择device-1,并勾选Keep lock while building other projects选项。
  • 在JobA中添加“Build other projects”步骤,选择JobB,并传递device-1作为参数。
  • 在JobB的构建步骤中,添加“Lock resources”步骤,使用传入的参数指定device-1,同样勾选保持锁的选项。

注意事项

  • 避免循环调用:如果JobB又调用JobA,可能导致死锁,需添加超时机制或锁释放逻辑。
  • 全局资源可见性:确保device-1配置为全局资源(而非节点专属资源),否则跨节点作业无法传递锁。
  • 异常处理:在锁代码块内添加try-catch逻辑,避免因作业异常导致锁永久占用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 09:35:02