2014-07-01 51 views
13

我從詹金斯的外面通過HTTP POST請求觸發參數詹金斯ID:檢索遠程觸發詹金斯工作

我在作業可以從外部觸發任務配置中啓用,我真的可以通過發送與詹金斯這樣的內容的請求觸發它:

POST
http://myJenkins.com/myJob/buildWithParameters?token=MYTOKEN 參數:SCREEN_SIZE:27

觸發作業創建返回一個全成201 CREATED HTTP響應。

我的問題是,我不知道創建的作業ID。我想監視工作狀態。爲了做到這一點,我需要知道身份證。否則,如果我只是採取最新的工作,我可能會犯錯誤的工作。

有沒有一種可靠的方法來獲得創建的工作的ID?

回答

6

更新:

other answer加入〜8後礦井個月。我當時並未意識到位置頭部的響應。這聽起來像是某些情況下的不錯選擇。也就是說,根據回答和評論中的注意事項(尤其是參數化的版本),看起來這個答案在某些情況下仍然有用。

原來的答覆:

不幸的是,他們沒有讓這個那麼簡單,因爲它可以。即通過例如返回JSON響應以及諸如ID的信息。

但是,我相信一個堅實的,但肯定不平凡的,解決方法是將充分利用其在使用觸發生成的URL 原因參數,並造成內,加獨特的文本那您稍後可以解析以確定是否從自動化中觸發了它。

爲了進一步uniqueify的具體工作,如果多是在同一時間運行,甚至從你的自動化,還包括一些類型的唯一ID(它可能僅僅是一個序列ID從RDBMS或類似)在原因參數內。

然後,您可以使用JSON API獲取有關工作你遠程觸發信息。再次,這是有些不直接,但可行的:

擊中格式的URL:

http://<server>:<port>/job/<jobname>/lastBuild/api/json 

您可以添加?pretty=true到漂亮地打印它在瀏覽器中獲得更好的易讀性。

這會讓你得到最後一次構建的JSON。它將包含原因行動屬性中的屬性,並在那裏(在一個名爲SHORTDESCRIPTION另一個嵌套屬性),你會發現你添加的原因參數,如果這是你觸發的構建之一。

你可以解析出特殊的靜態文本和生成的ID,看看它們是否匹配。如果他們這樣做,則可以從JSON中獲得Jenkins id(搜索buildNumber,它是嵌套的)。

如果該構建完全不是由您的自動化觸發的,或者是,但ID不匹配,您可以重複N-1構建的過程,直到找到所需內容。

這JSON是下面的形式:

http://<server>:<port>/job/<jobname>/<buildNumber>/api/json 
+0

你能否詳細說明如何添加'cause'參數?我搜索了Jenkins文檔並找不到對此參數的任何參考。 – Muxa

+0

這是您在通過* curl *或類似命令觸發構建的URL中指定的參數。例如將該參數'cause = foo_100'添加到URL中。 – khampson

+0

偉大的迴應!在搜索唯一ID的構建歷史記錄時,您的觸發作業執行仍在隊列中時,可能存在競爭狀況。您可以通過使用201創建的響應中包含的位置避免這種情況,並基本上等待它離開隊列。 – jpadams

29

由於詹金斯1.519,入隊構建與在Location一個URL響應,指向你的項目在構建隊列:

$ nc localhost 8666 
POST /jenkins/job/morgRemote/buildWithParameters?jenkins_status=1&jenkins_sleep=20&token=morgRemote HTTP/1.1 
Host: localhost:8666 

HTTP/1.1 201 Created 
Location: http://localhost:8666/jenkins/queue/item/39/ 
Content-Length: 0 
Server: Jetty(winstone-2.8) 

現在,如果您將api/json(或api/xml等)添加到其末尾(因此在此示例中它將是http://localhost:8666/jenkins/queue/item/39/api/json),那麼您將獲得將包含給定作業的構建ID的文檔。對於json,檢索到的對象具有executable屬性,該屬性又具有numberurl屬性。 number是給定工作的構建ID(這裏是35),url是jenkins構建頁面的url。

{ 
    "actions" : [ 
    { 
     "parameters" : [ 
     { 
      "name" : "jenkins_status", 
      "value" : "1" 
     }, 
     { 
      "name" : "jenkins_sleep", 
      "value" : "20" 
     } 
     ] 
    }, 
    { 
     "causes" : [ 
     { 
      "shortDescription" : "Started by remote host 127.0.0.1", 
      "addr" : "127.0.0.1", 
      "note" : null 
     } 
     ] 
    } 
    ], 
    "blocked" : false, 
    "buildable" : false, 
    "id" : 39, 
    "inQueueSince" : 1423993879845, 
    "params" : "\njenkins_status=1\njenkins_sleep=20", 
    "stuck" : false, 
    "task" : { 
    "name" : "morgRemote", 
    "url" : "http://localhost:8666/jenkins/job/morgRemote/", 
    "color" : "red" 
    }, 
    "url" : "queue/item/39/", 
    "why" : null, 
    "cancelled" : false, 
    "executable" : { 
    "number" : 35, 
    "url" : "http://localhost:8666/jenkins/job/morgRemote/35/" 
    } 
} 

知道兩兩件事:

  • 在構建隊列不活動的項目是幾分鐘後收集垃圾,所以你應該在默認情況下檢索版本ID儘快
  • 需要項目之間幾秒鐘被添加到隊列中直到獲取構建ID。在此期間,executablecanceled屬性將丟失,並且why將不爲空。您可以通過修改「安靜期」設置或在jenkins全局配置中,在作業配置的「高級項目選項」中更改此行爲。

... 
    "url" : "queue/item/39/", 
    "why" : "In the quiet period. Expires in 2.4 sec", 
    "timestamp" : 1423993879845 
} 
+1

