从队列ID获取Jenkins作业构建ID

时间:2017-08-02 23:37:36

标签: rest api curl jenkins

我成功地使用它来启动Jenkins工作:

curl -X POST "http://jenkins_srv:8080/job/MY_JOB/buildwithParameters?this=1&that=2" --user name:pass

我也可以使用以下方法从此作业中获取consoleText:

curl -X POST "http://jenkins_srv:8080/job/MY_JOB/lastBuild/consoleText"

但是,如果我背靠背运行多个作业,这不会扩展。我注意到第一个curl命令的返回值包括:

Location: http://jenkins_srv:8080/queue/item/123/

我假设123是作业队列ID。

我的问题是,如果我排队工作121122,& 123背靠背,我用什么来检查作业队列项122的状态?另外,我使用什么来确定最终由作业队列项122生成的实际构建ID?

提前谢谢。

4 个答案:

答案 0 :(得分:8)

我选择了Kdawg的答案,因为它帮助我朝着我需要的方向前进。谢谢!

我也包括我自己的答案,因为我实施的解决方案与Kdawg的答案不同,我觉得它会为其他人增加价值。

首先,我是Jenkins的新手。所以,如果我错过了,请随时纠正我。其次,我有一个轻微的学习曲线,因为Jenkins"队列项目和#34;之间存在差异。和Jenkins"建立工作"。一个"队列项目"已经创建,没有"建立工作" ID,因为没有开始构建作业。此外,一旦构建作业启动,队列项目将在删除前5分钟。

当我执行这些任务时:

curl -X POST "http://jenkins_srv:8080/job/MY_JOB/buildwithParameters?this=1&that=2" --user name:pass
curl -X POST "http://jenkins_srv:8080/job/MY_JOB/buildwithParameters?this=1&that=2" --user name:pass
curl -X POST "http://jenkins_srv:8080/job/MY_JOB/buildwithParameters?this=1&that=2" --user name:pass

Jenkins将安排3个构建作业在队列中运行。这些将是"队列项目"。这些"队列项目"将有一个"队列ID"。在我原始问题中给出的示例中,假设这三个curl命令创建"队列项目"使用"队列ID" s 121122和& 123

为什么这很重要?

因为根据Jenkins服务器的负载,排队的项目可能会立即运行,也可能不会立即运行。如果它立即运行,那么Kdawg的回答肯定是正确的。运行他的命令:

curl -X GET http://jenkins_srv:8080/queue/item/121/api/json?pretty=true --user name:pass
curl -X GET http://jenkins_srv:8080/queue/item/122/api/json?pretty=true --user name:pass
curl -X GET http://jenkins_srv:8080/queue/item/123/api/json?pretty=true --user name:pass

这将获得有关每个"队列项"的队列信息,并且在什么返回时,肯定有一种方法可以获得"构建作业" ID,如果构建作业已启动。如果构建作业尚未开始,则此信息将为空白。

在这里,我认为增加价值的附加部分。

一旦构建作业开始,Kdawg的答案中的信息将填充在对三个curl -X GET命令的响应中。此外,默认情况下,Jenkins旨在每隔5分钟清除(垃圾收集,选择自己的术语)"队列项目。换句话说,如果你拥有的只是一个"队列项目" ID和5分钟数据保留窗口通过,然后您需要另一种机制来获得"构建作业"来自"队列项目的ID" ID。

因此,就我而言,我使用Jenkins作为前端,后端使用Ansible来执行服务器配置和应用程序部署。其中一些应用程序部署可能需要30分钟或更长时间,远远超过"队列项目的5分钟数据保留期限。

所以我必须解决的问题,如果我所拥有的是一个"队列项目" ID,然后我如何找到"构建工作" ID,无论我何时检查,数秒或数小时后?

这是我的解决方案(注意我需要XML输出,FYI)。

我跑了这个命令:

curl -X POST "http://jenkins_srv:8080/job/MY_JOB/buildwithParameters?this=1&that=2" --user name:pass

此命令将返回此信息:

