我配置了一个 Jenkins 项目(我在这里称之为 SuperJob)来简单地按顺序调用几个不同的其他 jenkins 项目。
我希望能够通过 Jenkins API 找出该 SuperJob 特定构建号的所有子项目的结果
查看发布的代码HERE我能够从每个构建中获取 SuperJob 项目中配置的特定项目的列表,但是我无法找到一种方法来查询从 SuperJob 的特定构建运行的每个项目的特定构建号。
例如,我想知道“SuperJob build #5”触发了“MyJob build #3”和“OtherJob build #20”,这样我就可以汇总并检查所有结果。
我已经尝试了所有上游和下游 API,包括使用子项目作为关系项目的参数,但它们都返回空或 null。
我猜这是可能的,因为 Jenkins 本身能够在 Web ui 中显示来自插件的信息,但我无法找出如何实现。
我有同样的问题,目前我用来查找子构建的解决方案是通过解析每个构建的控制台日志。日志包含触发的作业名称和构建编号(完成后)。
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
}
一些注意事项:
- 您需要检查我使用的正则表达式是否适合您的所有情况,当然您可以将其更改为检查其他一些正则表达式匹配的方法。
- 如果您使用多作业插件,并且您的所有作业都来自该类型,那么会更容易,因为 MultijobBuild 有一个 getSubBuilds() ,它可以准确返回您想要的内容。
- 我仍在寻找一种更好的方法来查找给定构建触发的子构建,特别是如果它可以返回所有状态(已完成或仍在构建)的构建。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)