5

我需要获取我开始使用 REST API(使用 python)的 jenkins 作业的 ID。从 Jenkins 1.529 开始,似乎可以使用 API abd 触发构建,以返回指向队列中作业的 url。

詹金斯的文档:

执行构建

要以编程方式安排新构建,请发布到此 URL。如果构建有参数,则发布到此 URL 并将参数作为表单数据提供。无论哪种方式,成功排队都会导致 201 状态代码,其中 Location HTTP 标头指向队列中项目的 URL。通过轮询队列项的 api/xml 子 URL,可以跟踪队列任务的状态。通常,任务将经历一些状态转换,然后最终被取消(查找“cancelled”布尔属性)或被执行(查找通常指向 AbstractBuild 对象的“可执行”属性。)

但我没有成功获得有用的网址。

我试过了:

import requests
requestKwargs ={'headers': {'Content-Type': 'application/x-www-form-urlencoded'}, 'data': {'json': '{"parameter": []}'}, 'verify': True}
url=server+'job/test/build/'
req=requests.post(url, **requestKwargs)
print 'status',req.status_code
location=req.headers['location']
print 'location is:',location

这段代码的输出是:

状态 201

location is: http://SERVER_PORT/job/test/build/

如何使用“位置”的信息来跟踪队列任务的状态?

谢谢。

4

2 回答 2

4

我通过为我希望以编程方式与之交互的工作提供一个“身份”参数来解决这个问题。

提交作业时,我生成一个 uuid 并将其作为 ident 参数提交给/job/<job_name>/buildWithParameters.

然后,我获取/queue/api/json并遍历排队项目列表,在其参数中搜索具有该 uuid 的项目。这将获取队列 ID。

然后我使用这个队列 id/queue/item/<queue_id>/api/json每 N 秒轮询一次,等待 jenkins 在响应中提供一个内部版本号(一旦构建开始就会这样做)。你可以使用这个内部版本号来构造你想要的 url /job/<job_name>/<build_number>,.

您实际上需要在 jenkins 工作中添加 ident 作为参数。这很痛苦,但它工作可靠。

于 2014-03-09T23:25:21.040 回答
3

您需要在请求中添加标头:

Accept: application/json

然后它应该工作。信不信由你,我必须阅读源代码才能弄清楚这一点……您可以在此处阅读相关片段。

编辑:显然,虽然这确实返回了项目的信息,但它不会返回刚刚排队的作业!这是一个已知问题。该错误是#13546

于 2013-10-24T22:23:08.847 回答