Jenkins
是一款流行的開源持續集成工具,能夠用來作一些軟件開發的自動化工做,如打包,測試,自動部署等。python
Jenkins
中有 view
和 job
的概念, view
至關於組, job
則是具體的任務。view
下面能夠建立 job
,但 job
能夠不在任何 view
下。shell
這裏主要介紹 Jenkins
提供的 HTTP API
,至於如何使用 Jenkins
請參看 Jenkins User Documentation。json
Jenkins
使用 Baisc Auth
的權限驗證方式,須要傳入 username
和 api token
。
其中 api token
須要在用戶的設置界面去建立。api
但在 Job
的遠程觸發中,能夠設置用於遠程觸發的 token
(在 Job
的配置頁面設置),這樣在觸發 Job
時就不須要傳入 Basic Auth
了。
遠程觸發的 token
使用 urlencode
的方式放在請求的 body
中,其原始數據爲: token=<Token Value>
app
下面給出兩種方式觸發 Job
的例子:curl
curl -X POST <jenkins url>/view/<view name>/job/<job name>/build --user <username>:<api token>
工具
curl -X POST <jenkins url>/view/<view name>/job/<job name>/build --data-urlencode token=<Token Value>
測試
API: <jenkins url>/createView
ui
curl: curl -X POST <jenkins url>/createView?name=<view name> --data-binary "@viewCofnig.xml" -H "Content-Type: text/xml" --auth <u>:<p>
url
API: <jenkins url>/view/<view name>/doDelete
curl: curl -X POST <jenkins url>/view/<view name>/doDelete --auth <u>:<p>
API: <jenkins url>/view/<view name>/api/json
curl: curl -X GET <jenkins url>/view/<view name>/api/json --auth <u>:<p>
API: <jenkins url>/view/<view name>/config.xml
curl: curl -X GET <jenkins url>/view/<view name>/config.xml --auth <u>:<p>
API: <jenkins url>/view/<view name>/config.xml
curl: curl -X POST <jenkins url>/view/<view name>/config.xml --data-binary "@newCofnig.xml" -H "Content-Type: text/xml" --auth <u>:<p>
API: <jenkins url>/createItem
curl: curl -X POST <jenkins url>/createItem?name=<job name> --data-binary "@jobConfig.xml" -H "Content-Type: text/xml" --auth <u>:<p>
API: <jenkins url>/job/<job name>/doDelete
curl: curl -X POST <jenkins url>/job/<job name>/doDelete --auth <u>:<p>
API: <jenkins url>/view/<view name>/job/<job name>/api/json
curl: curl -X GET <jenkins url>/view/<view name>/job/<job name>/api/json --auth <u>:<p>
API: <jenkins url>/view/<view name>/job/<job name>/enable
API: <jenkins url>/view/<view name>/job/<job name>/disable
API: <jenkins url>/view/<view name>/job/<job name>/config.xml
curl: curl -X GET <jenkins url>/view/<view name>/job/<job name>/config.xml --auth <u>:<p>
API: <jenkins url>/view/<view name>/job/<job name>/config.xml
curl: curl -X POST <jenkins url>/view/<view name>/job/<job name>/config.xml --data-binary "@newCofnig.xml" -H "Content-Type: text/xml" --auth <u>:<p>
爲了描述方便,這裏先定義 baseURL=<jenkins url>/view/<view name>/job/<job name>
,下面的 API
都須要加上 baseURL
纔是完整的 =URL=。
觸發構建
API: /build
支持 token
觸發,支持填入構建參數,構建參數是在 Job
配置頁面建立的。
如使用 token
並有字符參數 branch
和 target
的例子:
curl -X POST <api> --data-urlencode token=<token value> \ --data-urlencode json='{"parameters": [{"name": "branch", "value": "master"},{"name":"target","value":"mirror"}]}'
觸發成功後,會在 header
的 Location
字段指明 queue url
,再經過查詢 queue
就可獲取到 build id
了。
API: /<id>/stop
API: /<id>/doDelete
API: /<id>/api/json
API: /lastBuild/api/json
Go
編寫觸發構建的程序這裏只給出關鍵代碼:
// QueueInfo jenkins return's info by queue json api type QueueInfo struct { Executable struct { Number int `json:"number"` URL string `json:"url"` } `json:"Executable"` } var ( jenkinsURL = flag.String("url", "https://ci.deepin.io", "Jenkins site url") jenkinsView = flag.String("view", "", "Jenkins job view") jenkinsJob = flag.String("job", "", "Jenkins job name") jenkinsToken = flag.String("token", "", "Jenkins job token") ) // BuildJob trigger a job build func BuildJob(params map[string]string) (int, error) { var api = *jenkinsURL if len(*jenkinsView) != 0 { api += fmt.Sprintf("/view/%s", *jenkinsView) } if len(*jenkinsJob) != 0 { api += fmt.Sprintf("/job/%s", *jenkinsJob) } api += "/build" // params must encode by url var values = make(url.Values) for k, v := range params { values.Set(k, v) } req, err := http.NewRequest(http.MethodPost, api, bytes.NewBufferString(values.Encode())) if err != nil { return -1, err } // must set 'Content-Type' to 'application/x-www-form-urlencoded' req.Header.Set("Content-Type", "application/x-www-form-urlencoded; charset=utf-8") resp, err := http.DefaultClient.Do(req) if err != nil { return -1, err } if resp.Body != nil { defer resp.Body.Close() data, err := ioutil.ReadAll(resp.Body) if err != nil { fmt.Println("Failed to read response content:", err) } else { fmt.Println("Response content:", string(data)) } } fmt.Println("Status:", resp.Status) if resp.StatusCode < 200 || resp.StatusCode >= 300 { fmt.Println("Failed to build job") return -1, fmt.Errorf("build job failure") } fmt.Println("Response headers:", resp.Header) queueAPI := resp.Header.Get("Location") queue, err := GetQueue(queueAPI) if err != nil { return -1, err } return queue.Executable.Number, nil } func GetQueue(api string) (*QueueInfo, error) { resp, err := http.Get(api + "/api/json") if err != nil { fmt.Println("Failed to get queue:", err) return nil, err } defer resp.Body.Close() data, err := ioutil.ReadAll(resp.Body) if err != nil { fmt.Println("Failed to read response content:", err) } if resp.StatusCode < 200 || resp.StatusCode >= 300 { fmt.Println("Failed to get queue info") return nil, fmt.Errorf("get queue info failure") } var info QueueInfo err = json.Unmarshal(data, &info) if err != nil { return nil, err } return &info, nil }
沒有在 Jenkins REST API 文檔 中找到過多的 API
信息,但在 python-jenkins 的 代碼 中找到,因此想要了解更多請看代碼。