Jenkins API 使用

Jenkins 是一款流行的開源持續集成工具,能夠用來作一些軟件開發的自動化工做,如打包,測試,自動部署等。python

Jenkins 中有 viewjob 的概念, view 至關於組, job 則是具體的任務。
view 下面能夠建立 job ,但 job 能夠不在任何 view 下。shell

這裏主要介紹 Jenkins 提供的 HTTP API ,至於如何使用 Jenkins 請參看 Jenkins User Documentationjson

API

鑑權

Jenkins 使用 Baisc Auth 的權限驗證方式,須要傳入 usernameapi token
其中 api token 須要在用戶的設置界面去建立。api

但在 Job 的遠程觸發中,能夠設置用於遠程觸發的 token (在 Job 的配置頁面設置),這樣在觸發 Job 時就不須要傳入 Basic Auth 了。
遠程觸發的 token 使用 urlencode 的方式放在請求的 body 中,其原始數據爲: token=<Token Value>app

下面給出兩種方式觸發 Job 的例子:curl

  • 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

  • 建立

    API: <jenkins url>/createViewui

    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>

Job

  • 建立

    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>

Job Build

爲了描述方便,這裏先定義 baseURL=<jenkins url>/view/<view name>/job/<job name> ,下面的 API 都須要加上 baseURL 纔是完整的 =URL=。

  • 觸發構建

    API: /build

    支持 token 觸發,支持填入構建參數,構建參數是在 Job 配置頁面建立的。

    如使用 token 並有字符參數 branchtarget 的例子:

    curl -X POST <api> --data-urlencode token=<token value> \
    --data-urlencode json='{"parameters": [{"name": "branch", "value": "master"},{"name":"target","value":"mirror"}]}'

    觸發成功後,會在 headerLocation 字段指明 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代碼 中找到,因此想要了解更多請看代碼。

相關文章
相關標籤/搜索