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

Jenkins Groovy如何在Pipeline中检测作业是否等待lockable resource

Jenkins Pipeline检测作业是否等待lockable resource的实现方案

你现有的方法无法识别等待锁状态的核心原因是:作业只有成功拿到锁之后才会和LockableResource对象绑定,等待阶段不会出现在getResourcesFromBuild()的返回结果中;同时资源的isQueued()属性标记的是资源本身是否在待分配队列,和等待该资源的作业无关。

方案1:构建日志关键词匹配(实现最简单)

直接匹配正在运行的构建日志中的锁等待固定日志片段,实现成本最低,适合大多数场景。
示例代码:

def prId = "master"
def projectName = "<替换为你的多分支项目名>"
// 匹配等待锁的关键词,可根据实际日志调整
def lockWaitKeywords = ["Trying to acquire lock on", "is locked, waiting...", "Found 0 available resource(s)"]

// 获取目标构建
def multibranchProject = Jenkins.instance.getAllItems(org.jenkinsci.plugins.workflow.multibranch.WorkflowMultiBranchProject)
  .find { it.displayName == projectName }
def targetJob = multibranchProject.getAllItems(org.jenkinsci.plugins.workflow.job.WorkflowJob)
  .find { it.displayName.trim() == prId.trim() }
def latestRun = targetJob.lastBuild

// 判断是否在运行中且包含锁等待日志
def isWaitingForLock = false
if (latestRun?.isInProgress()) {
  // 只扫最近的500行日志,避免性能问题
  def logLines = latestRun.getLog(500)
  isWaitingForLock = logLines.any { line ->
    lockWaitKeywords.any { keyword -> line.contains(keyword) }
  }
}

println "master分支是否在等待锁:${isWaitingForLock}"
  • 优点:实现简单,不需要依赖插件未公开的内部API
  • 缺点:如果插件后续修改了日志输出格式,匹配规则需要同步调整

方案2:查询锁等待队列(准确性更高)

调用LockableResourcesManager的getQueuedRequests()方法获取所有正在等待锁的请求,直接匹配目标构建ID,该方法是插件公开的API,稳定性更高。
示例代码:

import org.jenkins.plugins.lockableresources.LockableResourcesManager

def prId = "master"
def projectName = "<替换为你的多分支项目名>"

// 获取目标构建
def multibranchProject = Jenkins.instance.getAllItems(org.jenkinsci.plugins.workflow.multibranch.WorkflowMultiBranchProject)
  .find { it.displayName == projectName }
def targetJob = multibranchProject.getAllItems(org.jenkinsci.plugins.workflow.job.WorkflowJob)
  .find { it.displayName.trim() == prId.trim() }
def latestRun = targetJob.lastBuild

def isWaitingForLock = false
if (latestRun?.isInProgress()) {
  def resourceManager = LockableResourcesManager.get()
  // 获取所有待处理的锁请求
  def queuedRequests = resourceManager.queuedRequests
  // 匹配请求对应的构建ID
  isWaitingForLock = queuedRequests.any { req ->
    req.executable?.id == latestRun.id
  }
}

println "master分支是否在等待锁:${isWaitingForLock}"
  • 优点:基于插件公开API实现,准确性高,不受日志格式变更影响
  • 注意事项:不同版本的lockable-resources插件中queuedRequests的返回对象字段可能有微小差异,升级插件后可做简单适配

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 19:24:02