這是本文件的舊版!


Get Artifacts with RestAPI

原先為了自動安裝測試開發的軟體,我們有隻腳本,會去jenkins抓某個固定位置的最新安裝程式並安裝。然而,開發過程會因為新功能或修bug等原因產生branch;原本的腳本並無法根據branch去下載安裝程式,也因此花了些時間去研究並解決這個問題。主要目的還是為了節省反安裝、下載與反安裝的時間。

jenkins既然有RestAPI,應該就有辦法讓人可以存取到它專案相關資訊吧?其中會包含幾個步驟,

  1. 取得專案build列表。
  2. 取得branch吻合的build URL。
  3. 取得此build的artifact列表。
  4. 過濾想要的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]