如何通过groovy脚本获取运行jenkins构建的列表?

gra*_*aii 11 groovy jenkins

有没有办法通过系统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

https://gist.github.com/dnozay/e7afcf7a7dd8f73a4e05

如何让詹金斯/哈德森的工作监视其他一些工作,并决定是否建立?

jay*_*ren 9

我在不使用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当前正在运行的所有**作业,以查询如何更有效地执行此任务的问题.