【问题标题】:How to stop a build in Jenkins via the REST api ?如何通过 REST api 在 Jenkins 中停止构建?
【发布时间】:2014-01-09 13:42:09
【问题描述】:

我在 Jenkins 有一份工作。我们自己的网站通过 REST api 触发了这项工作的构建。有时我们想中止构建。有时,它甚至可以在构建开始之前。在这种情况下,我们使用 queueItem # 而不是 build #。

如何通过 REST api 做到这一点?

【问题讨论】:

    标签: api rest jenkins


    【解决方案1】:

    如果构建已经开始,POST on:

    http://<Jenkins_URL>/job/<Job_Name>/<Build_Number>/stop
    

    将停止/取消当前构建。

    如果构建还没有开始,你有queueItem,然后POST

    http://<Jenkins_URL>/queue/cancelItem?id=<queueItem>
    

    这是假设您的 Jenkins 服务器没有受到保护,否则您需要为具有 Cancel 权限的用户添加 BASIC authentication

    【讨论】:

    • 非常感谢您的回复。第一个命令运行良好。但是,第二个返回 404。您知道会出什么问题吗?顺便问一下,你有没有指向这部分 API 的文档的指针,因为我找不到它。
    • 您必须在所有有效的 URL 上 POST,包括 stop
    • token 仅适用于build(以及buildWithParameterspoll)。它不能用于任何其他 REST API。一般来说,您应该使用带有 API 令牌的 BASIC 身份验证。
    • 404是JENKINS-21311,可以忽略。
    • @JifengZhang 我不认为您的更新反映了@JesseGlick 的更正,即令牌仅适用于build,不能用于stopcancelItem。我刚刚尝试了stoptoken 参数,但重定向到登录URL,表明令牌无效。
    【解决方案2】:

    其实这个问题已经回答了。所以我会补充一下,如何找到id=&lt;queueItem&gt;,我一直在寻找这个解决方案,这对其他人有帮助。

    所以,您可以通过 - http://jenkins:8081/queue/api/json 获得&lt;queueItem&gt;

    样本输出将是这样的 json 类型 -

    [{"_class":"hudson.model.Cause$RemoteCause","shortDescription":"Started by remote host 172.18.0.2","addr":"172.18.0.2","note":null}]}],"blocked":false,"buildable":false,"id":117,"inQueueSince":16767552,"params":"\nakey\t=AKIQ\nskey=1bP0RuNkr19vGze/bcb4ijDqVr8o\nnameofr=us\noutputtype=json\noid=284102\nadminname=admin","stuck":false,"task"
    

    您必须获取"id":117,并将其解析为 - queueItem =117.

    http://<Jenkins_URL>/queue/cancelItem?id=queueItem
    

    【讨论】:

      【解决方案3】:

      也许您想远程发送一个 post http 请求来停止正在运行的构建,有一个线索仅供参考,jenkins 作业可以停止另一个作业(正在运行的构建),就像任何 jenkins 管理员在作业运行时单击 X 按钮一样。

      1. Http Request Plugins 是 Jenkins 版本 2.17 所必需的
      2. 取消选中防止跨站点请求伪造漏洞利用选项。詹金斯经理 -> 配置全局安全 -> 取消选中
      3. 设置 Http 请求插件的授权。 Manager Jenkins -> 配置系统 -> HTTP 请求基本/摘要身份验证 -> 添加。确保用户具有作业取消权限
      4. 作业 A 正在运行。在作业B中,添加构建步骤为HTTP请求,URL:http://Jenkins_URL/job/Job_A_Name/lastBuild/stop,HTTP模式:POST,授权选择您刚刚设置的用户,然后构建作业B。

      完成

      【讨论】:

        【解决方案4】:

        如果您只需要取消某个作业的活动构建,您可以使用此批处理脚本(windows .bat 语法):

        REM @Echo off
        CLS
        REM CANCEL ACTIVE BUILD
        REM PARAMETER 1 ACTIVE JOB NAME
        if [%1] == [] GOTO NO_ARGUMENT
        SET domain=https://my.jenkins.com/job/
        SET path=/lastBuild/stop
        SET url=%domain%%1%path%
        "\Program Files\Git\mingw64\bin\curl.exe" -X POST %url% --user user:pass"
        GOTO THEEND
        :NO_ARGUMENT
        Echo You need to pass the active jobname to cancel last build execution
        :THEEND
        

        需要设置本地curl 的路径。

        【讨论】: