2015-10-13 7 views
8

Ho configurato un progetto Jenkins (che chiamerò qui SuperJob) per chiamare semplicemente diversi altri progetti jenkins in ordine.Ottenere build SubProject tramite l'API Jenkins

Mi piacerebbe essere in grado di scoprire il risultato di tutti i sottoprogetti per uno specifico numero di build di questo SuperJob attraverso Jenkins API

Guardando il codice postato HERE sono in grado di ottenere l'elenco delle specifiche i progetti configurati nel progetto SuperJob da ogni build tuttavia non sono in grado di trovare un modo per interrogare quale specifico numero di build di ciascuno di questi progetti sono stati eseguiti da una build specifica di SuperJob.

Ad esempio, vorrei scoprire che "SuperJob build # 5" ha attivato "MyJob build # 3" e "OtherJob build # 20" in modo da poter aggregare e controllare i risultati per tutti loro.

Ho provato tutte le API Upstream e Downstream incluso l'utilizzo dei sottoprogetti come argomento per le relazioni esistenti ma restituiscono tutti vuoti o nulli.

Immagino che sia possibile poiché Jenkins stessa è in grado di mostrare quell'informazione nel web ui che proviene da un plugin ma non sono stato in grado di scoprire come.

+0

Sono davvero l'unica persona con un tale problema? O forse è così semplice che mi manca qualcosa – ByteFlinger

+0

No, pochi minuti fa ho affrontato la stessa domanda ..) Ho bisogno di recuperare la catena di build tramite API REST. – Nakilon

+0

Beh, Jenkins è ovviamente in grado di recuperare le informazioni corrette perché quando configuro SuperJob fallire immediatamente quando uno dei sub lavori fallisce, jenkins mostrerà solo quelli che sono stati eseguiti nella lista, ma usando l'API si finirà per ottenere un build che non appartiene a quella specifica build di super-lavoro – ByteFlinger

risposta

2

Ho lo stesso problema, e attualmente la soluzione che utilizzo per trovare le sotto compilazioni, è analizzando il log della console di ogni build. il log contiene i nomi dei lavori attivati ​​e i numeri delle build (dopo aver completato).

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 
} 

Alcune note:

  1. dovrete controllare che l'espressione regolare che ho usato è adatto a tutti i casi, naturalmente si può cambiare a un metodo che verifica la presenza di pochi altri regex le partite.
  2. Se si utilizza il plug-in multijob e tutti i lavori sono di quel tipo, è molto più semplice, poiché MultijobBuild ha un getSubBuilds() che restituisce esattamente ciò che si desidera.
  3. Sto ancora cercando un modo migliore per trovare sotto build innescate da una determinata build, specialmente se può restituire build in tutti gli stati, finito o ancora in costruzione.
+0

Grazie per averlo condiviso.Spero sinceramente che l'analisi dei log non sia l'unico modo per recuperare queste informazioni. Se questo è il caso, penso che potrebbe essere necessario presentare un ticket di miglioramento con Jenkins in quanto tale API non dovrebbe mancare – ByteFlinger

+0

Un'altra opzione l'ho trovata per usare https://github.com/jenkinsci/downstream-buildview-plugin. questo plugin aggiunge DownstreamBuildViewAction a ogni build utilizzando DownstreamBuildViewRunListener. quindi si usa il get DownstreamBuildViewAction che ha metodi come: public int getDownstreamBuildNumber (String projectName) e public List getDownstreamBuildList(). –