如何以编程方式列出 jenkins 作业脚本路径

Mik*_*peg 5 jenkins jenkins-groovy jenkins-pipeline jenkins-api

我想创建一个在 jenkins 控制台上运行的 groovy 脚本,以列出作业定义以及使用的存储库和脚本路径(jenkinsfile),输出如下:

作业名称 -> git 仓库 -> 脚本路径

到目前为止,我能够列出作业名称和 git 存储库,但找不到获取脚本路径的方法。它似乎没有包含在 GitSCM 插件中,但我找不到通过 WorkflowJob 获取它的方法。这是我当前的代码:

Jenkins.instance.getAllItems(Job.class).each{
  jobName = it.getName()
  if(it instanceof FreeStyleProject){
   return
  }
  scm = it.getTypicalSCM();
  if (scm instanceof hudson.plugins.git.GitSCM) {
    scm.getRepositories().each{
        it.getURIs().each{
            println(jobName +"-> "+ it.toString());
        }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

如何检索脚本路径?

the*_*ing 1

我找到了一种检索脚本路径的方法。我已经针对WorkflowJob测试了它。如果是本地脚本,以下代码将打印脚本本身;如果是远程脚本,则打印路径:

Jenkins.instance.getAllItems(Job) { job ->
   if(job instanceof WorkflowJob) {
       if(job.getDefinition() instanceof org.jenkinsci.plugins.workflow.cps.CpsFlowDefinition) {
           println("Local script: ")
           println(job.getDefinition().getScript())
       }
       else {
           println("Remote script path: " + job.getDefinition().getScriptPath())
       }
   }
}
Run Code Online (Sandbox Code Playgroud)

对于FreeStyleProject可以这样做:

   import hudson.tasks.Shell
   ...
   if(job instanceof hudson.model.FreeStyleProject) {
      println("Script: ")
      job.builders.findAll { it in Shell }.collect { shell -> println(shell.command) }
   }
Run Code Online (Sandbox Code Playgroud)

我仍然没有找到多分支管道的方法,但由于它们由WorkflowJob组成,因此一些额外的努力可能会给出想要的结果。

注意:除了使用getScriptPath()函数之外,还可以使用属性scriptPath 。有时job.getDefinition()返回SCMBinder类型的对象,该对象没有getScriptPath()方法,但可以在其中使用该属性。