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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从队列ID获取Jenkins作业构建ID相关的知识,希望对你有一定的参考价值。

我成功地使用它来启动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。

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

先感谢您。

答案

假设你有一个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/"
}

然后,您可以GETexecutable.url中指定的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

另一答案

我选择了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

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

为什么这很重要?

因为取决于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. 我获得了超过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]

这将返回任何“构建作业”的XML信息,该作业还包含queueId123,如下所示:

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

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

另一答案

令人惊讶的是Jenkins没有使用唯一ID跟踪对其结论的请求。

排队项和构建项之间存在的一个元素是参数列表。如果您具有更改作业配置的能力/权限,则添加客户端从空中获取的可选参数REQUEST_ID(例如UUID)并通过REST传递。然后,您可以测试队列并查找具有REQUEST_ID的队列,然后您可以测试构建列表并查找具有REQUEST_ID的构建列表。

以上是关于从队列ID获取Jenkins作业构建ID的主要内容,如果未能解决你的问题,请参考以下文章

Jenkins 构建提升:如何获取我想要提升的构建的构建 ID?

Laravel:获取有关队列作业的详细信息

Jenkins 从 Git 获取代码时挂起

如何在 jenkins 中部署,根据参数选择从特定的 git 分支获取源代码

具有多个部署的单个 Jenkins 作业

Jenkins能否为构建提供TFS门控签入代码?