Runtime responseHeaders Date: Day, ## Non Year xx:yy:zz GMT
X-Content-Type-Options: nosniff
Location: http://jenkins_srv:port/queue/item/123/
Content-Length: 0
Server: Jetty(9.4.z-SNAPSHOT)

从这里开始,我可以从123字段解析Location

然后我睡了10秒钟。睡眠后,我在10秒钟的循环中运行此命令:

curl -X GET http://jenkins_srv:8080/queue/item/123/api/xml

我做到了,直到我:

  1. 我收到了一个队列项返回,其中包含了Kdawg示例中显示的xpath //可执行文件/数字,或者
  2. 我获得的HTML 404状态代码超过10分钟,这意味着该作业还没有排队,或者我通过了5分钟的数据保留窗口。
  3. 以这种方式循环处理负载处理队列请求缓慢的负载Jenkins服务器。因此,如果我到达10分钟结束,那么我的方法仍将处理我的自动化方法已成功排队并运行该作业的用例,但它在数据保留窗口之外检查Jenkins 。在这种情况下,我会运行此命令:

    curl -X GET http://jenkins_srv:port/job/MY_JOB/api/xml?tree=builds[id,number,result,queueId]&xpath=//build[queueId=123]
    

    这将返回任何"构建作业"的XML信息。它还包含queueId 123,如下所示:

    <?xml version="1.0"?>
        <build _class="hudson.model.FreeStyleBuild">
            <id>456</id>
            <number>456</number>
            <queueId>123</queueId>
            <result>SUCCESS</result>
        </build>
    

    通过这种方式,我能够权威地获得“建立工作”#34; ID只有一个&#34;队列项&#34; ID,无论我开始和检查之间的时间差异。

答案 1 :(得分:3)

假设您的位置为http://jenkins_srv:8080/queue/item/123/,您可以GET http://jenkins_srv:8080/queue/item/123/api/json?pretty=true返回有关该队列项的信息(如果您不关心,也可以不包括?pretty=true格式化,或者如果您希望以XML格式显示结果,请使用api/xml

我不知道队列API上是否有标准文档,但是如果队列项目已经完成(也许当前正在构建它?)它似乎一个executable节点。我服务器的一个看起来像这样:

"executable" : {
    "_class" : "org.jenkinsci.plugins.workflow.job.WorkflowRun",
    "number" : 10,
    "url" : "http://192.168.99.100:32769/job/configure/10/"
}

然后,您可以GET executable.url中指定的网址的API。就我而言,GET http://192.168.99.100:32769/job/configure/10/api/json?pretty=true。从那里,您应该拥有所需的所有信息,包括构建当前是否正在构建,构建所花费的时间,结果等等。

此外,如果您需要有关整个构建队列的信息,可以GET http://jenkins_srv:8080/queue/api/json?pretty=true

答案 2 :(得分:1)

令人惊讶的是,詹金斯(Jenkins)没有使用唯一的ID跟踪其结论的请求。

保留在排队的项目和构建项目之间的一个元素是参数列表。如果您有能力/权限来更改作业的配置,请添加一个可选参数REQUEST_ID,客户端从空中拔出该参数(例如UUID)并通过REST传递。然后,您可以查询队列并使用REQUEST_ID查找其中的一个,然后您可以查询构建列表并使用REQUEST_ID查找其中的一个。

答案 3 :(得分:1)

关于此有一件有趣的事情,如果您想在循环中对多个构建进行排队,您最终可能会得到相同的 QUEUE_ID,尤其是当您具有相同的参数并且排队的构建尚未启动时,会发生这种情况。基本上,Jenkins 假设您只是在尝试构建它,而不是多个构建,它只是假设它只需要启动一个构建,因此使用相同的 QUEUE_ID,为了克服这个问题,如果您在构建作业时添加额外的参数像 UQ_ID=CURRENT_TIMESTAMP (此参数不需要在构建中)然后您将获得唯一的构建号

如果构建中根本没有参数,您应该至少定义一个参数,因为无参数构建不允许在 api 中传递任何参数