当前位置: 首页 > 面试题库 >

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

西门磊
2023-03-14
问题内容

是否可以通过系统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();

}

我也可以像这样定位我感兴趣的工作:

def item = hudson.model.Hudson.instance.getItem("my_job");
println item.metaClass.methods*.name.sort().unique();

但是然后我将不得不遍历100多个(如果不是更多的话)构建,并询问每个构建是否正在运行。

必须有一种更容易/更好的方法来获取正在运行的构建列表。

关于如何通过System Groovy脚本(我写了其中的一些内容)执行各种操作的信息很多,但是我无法弄清楚如何获取正在运行的构建的列表:

您的问题含糊。有两种方法可以运行groovy脚本。.在控制台上运行Groovy的Groovy插件(.... / script)

以下是使用groovy控制台列出作业节点的信息

def item = hudson.model.Hudson.instance.getItem("createAndPublishSnapshot") 
def build = item.getLastBuild()

println build.isInProgress()
println build.getBuiltOn().getNodeName()

https://wiki.jenkins-
ci.org/display/JENKINS/Jenkins+Script+Console

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


问题答案:

我发现了几种不使用REST API或解析XML的方法:

runningBuilds = Jenkins.instance.getView('All').getBuilds().findAll() { it.getResult().equals(null) }

假设您尚未删除或修改Jenkins中的默认“全部”视图。当然,如果您确切知道构建将位于哪个视图中,则可以用其他视图名称代替。或者您可以尝试以下方法:

runningBuilds = Jenkins.instance.getItems().collect { job->
  job.builds.findAll { it.getResult().equals(null) }
}.flatten()

尽管此方法不需要视图名称,但它也有局限性。它不会下降到文件夹或多分支管道或类似的东西中。您需要手动下移到文件夹中,或者使用某种方法自动完成。例如,以下是适用于多分支管道的版本:

Jenkins.instance.getItemByFullName(multibranchPipelineProjectName).getItems().each { repository->
  repository.getItems().each { branch->
    branch.builds.each { build->
      if (build.getResult().equals(null)) {
        // do stuff here ...
      }
    }
  }
}

我认为可能有一种比build.getResult().equals(null)确定构建是否正在运行更准确的方法,但是我很难找到好的API文档,因此我不确定。这只是我发现使用对象自省的第一种方法。

再次由于缺少API文档,我不确定在Jenkins.instance.getItems()此使用的内容与Jenkins.instance.getAllItems()在此答案中使用的内容之间是否存在显着差异。

最后,请注意,这些都是效率相对较低的方法。它们会遍历每个作业的每个版本,因此,如果您保存很长的版本历史记录(默认设置是每个作业仅保存10个版本历史记录)或具有数千个作业,则可能需要一段时间才能运行。



 类似资料:
  • 问题内容: 我有一个时髦的脚本去推广代码。长话短说,我知道该脚本中的某个时间点是否成功。如果不成功,我想使构建失败。有什么办法使构建失败? 例: 在“执行Groovy脚本”插件中。您可以编写代码。 其中,“ checkPromote”根据促销的状态返回true或false值。 问题答案: 我认为,中止程序的最优雅方法是声明。

  • 问题内容: 我需要知道并杀死是否有运行指定PHP脚本的进程。是否有可能使用exec()和php脚本获取运行sample.php的进程的列表。 问题答案: 但是,只有在PHP以CGI模式运行时,这才起作用。如果它作为SAPI类型的东西运行,您将永远不会在进程列表中看到“ sample.php”,而只能看到“ httpd”。

  • 问题内容: 我正在使用groovy脚本获取当前正在运行的jenkins作业的构建状态,作为构建后的动作,如下所示: 现在,我想将“ result”变量的值发送到文件中的特定位置 既然我是groovy的新手,我对此并不了解,有没有办法像在shell脚本中那样做到这一点: 问题答案: 如果只想在文件中写一行,则可以使用下一个调用:

  • 我有一个时髦的脚本,可以推广代码。长话短说,我知道在那个脚本中的某个时间点它是否成功。如果不成功,我想使构建失败。有没有办法在时髦中失败构建? 示例: 在“执行 Groovy 脚本”插件中。您可以编写代码。 其中“checkPromote”根据升级的状态返回true或false值。

  • 问题内容: 我想使用jenkins API来获取有关我当前工作的信息。我可以找到有关上一个版本()的信息,但没有看到可以让我创建进度条的字段。我看到一个字段和一个字段,但是没有任何东西告诉我它已经运行了多长时间。 问题答案: 这是为我提供所需信息的URL: 产生如下内容:

  • 我有一个Jenkins部署作业,它从构建作业中复制工件。在我的部署作业中,我在Extensible Choice参数中使用了一个groovy脚本(见下文),在下拉列表中显示该构建作业的成功构建列表。我想增强groovy脚本,以便仅列出该构建作业中的成功构建。我该怎么做?