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
相关产品推荐
相关产品推荐

