首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过Jenkins API获取SubProject构建

通过Jenkins API获取SubProject构建
EN

Stack Overflow用户
提问于 2015-10-13 22:09:13
回答 2查看 3.8K关注 0票数 9

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

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

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

例如,我想找出"SuperJob build #5“触发了"MyJob build #3”和"OtherJob build #20“,这样我就可以聚合并检查所有这些结果。

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

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

EN

回答 2

Stack Overflow用户

发布于 2016-01-14 16:39:38

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

代码语言:javascript
复制
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. 如果您使用多任务插件,并且您的所有作业都来自该类型,则它会简单得多,因为MultijobBuild有一个getSubBuilds(),它可以精确地返回您想要的内容。
  3. 我仍然在寻找一种更好的方法来查找由给定生成触发的子生成,特别是如果它可以返回所有状态下的生成,已完成或仍在生成。
票数 2
EN

Stack Overflow用户

发布于 2018-12-07 01:21:38

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

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

这将为您提供如下的JSON响应:

代码语言:javascript
复制
{
  "_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>/"
        }
      ]
    },
    {

    },
    {

    },
    {

    }
  ]
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33104913

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档