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中显示来自插件的信息,但我还没有找到方法.
我有同样的问题,目前我用来查找子构建的解决方案是通过解析每个构建的控制台日志。日志包含触发的作业名称和构建编号(完成后)。
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)
一些注意事项:
归档时间: |
|
查看次数: |
2239 次 |
最近记录: |