Jenkins Groovy - 检查作业是否正在等待可锁定资源

Jenkins Groovy - Check if job is waiting for lockable resource

如果作业当前正在等待可锁定资源释放,是否可以检查管道 groovy 脚本?

所以我的工作 运行,对于这个例子,“master”(多分支管道)当前处于这种状态:

Trying to acquire lock on [Label: <label-name>, Quantity: 1]
Found 0 available resource(s). Waiting for correct amount: 1.
[Label: <label-name>, Quantity: 1] is locked, waiting...

我想使用 groovy 脚本从不同的管道检测到这一点。我已经尝试使用以下示例脚本获取一些信息:

def resourceManager = org.jenkins.plugins.lockableresources.LockableResourcesManager.get()
def resourcesLockable = resourceManager.getResources().each{
  println(it)
  println(it.getBuildName())
  println("Locked: ${it.isLocked()}")
  println("Queued: ${it.isQueued()}")
  println("Reserved: ${it.isReserved()}")
}

def prId = "master"
def multibranch_project = Jenkins.instance.getAllItems(org.jenkinsci.plugins.workflow.multibranch.WorkflowMultiBranchProject).findAll{it.getDisplayName().equals('<multibranch-project-name>')}.get(0)
def prJobList = multibranch_project .getAllItems(org.jenkinsci.plugins.workflow.job.WorkflowJob).findAll{it.getDisplayName().trim().equals(prId.trim())}
def prJobRun = prJobList.get(0).builds
def resourcesFromBuild = resourceManager.getResourcesFromBuild(prJobRun.get(0))
println(resourcesFromBuild)
println(prJobRun.get(0).isBuilding())
println(prJobRun.get(0).isInProgress())
println(prJobRun.get(0).isLogUpdated())
println(prJobList.get(0).isInQueue())

所有可锁定资源(所有当前已锁定,由其他作业锁定)的输出始终说明:

构建“master”的输出是:

所以我无法区分master当前是否在等待锁,我只能看到所有资源都被锁定,但看不到master正在等待资源。

示例基于此 API 文档 https://javadoc.jenkins.io/plugin/lockable-resources/org/jenkins/plugins/lockableresources/LockableResourcesManager.html and https://javadoc.jenkins.io/plugin/lockable-resources/org/jenkins/plugins/lockableresources/LockableResource.html

也许有人知道如何实现这一目标。

好的,现在我找到了一个 hacky 解决方案来识别正在等待可锁定资源的构建。

我使用构建日志并对最后一行日志进行字符串比较。如果它等于“已锁定,正在等待...”,构建将等待资源。

这是我使用的代码:

Boolean waitingForAResource(build) {
  def logFile = build.getLogFile() //build = org.jenkinsci.plugins.workflow.job.WorkflowRun
  if (!logFile) {
    return false
  }
  def logLines = logFile.readLines()
  if (!logLines || logLines.size() == 0) {
    return false
  }

  def lastLine = logLines.takeRight(1).get(0)

  return lastLine.contains('is locked, waiting...')
}

我知道这可能会导致误报,但在我的管道中,我正在匹配的字符串短语从未在其他地方使用过。