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

Rus*_*sNS 6 api rest 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.

我的问题是,如果我排队工作121,122,和123背靠背,我该怎么用它来检查作业队列项目的状态122?另外,我用什么来确定最终由作业队列项产生的实际构建ID 122

先感谢您.

Rus*_*sNS 12

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

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

首先,我是詹金斯的新手.所以,如果我错过了,请随时纠正我.其次,我有一个轻微的学习曲线,因为Jenkins"队列项目"和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
Run Code Online (Sandbox Code Playgroud)

Jenkins将安排3个构建作业在队列中运行.这些将是"队列项目".这些"队列项"将具有"队列ID".在我原来的问题给出的例子,让我们假设这三个卷曲的命令创建"队列中的项目"和"队列ID" S 121,122,及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
Run Code Online (Sandbox Code Playgroud)

这将获得有关每个"队列项"的队列信息,并且在返回的内容中,如果构建作业已启动,则肯定有一种获取"构建作业"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
Run Code Online (Sandbox Code Playgroud)

此命令将返回此信息:

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)
Run Code Online (Sandbox Code Playgroud)

从这里,我可以123Location现场解析.

然后我睡了10秒钟.睡眠后,我在10秒循环上运行此命令:

curl -X GET http://jenkins_srv:8080/queue/item/123/api/xml
Run Code Online (Sandbox Code Playgroud)

我做到了,直到我:

  1. 我得到了一个队列项返回,其中包含了Kdawg示例中显示的xpath //可执行文件/编号,或者
  2. 我获得了超过10分钟的HTML 404状态代码,这意味着该作业尚未排队或我通过了5分钟的数据保留窗口.

以这种方式循环处理负载处理队列请求缓慢的负载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]
Run Code Online (Sandbox Code Playgroud)

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

<?xml version="1.0"?>
    <build _class="hudson.model.FreeStyleBuild">
        <id>456</id>
        <number>456</number>
        <queueId>123</queueId>
        <result>SUCCESS</result>
    </build>
Run Code Online (Sandbox Code Playgroud)

通过这种方式,我能够权威地获得"构建作业"ID,同时只有一个"队列项"ID,而不管我开始和检查之间的时间差.


Kda*_*awg 6

假设您的位置为http://jenkins_srv:8080/queue/item/123/,则可以GET http://jenkins_srv:8080/queue/item/123/api/json?pretty=true返回有关该队列项的信息(?pretty=true如果您不关心格式,也可以不包括,或者api/xml如果您想要XML 格式的结果,则可以不包含)。

我不知道队列API上是否有标准文档,但是看来,如果队列项目已完成(也许还正在构建中),它将有一个executable节点。我服务器的一个如下所示:

"executable" : {
    "_class" : "org.jenkinsci.plugins.workflow.job.WorkflowRun",
    "number" : 10,
    "url" : "http://192.168.99.100:32769/job/configure/10/"
}
Run Code Online (Sandbox Code Playgroud)

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

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