有没有办法通过系统Groovy脚本获取Jenkins中的RUNNING构建列表?我尝试循环繁忙的执行程序,但是从执行程序对象,我无法获取构建对象:
def busyExecutors = Jenkins.instance.computers
.collect {
c -> c.executors.findAll { it.isBusy() }
}
.flatten() // reminder: transforms list(list(executor)) into list(executor)
busyExecutors.each { e ->
println('=====print out methods of executor object=======');
println e.metaClass.methods*.name.sort().unique();
}
Run Code Online (Sandbox Code Playgroud)
我也可以针对我感兴趣的JOB:
def item = hudson.model.Hudson.instance.getItem("my_job");
println item.metaClass.methods*.name.sort().unique();
Run Code Online (Sandbox Code Playgroud)
但是,我将不得不循环遍历100s(如果不是更多)构建并询问每个构建是否正在运行.
必须有一种更容易/更好的方法来获取正在运行的构建列表.
有很多关于如何通过System Groovy Scripts(我写的一些)做各种事情的信息,但我无法弄清楚如何获得正在运行的构建列表:
如何使用groovy在jenkins中获取当前正在运行的作业节点名称
https://wiki.jenkins-ci.org/display/JENKINS/Jenkins+Script+Console
我在不使用REST API或解析XML的情况下找到了几种方法:
runningBuilds = Jenkins.instance.getView('All').getBuilds().findAll() { it.getResult().equals(null) }
Run Code Online (Sandbox Code Playgroud)
这假设您没有删除或修改Jenkins中的默认"全部"视图.当然,如果您确切知道构建将在哪个视图中,则可以替换不同的视图名称.或者您可以尝试以下方法:
runningBuilds = Jenkins.instance.getItems().collect { job->
job.builds.findAll { it.getResult().equals(null) }
}.flatten()
Run Code Online (Sandbox Code Playgroud)
虽然这种方法不需要视图名称,但它也有局限性.它不会下降到文件夹或Multibranch Pipelines或类似的东西.您需要手动下载到文件夹或编辑某种方式自动执行它.例如,这是一个适用于Multibranch Pipeline的版本:
Jenkins.instance.getItemByFullName(multibranchPipelineProjectName).getItems().each { repository->
repository.getItems().each { branch->
branch.builds.each { build->
if (build.getResult().equals(null)) {
// do stuff here ...
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我认为可能有一个更准确的方法来build.getResult().equals(null)确定构建是否正在运行,但我找不到好的API文档,所以我不确定.这只是我发现使用对象内省工作的第一种方法.
再次由于缺乏API文档,我不确定Jenkins.instance.getItems()我在这里Jenkins.instance.getAllItems()使用的和本回答中使用的是否存在显着差异.
最后,请注意这些都是效率相对较低的方法.它们遍历每个作业的每个构建,因此如果您保存了很长的构建历史(默认设置是保存每个作业只有10个构建的历史记录)或者有数千个作业,这可能需要一段时间才能运行.请参阅如何使用Groovy有效地列出**Jenkins当前正在运行的所有**作业,以查询如何更有效地执行此任务的问题.