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

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:

  1. 当两个构建几乎同时进入lock步骤时,首个构建在创建锁资源的过程中,还未完成资源的持久化存储,第二个构建就已检查资源是否存在,此时会误判资源不存在并创建同名的新资源,导致两个构建各自持有“同名但实际不同实例”的锁,进而同时执行。
  2. 首个构建日志无锁相关输出,是因为插件在资源创建的竞态过程中,跳过了锁操作的日志输出,且未正确获取锁就直接执行了后续代码。

解决方案

  • 升级Lockable Resources插件:该竞态问题在插件2.19及以上版本已修复,升级到最新稳定版本即可解决。
  • 预创建锁资源:在Jenkins全局配置的「Lockable Resources」页面手动创建名为Stage 1的锁资源,避免构建时动态创建资源引发的竞态。
  • 优化触发逻辑:给Webhook触发添加1秒左右的延迟,或在流水线入口添加sleep(1)的短暂等待,降低并发触发时的竞态概率。
  • 验证全局并发控制:确认disableConcurrentBuilds()是否生效——该属性是阻止整个流水线的并发执行,而非单个Stage。可检查流水线的「General」配置中是否勾选了「Do not allow concurrent builds」,若未生效会加剧锁的竞态问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 17:45:29