這是本文件的舊版!
Get Artifacts with RestAPI
Problem
原先為了自動安裝測試開發的軟體,我們有隻腳本,會去jenkins抓某個固定位置的最新安裝程式並安裝。然而,開發過程會因為新功能或修bug等原因產生branch;原本的腳本並無法根據branch去下載安裝程式,也因此花了些時間去研究並解決這個問題。主要目的還是為了節省反安裝、下載與反安裝的時間。
How to?
jenkins既然有RestAPI,應該就有辦法讓人可以存取到它專案相關資訊吧?其中會包含幾個步驟,
- 取得專案build列表。
- 取得branch吻合的build URL。
- 取得此build的artifact列表。
- 過濾想要的artifcat。
取得專案build列表
以專案名稱Example為例,其專案的URL為:
http://tonylin.idv/job/Example首先可以透過此URL去搜尋所有build資訊:
http://tonylin.idv/job/Example/api/json?tree=builds[*]以一個build的結果如下:
{ "builds": [ { "actions": [ {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {} ], "artifacts": [ {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {} ], "building": false, "description": "origin/integration_testing", "displayName": "#6611", "duration": 375922, "estimatedDuration": 366451, "executor": null, "fullDisplayName": "Example #6611", "id": "6611", "keepLog": true, "number": 6611, "queueId": 335, "result": "SUCCESS", "timestamp": 1481712191068, "url": "http://tonylin.idv/job/Example/6611/", "builtOn": "", "changeSet": {}, "culprits": [ {}, {}, {}, {}, {}, {} ], "fingerprint": [] } ] }
取得branch吻合的build URL
由於前一個URL使用[*]是列出所有項目,但其實我們只需要知道branch、build結果、build URL與build number,可以透過以下URL去做query:
http://tonylin.idv/job/Example/api/json?tree=builds[description,result,displayName,url]三個build的輸出結果如下,從結果內容不難得知個別資訊意義,需注意的是master的description會是null:
{ "builds": [ { "description": "origin/integration_testing", "displayName": "#6611", "result": "SUCCESS", "url": "http://tonylin.idv/job/Example/6611/" }, { "description": "origin/fix_memory_leak", "displayName": "#6610", "result": "SUCCESS", "url": "http://tonylin.idv/job/Example/6610/" }, { "description": null, "displayName": "#6583", "result": "SUCCESS", "url": "http://tonylin.idv/job/Example/6583/" } ] }
取得此build的artifact列表
從前一次query結果,以origin/integration_testing為例,我們需要的build URL為:
http://tonylin.idv/job/Example/6611/接著我們可以透過以下URL去query artifacts:
http://tonylin.idv/job/Example/6611/api/json?tree=artifacts[fileName,relativePath]
Reference