2015-10-13 15 views
8

Ich habe ein Jenkins-Projekt konfiguriert (ich nenne es SuperJob hier), einfach mehrere andere jenkins-Projekte in Auftrag zu rufen.Get SubProject Builds über Jenkins API

ich das Ergebnis aller Teilprojekte für eine bestimmte Build-Nummer dieses Superjobs durch Jenkins API herausfinden können, möchte

auf dem Code der Suche posted HERE Ich bin in der Lage, die Liste der spezifischen zu bekommen Projekte, die im SuperJob-Projekt von jedem Build aus konfiguriert wurden, ich kann jedoch nicht herausfinden, welche spezifische Build-Nummer jedes dieser Projekte von einem bestimmten Build von SuperJob ausgeführt wurde.

Zum Beispiel würde Ich mag, um herauszufinden, dass „Superjob build # 5“ ausgelöst „MyJob build # 3“ und so kann ich aggregiert und überprüfen Sie die Ergebnisse für alle von ihnen „OtherJob # 20 bauen“.

Ich habe alle Upstream und Downstream-APIs einschließlich der Verwendung der Unterprojekte als ein Argument für die Verwandtschaft getestet, aber sie alle leer oder Null zurückgeben.

Ich vermute, dass dies möglich ist, da Jenkins selbst in der Lage ist, diese Informationen in dem Web-Browser zu zeigen, die von einem Plugin kommen, aber ich habe nicht in der Lage gewesen, wie zu erfahren.

+0

Bin ich wirklich die einzige Person mit einem solchen Problem? Oder vielleicht ist es so einfach Ich vermisse etwas – ByteFlinger

+0

Nein, vor ein paar Minuten habe ich die gleiche Frage gestellt ..) Ich muss die Kette von Builds durch REST API abrufen. – Nakilon

+0

Gut Jenkins ist offensichtlich in der Lage, die richtigen Informationen zu erhalten, denn wenn ich den SuperJob so konfiguriere, dass er sofort fehlschlägt, zeigt jenkins nur diejenigen an, die in der Liste gelaufen sind, aber mit der API bekommst du am Ende einen Build, der nicht zu diesem spezifischen Super-Job gehört Build – ByteFlinger

Antwort

2

Ich habe das gleiche Problem, und derzeit die Lösung, die ich benutze, um Sub-Builds zu finden, ist durch das Konsolenprotokoll jedes Build zu analysieren. Das Protokoll enthält die Namen der ausgelösten Jobs und die Build-Nummern (nachdem sie beendet wurden).

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 
} 

Ein paar Anmerkungen:

  1. Sie überprüfen müssen, dass die Regex habe ich für alle Ihre Fälle geeignet ist, natürlich kann man es sich auf ein Verfahren ändern, die für ein paar andere prüft Regex passt.
  2. Wenn Sie multijob plugin verwenden und alle Ihre Jobs von diesem Typ sind, ist es viel einfacher, da MultijobBuild eine getSubBuilds() hat, die genau das zurückgibt, was Sie wollen.
  3. Ich bin immer noch auf der Suche nach einer besseren Möglichkeit, Sub Builds zu finden, die von einem Build ausgelöst werden, insbesondere wenn Builds in allen Zuständen zurückgegeben werden können, fertig sind oder noch erstellt werden.
+0

Vielen Dank für die Freigabe.Ich hoffe, dass das Parsen der Protokolle nicht die einzige Möglichkeit ist, diese Informationen zu erhalten. Wenn dies der Fall ist, denke ich, dass wir möglicherweise ein Verbesserungsticket mit Jenkins aufstellen müssen, da eine solche API nicht fehlen sollte. – ByteFlinger

+0

Eine andere Option, die ich gefunden habe, um https://github.com/jenkinsci/downstream-buildview-plugin zu verwenden. Dieses Plugin fügt jedem Build mithilfe von DownstreamBuildViewRunListener eine DownstreamBuildViewAction hinzu. Dann verwenden Sie die DownstreamBuildViewAction, die Methoden wie folgt hat: public int getDownstreamBuildNumber (String projectName) und öffentliche List getDownstreamBuildList(). –

Verwandte Themen