2015-10-13 90 views
8

我已經配置了一個Jenkins項目(我將在此稱其爲SuperJob),以便按順序簡單地調用幾個不同的其他jenkins項目。通過Jenkins API獲取子項目構建

我希望能夠找出所有的子項目這個SuperJob通過詹金斯API

的具體版本號看代碼的發佈HERE的結果我能得到具體的名單在每個構建SuperJob項目中配置的項目,但我無法找到一種方法來查詢每個這些項目的特定內部版本號從特定的SuperJob內部版本運行。

例如,我想知道「SuperJob build#5」觸發了「MyJob build#3」和「OtherJob build#20」,所以我可以彙總並檢查所有這些結果。

我已經嘗試了所有的上游和下游APIs,包括使用子項目作爲關係的參數,但它們都返回空或空。

我猜這是可能的,因爲詹金斯本身能夠顯示來自插件的web ui中的信息,但我一直無法找出如何。

+0

我真的是唯一一個有這樣問題的人嗎?或者,也許它是如此簡單我錯過了一些東西 – ByteFlinger

+0

不,幾分鐘前我面臨同樣的問題..)我需要通過REST API檢索構建鏈。 – Nakilon

+0

詹金斯顯然能夠檢索到正確的信息,因爲當我配置SuperJob失敗時,其中一個子作業立即失敗,詹金斯將只顯示那些在列表中運行,但使用API​​,你將最終得到一個不屬於特定超級作業版本的構建 – ByteFlinger

回答

2

我有同樣的問題,目前我用來查找子版本的解決方案是解析每個版本的控制檯日誌。該日誌包含觸發的作業名稱和構建編號(完成後)。

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. 如果您使用multijob插件,並且所有作業均來自該類型,則它更容易一些,因爲MultijobBuild有一個getSubBuilds(),它將返回您想要的內容。
  3. 我仍在尋找更好的方式來查找由給定的構建觸發的子構建,特別是如果它可以在所有狀態下返回構建,完成或仍在構建。
+0

感謝您的分享。我衷心希望解析日誌不是檢索這些信息的唯一方法。如果是這種情況,我認爲我們可能需要爲Jenkins添加增強權證,因爲這樣的API不應該丟失 – ByteFlinger

+0

我發現它使用https://github.com/jenkinsci/downstream-buildview-plugin的另一個選項。這個插件通過使用DownstreamBuildViewRunListener爲每個構建添加一個DownstreamBuildViewAction。那麼你使用獲取DownstreamBuildViewAction的方法如下:public int getDownstreamBuildNumber(String projectName)和public List getDownstreamBuildList()。 –