使用标题中的“location”信息检索使用API​​启动的Jenkins构建的id(jenkins 1.529的新功能)

时间:2013-09-09 13:40:13

标签: python jenkins

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

詹金斯的文档:

  

执行构建

     

要以编程方式安排新版本,请发布到此URL。如果   build有参数,发布到此URL并提供参数   表格数据。无论哪种方式,成功的排队将导致201   状态代码 ,位置HTTP标头指向项目的URL   队列 。通过轮询队列项的api / xml子URL,您可以   跟踪排队任务的状态。通常,任务将进行   通过一些状态转换,然后最终它变成了   取消(查找“已取消”布尔属性)或获取   执行(查找通常指向的“可执行”属性   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/

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

感谢。

2 个答案:

答案 0 :(得分:4)

我通过为我希望以编程方式进行交互的作业提供“ident”参数来解决这个问题。

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

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

然后我每隔N秒使用此队列ID轮询/queue/item/<queue_id>/api/json,等待jenkins在响应中提供内部版本号(它将在构建开始后进行)。您可以使用此内部版本号构建所需的网址/job/<job_name>/<build_number>

您实际上需要在jenkins作业中添加ident作为参数。这是一种痛苦,但它可靠地运作。

答案 1 :(得分:3)

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

Accept: application/json

然后它应该工作。信不信由你,我必须阅读消息来源来解决这个问题......你可以阅读相关的片段here

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