Jenkins流水线Stage锁未生效问题求助
问题描述
环境信息
- Jenkins版本:2.319.3
- Lockable Resources插件版本:2.18
我有一个基于Webhook触发的Jenkins流水线,因触发频率高,为某Stage添加了锁以避免多构建同时执行,但发现该锁偶发失效,多构建仍会同时运行。流水线代码如下:
node("Windows_Server") { properties([disableConcurrentBuilds()]) stage("Setup") { some stuff... } // end 'Setup' stage stage("Stage 1") { lock("Stage 1") { withCredentials(some stuff...) } // end lock } // end stage } // end node
两次构建启动时间仅相差约0.5秒,首个构建的日志中未出现锁相关操作:
[Pipeline] // stage [Pipeline] stage [Pipeline] { (Stage 1) [Pipeline] withCredentials some stuff...
第二个构建的日志显示:
[Pipeline] // stage [Pipeline] stage [Pipeline] { (Stage 1) [Pipeline] lock Trying to acquire lock on [Stage 1] Resource [Stage 1] did not exist. Created. Lock acquired on [Stage 1] [Pipeline] { [Pipeline] withCredentials some stuff...
Blue Ocean显示两个构建的该Stage启动时间仅差数毫秒,分别为[2023-01-25T21:39:34.917Z]和[2023-01-25T21:39:35.040Z]。
请问为何首个构建未设置锁,或已设置但第二个构建未识别到?
问题分析与解决
核心原因
这是Lockable Resources插件2.18版本在高并发触发场景下的竞态条件Bug:
- 当两个构建几乎同时进入
lock步骤时,首个构建在创建锁资源的过程中,还未完成资源的持久化存储,第二个构建就已检查资源是否存在,此时会误判资源不存在并创建同名的新资源,导致两个构建各自持有“同名但实际不同实例”的锁,进而同时执行。 - 首个构建日志无锁相关输出,是因为插件在资源创建的竞态过程中,跳过了锁操作的日志输出,且未正确获取锁就直接执行了后续代码。
解决方案
- 升级Lockable Resources插件:该竞态问题在插件2.19及以上版本已修复,升级到最新稳定版本即可解决。
- 预创建锁资源:在Jenkins全局配置的「Lockable Resources」页面手动创建名为
Stage 1的锁资源,避免构建时动态创建资源引发的竞态。 - 优化触发逻辑:给Webhook触发添加1秒左右的延迟,或在流水线入口添加
sleep(1)的短暂等待,降低并发触发时的竞态概率。 - 验证全局并发控制:确认
disableConcurrentBuilds()是否生效——该属性是阻止整个流水线的并发执行,而非单个Stage。可检查流水线的「General」配置中是否勾选了「Do not allow concurrent builds」,若未生效会加剧锁的竞态问题。
内容的提问来源于stack exchange,提问作者jerdub1993
相关产品推荐
相关产品推荐

