Jenkins
是一款流行的開源持續(xù)集成工具遥缕,可以用來做一些軟件開發(fā)的自動(dòng)化工作蓖宦,如打包,測(cè)試咱枉,自動(dòng)部署等卑硫。
Jenkins
中有 view
和 job
的概念, view
相當(dāng)于組蚕断, job
則是具體的任務(wù)。
view
下面可以創(chuàng)建 job
入挣,但 job
可以不在任何 view
下亿乳。
這里主要介紹 Jenkins
提供的 HTTP API
,至于如何使用 Jenkins
請(qǐng)參看 Jenkins User Documentation径筏。
API
鑒權(quán)
Jenkins
使用 Baisc Auth
的權(quán)限驗(yàn)證方式葛假,需要傳入 username
和 api token
。
其中 api token
需要在用戶的設(shè)置界面去創(chuàng)建滋恬。
但在 Job
的遠(yuǎn)程觸發(fā)中聊训,可以設(shè)置用于遠(yuǎn)程觸發(fā)的 token
(在 Job
的配置頁面設(shè)置),這樣在觸發(fā) Job
時(shí)就不需要傳入 Basic Auth
了恢氯。
遠(yuǎn)程觸發(fā)的 token
使用 urlencode
的方式放在請(qǐng)求的 body
中带斑,其原始數(shù)據(jù)為: token=<Token Value>
下面給出兩種方式觸發(fā) Job
的例子:
-
Basic Auth
curl -X POST <jenkins url>/view/<view name>/job/<job name>/build --user <username>:<api token>
-
Token
curl -X POST <jenkins url>/view/<view name>/job/<job name>/build --data-urlencode token=<Token Value>
View
-
創(chuàng)建
API:
<jenkins url>/createView
curl:
curl -X POST <jenkins url>/createView?name=<view name> --data-binary "@viewCofnig.xml" -H "Content-Type: text/xml" --auth <u>:<p>
-
刪除
API:
<jenkins url>/view/<view name>/doDelete
curl:
curl -X POST <jenkins url>/view/<view name>/doDelete --auth <u>:<p>
-
查詢狀態(tài)
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>
Job
-
創(chuàng)建
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>
-
查詢狀態(tài)
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>
Job Build
為了描述方便,這里先定義 baseURL=<jenkins url>/view/<view name>/job/<job name>
勋拟,下面的 API
都需要加上 baseURL
才是完整的 =URL=勋磕。
-
觸發(fā)構(gòu)建
API:
/build
支持
token
觸發(fā),支持填入構(gòu)建參數(shù)敢靡,構(gòu)建參數(shù)是在Job
配置頁面創(chuàng)建的挂滓。如使用
token
并有字符參數(shù)branch
和target
的例子:curl -X POST <api> --data-urlencode token=<token value> \ --data-urlencode json='{"parameters": [{"name": "branch", "value": "master"},{"name":"target","value":"mirror"}]}'
觸發(fā)成功后,會(huì)在
header
的Location
字段指明queue url
啸胧,再通過查詢queue
就可獲取到build id
了赶站。 -
停止構(gòu)建
API:
/<id>/stop
-
刪除構(gòu)建
API:
/<id>/doDelete
-
構(gòu)建狀態(tài)
API:
/<id>/api/json
-
最后一次構(gòu)建
API:
/lastBuild/api/json
附錄
使用 Go
編寫觸發(fā)構(gòu)建的程序
這里只給出關(guān)鍵代碼:
// 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 的 代碼 中找到,所以想要了解更多請(qǐng)看代碼贝椿。