【问题标题】:Getting SubProject Builds via Jenkins API通过 Jenkins API 获取子项目构建
【发布时间】:2018-12-07 01:21:37
【问题描述】:

我配置了一个 Jenkins 项目(这里我将其称为 SuperJob)以简单地按顺序调用几个不同的其他 jenkins 项目。

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

查看HERE 发布的代码,我能够从每个构建中获取 SuperJob 项目中配置的特定项目的列表,但是我无法找到查询每个这些项目的具体构建号的方法是从 SuperJob 的特定版本运行的。

例如,我想知道“SuperJob build #5”触发了“MyJob build #3”和“OtherJob build #20”,因此我可以汇总并检查所有结果。

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

我猜这是可能的,因为 Jenkins 本身能够在 web ui 中显示来自插件的信息,但我无法找出如何。

【问题讨论】:

  • 真的只有我一个人有这样的问题吗?或者也许它太简单了我错过了一些东西
  • 不,几分钟前我遇到了同样的问题..)我需要通过 REST API 检索构建链。
  • 那么 Jenkins 显然能够检索到正确的信息,因为当我将 SuperJob 配置为在其中一个子作业失败时立即失败时,jenkins 将只显示列表中已运行的那些但是使用API,您最终将获得一个不属于该特定超级作业构建的构建
  • 一些用于这些检索的本机 Jenkins Java 代码可通过谷歌搜索。但是通过 REST API,我只看到反向连接是“由上游构建引起的......”,而不是相反的方向。这告诉我刮掉所有下游构建以找到一个,它可能是 DDOS 或需要某种缓存,仅在“完成”构建时才有效......对于这样简单的问题来说,这太复杂了...... (
  • 我刚刚提交了issues.jenkins-ci.org/browse/JENKINS-33001。希望这将得到修复,或者在某个时候包含一个解决方法。与此同时,我想只是赞成这个问题

标签: jenkins continuous-integration jenkins-plugins


【解决方案1】:

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

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
}

一些注意事项:

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

【讨论】:

  • 谢谢分享。我真诚地希望解析日志不是检索此信息的唯一方法。如果是这种情况,我认为我们可能需要向 Jenkins 提交增强票,因为这样的 API 不应该丢失
  • 另一个选项我发现它使用 github.com/jenkinsci/downstream-buildview-plugin 。此插件使用 DownstreamBuildViewRunListener 为每个构建添加一个 DownstreamBuildViewAction。然后你使用获取 DownstreamBuildViewAction ,它的方法如下: public int getDownstreamBuildNumber(String projectName) 和 public List getDownstreamBuildList().
  • 我在这里尝试了一种方法:stackoverflow.com/questions/50071652/… 并且有效!
【解决方案2】:

如果您有 Jenkins 服务器 URL、作业名称和作业编号,则可以将这些值交换为这样的请求:

https://<jenkins server URL>/view/all/job/<job name>/<job number>/api/json?pretty=true&tree=actions[triggeredBuilds[number,url,result]]

这会给你一个这样的 JSON 响应:

{
  "_class" : "hudson.model.FreeStyleBuild",
  "actions" : [
    {
      "_class" : "hudson.model.CauseAction"
    },
    {

    },
    {
      "_class" : "hudson.model.ParametersAction"
    },
    {

    },
    {
      "_class" : "hudson.plugins.git.util.BuildData"
    },
    {
      "_class" : "hudson.plugins.git.GitTagAction"
    },
    {

    },
    {
      "_class" : "hudson.plugins.parameterizedtrigger.BuildInfoExporterAction",
      "triggeredBuilds" : [
        {
          "_class" : "hudson.model.FreeStyleBuild",
          "number" : <subjob number>,
          "result" : "SUCCESS",
          "url" : "https://<jenkins server URL>/job/<subjob name>/<subjob number>/"
        },
        {
          "_class" : "hudson.model.FreeStyleBuild",
          "number" : <subjob number>,
          "result" : "SUCCESS",
          "url" : "https://<jenkins server URL>/job/<subjob name>/<subjob number>/"
        }
      ]
    },
    {

    },
    {

    },
    {

    }
  ]
}

【讨论】:

  • 请注意,这似乎并不报告正在进行的构建,只报告已达到完成状态的构建
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-09
  • 2021-08-08
相关资源
最近更新 更多