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())
所有可锁定资源(所有当前已锁定,由其他作业锁定)的输出始终说明:
- 锁定:真
- 排队:假
- 保留:false
构建“master”的输出是:
- resourcesFromBuild:[](空列表)
- isBuildiung: true
- isInProgress: true
- isLogUpdating: true
- isInQueue: false
所以我无法区分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...')
}
我知道这可能会导致误报,但在我的管道中,我正在匹配的字符串短语从未在其他地方使用过。
如果作业当前正在等待可锁定资源释放,是否可以检查管道 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())
所有可锁定资源(所有当前已锁定,由其他作业锁定)的输出始终说明:
- 锁定:真
- 排队:假
- 保留:false
构建“master”的输出是:
- resourcesFromBuild:[](空列表)
- isBuildiung: true
- isInProgress: true
- isLogUpdating: true
- isInQueue: false
所以我无法区分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...')
}
我知道这可能会导致误报,但在我的管道中,我正在匹配的字符串短语从未在其他地方使用过。