zoukankan      html  css  js  c++  java
  • 通过jenkins api 触发远程构建

    原文链接(针对用到的构建部分稍作了补充):https://segmentfault.com/a/1190000018939447 

    Jenkins 是一款流行的开源持续集成工具,可以用来做一些软件开发的自动化工作,如打包,测试,自动部署等。

    Jenkins 中有 viewjob 的概念, view 相当于组, job 则是具体的任务。
    view 下面可以创建 job ,但 job 可以不在任何 view 下。

    这里主要介绍 Jenkins 提供的 HTTP API ,至于如何使用 Jenkins 请参看 Jenkins User Documentation

    API

    鉴权

    Jenkins 使用 Baisc Auth 的权限验证方式,需要传入 usernameapi token
    其中 api token 需要在用户的设置界面去创建。具体见下面截图引导:

     但在 Job 的远程触发中,可以设置用于远程触发的 token (在 Job 的配置页面设置),这样在触发 Job 时就不需要传入 Basic Auth 了。以下是在job中创建token的图示:

    远程触发的 token 使用 urlencode 的方式放在请求的 body 中,其原始数据为: token=<Token Value>

    下面给出两种方式触发 Job 的例子:

    • Basic Auth

      curl -X POST <jenkins url>/view/<view name>/job/<job name>/build --user <username>:<api token>

       实例:

        <view name>和<job name>的值是直接复制的浏览器地址栏中的url,不是手工输入的,手工输入真实的字符串运行不成功。

    curl -X POST http://192.168.2.17:8080/jenkins/view/%E6%96%B0%E5%B7%A5%E4%BD%9C%E6%B5%81/job/%E5%BC%80%E5%90%AFACL/build --user YL:11f9f1616fa554b4bb3dfb3f515c07b490
    • Token

      curl -X POST <jenkins url>/view/<view name>/job/<job name>/build --data-urlencode token=<Token Value>

    curl -X POST http://192.168.2.17:8080/jenkins/view/%E6%96%B0%E5%B7%A5%E4%BD%9C%E6%B5%81/job/%E5%BC%80%E5%90%AFACL/build --data-urlencode token=123qq...
    这种方式去直接远程触发job会提示Authentication required,文章最后部分有不推荐的临时解决方法,以下是推荐的方法,再额外加上身份验证:
    curl -X POST http://192.168.2.17:8080/jenkins/view/%E6%96%B0%E5%B7%A5%E4%BD%9C%E6%B5%81/job/%E5%BC%80%E5%90%AFACL/build --data-urlencode token=123qq... -u YL:11f9f1616fa554b4bb3dfb3f515c07b490

    补充:

    Jenkins的API支持如下两种方式进行认证:
    
    用户名 + 用户密码(不安全)
    以curl客户端访问为例,通过如下方式进行相关的用户认证
    
      curl -u 用户名:用户密码 http://Jenkins服务的URL/具体操作的URI
    
    用户名 + Token信息(安全)
    以curl客户端访问为例,通过如下方式进行相关的用户认证
    
      curl -u 用户名:用户Token http://Jenkins服务的URL/具体操作的URI
    
    注:此处使用的Token为在Jenkins中可以查询到的(用户的配置页面可以查询到的API Token即为此处认证所使用的信息,而Token的修改也可以在此页面通过点击Change API Token按钮来进行)

    View

    • 创建

      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>

    • 查询状态

      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
    }
    View Code

    参考资料

    没有在 Jenkins REST API 文档 中找到过多的 API 信息,但在 python-jenkins代码 中找到,所以想要了解更多请看代码。


    以下方式不推荐,只是临时解决思路。

    原文链接:https://www.cnblogs.com/luckyhome168/p/7455482.html

    问题:通过Postman访问 Jenkins api时出现访问权限问题

    复制代码
    <html>
        <head>
            <meta http-equiv='refresh' content='1;url=/jenkins/login?from=%2Fjenkins%2Fapi%2Fjson'/>
            <script>window.location.replace('/jenkins/login?from=%2Fjenkins%2Fapi%2Fjson');</script>
        </head>
        <body style='background-color:white; color:white;'>


    Authentication required

            <!--
    You are authenticated as: anonymous
    Groups that you are in:
     
    Permission you need to have (but didn't): hudson.model.Hudson.Read
     ... which is implied by: hudson.security.Permission.GenericRead
     ... which is implied by: hudson.model.Hudson.Administer
    -->


        </body>
    </html>
    复制代码

    解决方法:Jenkins 系统设置中设置未授权用户可以读访问。

     然后Apply后,再次访问可以正常了

  • 相关阅读:
    [Win32]一个调试器的实现(十)显示变量
    [Win32]防止套接字被继承
    [C++]实现委托模型
    [Win32]一个调试器的实现(十一)显示函数调用栈
    [Win32]IP数据报的首部如何定义
    FMECA方法及工程应用
    C#控制台应用程序自动关闭
    ckedit 3.0 配置(一)
    [转]“余则成”教你办公室生存法则20条
    Element UI之Select选择器优化
  • 原文地址:https://www.cnblogs.com/tianleblog/p/11792977.html
Copyright © 2011-2022 走看看