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

Jenkins lockable-resources插件实际用途与场景示例说明

Lockable Resources 插件核心作用

这个插件本质就是给Jenkins加了一套全局的资源排队锁机制,你可以把所有「不能同时被多个任务操作」的东西,不管是实体硬件还是逻辑上的配额/环境,都抽象成可锁定的资源,由插件统一调度谁能占用、谁要排队,从根源避免并发抢资源导致的各种问题。

先解答你好奇的「为什么资源列表里会有手机」

这根本不是什么奇怪的设计,移动端CI场景里实体测试机是最常用的锁对象之一:做自动化测试的时候,测试机是直接插在构建节点上的,一台手机同一时间只能装一个测试包、跑一套测试脚本,要是两个流水线任务同时往同一台手机上推包、调测试指令,不仅测试直接失败,还经常把手机上的测试环境搞挂,要人工重启恢复,当然需要加锁。

它到底锁什么,解决什么冲突

  • 它不锁定Jenkins本身的任何内部组件,所有可锁的资源都是你自己定义的:你只需要在插件配置页给资源起个名字、设好总数量就行,插件不会实际操作你对应的硬件/环境,只负责做「占用-排队-释放」的调度。
  • 解决的就是多个Jenkins任务并发操作同一个有限资源时,导致的任务失败、数据混乱、环境污染问题,锁的粒度可以细到你能想到的任意维度,比Jenkins自带的节点并发限制灵活得多。

几个最常见的实际使用场景

  • 实体硬件外设类:就是官方举例的打印机、测试手机、专用测试工控机这类。比如接在构建节点上的标签打印机,两个任务同时触发打印的话,不同任务的标签内容会混打,出来的面单/标识全是错的,给打印机建个单独的锁资源,打印前先拿锁,打完自动释放,就不会出问题。
  • 共享测试环境类:这是日常用得最多的场景,很多人以为这个插件只能锁硬件,其实80%的场景都是锁逻辑资源。比如你们团队只有一套集成测试环境的数据库,跑测试的时候会清空库、造专属测试数据,两个测试任务同时跑的话会互相改数据,两边的测试结果都不可信。你不需要去数据库层面做什么复杂配置,只要建一个名叫test-env-db的资源,所有跑集成测试的任务执行前先抢这个锁,抢到了才能操作数据库,跑完释放,问题直接解决。
  • 配额限制类:比如你们云账号的弹性IP配额只有10个,或者第三方测试接口的并发调用上限是5次/分钟,你可以直接在插件里建对应数量的同名资源,每个需要占配额的任务拿一个资源,占满了就自动排队,从Jenkins层就把配额卡死,不会出现超配额导致的调用失败。

最基础的用法示例

声明式流水线里直接用lock步骤包裹需要独占资源的逻辑就行,出了代码块范围锁会自动释放,不需要手动写释放逻辑:

pipeline {
    agent any
    stages {
        stage('iOS自动化测试') {
            steps {
                // 申请1台空闲的iOS测试机,最多等待15分钟,超时则任务失败
                lock(resource: 'ios-test-*', quantity: 1, timeout: 15) {
                    // 只有成功拿到锁之后,才会执行下面的测试步骤
                    sh 'ideviceinstaller -i ./build/app.ipa'
                    sh 'xcodebuild test -destination "id=${LOCKED_RESOURCE_NAME}"'
                }
                // 执行到这里锁已经自动释放,其他排队的任务可以抢占资源
            }
        }
    }
}

注意别把这个插件和Jenkins自带的节点并发数配置搞混:节点并发数只能控制单台构建节点上同时跑多少个任务,如果你的资源是跨节点共享的(比如全团队共用的一套测试环境、网络打印机),或者单台节点上接了多个同类型资源(比如一台构建服务器插了8台测试手机),节点并发限制根本做不到这么细的粒度,这时候就必须用Lockable Resources来做调度。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 10:21:39