謝謝你的回答!這部分爲我工作。我在v1.559上,如果我有一個非參數化的構建和使用/構建我得到的位置。當我使用buildWithParameters時,我得到一個錯誤...預計。在參數化版本上,我沒有得到正確的位置。如果我使用/構建我得到作業網址,並且如果我使用buildWithParameters我在Location標頭中什麼都沒有。有任何想法嗎? –

+0

關於儘快檢索構建ID,因爲隊列項目將被垃圾收集看到這個問題:https://issues.jenkins-ci.org/browse/JENKINS-31039 – KCD

+1

「默認情況下,它需要幾秒之間的項目添加到排隊,直到它獲得生成ID「 - 實際上可能需要幾秒鐘,幾小時或幾天!直到詹金斯發現並指派執行人員來執行工作,該工作沒有內部編號。 –

2

原來構建具有原始隊列ID。此外,只能使用隊列標識查詢構建並輪詢它,直到獲得結果爲止,因爲404通常意味着它已排隊。

從位置標題中拉出隊列標識,例如39

/jenkins/queue/item/39/ 

與該隊列號構建反覆查詢,直到你得到答案

"http://{jenkins}job/{job}/api/xml?tree=builds[number,queueId]&xpath=//build[queueId=\"{queueId}\"]"; 

<build> 
    <number>411</number> 
    <queueId>39</queueId> 
</build> 

從這個結果可以用XPath的拉動集結號/build/number/text()

(請注意,我可以在url中不使用&xpath=//build[queueId={queueId}]/number/text(),因爲"primitive XPath result sets forbidden; implement jenkins.security.SecureRequester"

與輪詢api的「可執行「構建。一個優點是端點將持續更長時間 - 直到構建被刪除,與任意時間相比(似乎大約5分鐘)。

+0

謝謝!此外,xpath的東西使事情變得更容易,不需要JSON解析器來找到正確的數據位。 – Frans

0

我能夠使用Java Jenkins API來實現你正在尋找的東西。 https://github.com/jenkinsci/java-client-api

示例代碼:

JenkinsServer jenkinsServer = new JenkinsServer(newURI("http://yourJenkinsServer:8080/")); 
JobWithDetails smokeTestJob = jenkinsServer.getJob("YourJobName");   
Map<String,String> jobParams = new HashMap<String,String>(); 
QueueReference queueReference = smokeTestJob.build(jobParams); 

do { 
    Thread.sleep(2000L); 
    queueItem = jenkinsServer.getQueueItem(queueReference); 
    log("Job still in queue"+queueItem.getExecutable()); 
    } while (queueItem.getExecutable() == null); 

Build build = jenkinsServer.getBuild(queueItem); 

while(build.details().isBuilding()){ 
    log("Job still running"); 
    Thread.sleep(10000L); 
} 

log("Result="+build.details().getResult()); 
0

想添加使用位置頭morgwai答案。

我剛剛解決了這個問題。位置標題之後的鍵是輪詢作業隊列條目,直到它具有「可執行」條目,該條目給出已啓動的作業編號。

我給出完整的答案,我首先看到的一個類似的問題,這並不能完全回答這個問題:

{ 
    "_class": "hudson.model.Queue$LeftItem", 
    "actions": [ 
     { 
      "_class": "hudson.model.CauseAction", 
      "causes": [ 
       { 
        "_class": "hudson.model.Cause$RemoteCause", 
        "addr": "10.20.30.60", 
        "note": null, 
        "shortDescription": "Started by remote host 10.20.30.60" 
       } 
      ] 
     } 
    ], 
    "blocked": false, 
    "buildable": false, 
    "cancelled": false, 
    "executable": { 
     "_class": "org.jenkinsci.plugins.workflow.job.WorkflowRun", 
     "number": 45, 
     "url": "http://192.168.115.187:8080/job/rf_systest/45/" 
    }, 
    "id": 95, 
    "inQueueSince": 1517342648136, 
    "params": "", 
    "stuck": false, 
    "task": { 
     "_class": "org.jenkinsci.plugins.workflow.job.WorkflowJob", 
     "color": "blue_anime", 
     "name": "rf_systest", 
     "url": "http://192.168.115.187:8080/job/rf_systest/" 
    }, 
    "url": "queue/item/95/", 
    "why": null 
} 

https://stackoverflow.com/a/48531874/9291603

JSON從詹金斯與可執行進入作業隊列的條目