通过Jenkins API获取SubProject构建

Ale*_*rio 8 continuous-integration jenkins jenkins-plugins

我有一个Jenkins项目配置(我在这里称之为SuperJob),只需按顺序调用几个不同的其他jenkins项目.

我希望能够通过Jenkins API找到这个SuperJob的特定内部版本号的所有子项目的结果

查看此处发布的代码,我可以从每个构建中获取SuperJob项目中配置的特定项目的列表,但是我无法找到一种方法来查询从特定项目运行的每个项目的具体构建号SuperJob的构建.

例如,我想知道"SuperJob build#5"触发了"MyJob build#3"和"OtherJob build#20",所以我可以汇总并检查所有这些的结果.

我已经尝试了所有的上游和下游API,包括使用子项目作为关系的参数,但它们都返回空或null.

我猜这是可能的,因为詹金斯本身能够在网络ui中显示来自插件的信息,但我还没有找到方法.

Tid*_*ach 3

我有同样的问题,目前我用来查找子构建的解决方案是通过解析每个构建的控制台日志。日志包含触发的作业名称和构建编号(完成后)。

import hudson.console.ConsoleNote;
jenkins = Jenkins.getInstance()
jobName = "root-job-name"     //just an example
buildNumber = 123             //just an example
job = jenkins.getItem(jobName)
startBuild = job.getBuildByNumber(buildNumber)

//scanning the tree using BFS
list = []
visitedList = []
q = list as java.util.Queue
q<<startBuild
visitedList.add(startBuild)
while (!q.empty){
   node = q.poll()

  subjobs = getTriggeredBuildssByBuild(node) //see method bellow
  subjobs.each{ subj ->
      if (!(subj in visitedList)){
          visitedList.add(subj)
          q<<subj
      }
  }
}

//printing results
visitedList.each{
    println "Job name and build number: ${it}"
}


//parsing the log of the Run object to get sub builds triggered by it
def getTriggeredBuildssByBuild(def run){
    list =[]
    if (run != null && ((reader = run.getLogReader()) != null)) {

        BufferedReader bufferedReader = new BufferedReader(reader);

        for (String line = bufferedReader.readLine();
            line != null;
            line = bufferedReader.readLine()) {

            //strip off jenkins specific encoding
            line = ConsoleNote.removeNotes(line);
            matcher = line=~/Finished Build : #(\d+) of Job : (.*) with/
            if(matcher){
               foundJob = matcher[0][2]
               foundBuildNum = Integer.parseInt(matcher[0][1])
               foundBuild=jenkins.getItem(foundJob).getBuildByNumber(foundBuildNum)
               list.add(foundBuild)
            }
        }
    }
return list
}
Run Code Online (Sandbox Code Playgroud)

一些注意事项:

  1. 您需要检查我使用的正则表达式是否适合您的所有情况,当然您可以将其更改为检查其他一些正则表达式匹配的方法。
  2. 如果您使用多作业插件,并且您的所有作业都来自该类型,那么会更容易,因为 MultijobBuild 有一个 getSubBuilds() ,它可以准确返回您想要的内容。
  3. 我仍在寻找一种更好的方法来查找给定构建触发的子构建,特别是如果它可以返回所有状态(已完成或仍在构建)的构建。