2014-07-01 46 views
13

我从詹金斯的外面通过HTTP POST请求触发参数詹金斯ID:检索远程触发詹金斯工作

我在作业可以从外部触发任务配置中启用,我真的可以通过发送与詹金斯这样的内容的请求触发它:

POST
http://myJenkins.com/myJob/buildWithParameters?token=MYTOKEN 参数:SCREEN_SIZE:27

触发作业创建返回一个全成201 CREATED HTTP响应。

我的问题是,我不知道创建的作业ID。我想监视工作状态。为了做到这一点,我需要知道身份证。否则,如果我只是采取最新的工作,我可能会犯错误的工作。

有没有一种可靠的方法来获得创建的工作的ID?

回答

6

更新:

other answer加入〜8后矿井个月。我当时并未意识到位置头部的响应。这听起来像是某些情况下的不错选择。也就是说,根据回答和评论中的注意事项(尤其是参数化的版本),看起来这个答案在某些情况下仍然有用。

原来的答复:

不幸的是,他们没有让这个那么简单,因为它可以。即通过例如返回JSON响应以及诸如ID的信息。

但是,我相信一个坚实的,但肯定不平凡的,解决方法是将充分利用其在使用触发生成的URL 原因参数,并造成内,加独特的文本那您稍后可以解析以确定是否从自动化中触发了它。

为了进一步uniqueify的具体工作,如果多是在同一时间运行,甚至从你的自动化,还包括一些类型的唯一ID(它可能仅仅是一个序列ID从RDBMS或类似)在原因参数内。

然后,您可以使用JSON API获取有关工作你远程触发信息。再次,这是有些不直接,但可行的:

击中格式的URL:

http://<server>:<port>/job/<jobname>/lastBuild/api/json 

您可以添加?pretty=true到漂亮地打印它在浏览器中获得更好的易读性。

这会让你得到最后一次构建的JSON。它将包含原因行动属性中的属性,并在那里(在一个名为SHORTDESCRIPTION另一个嵌套属性),你会发现你添加的原因参数,如果这是你触发的构建之一。

你可以解析出特殊的静态文本和生成的ID,看看它们是否匹配。如果他们这样做,则可以从JSON中获得Jenkins id(搜索buildNumber,它是嵌套的)。

如果该构建完全不是由您的自动化触发的,或者是,但ID不匹配,您可以重复N-1构建的过程,直到找到所需内容。

这JSON是下面的形式:

http://<server>:<port>/job/<jobname>/<buildNumber>/api/json 
+0

你能否详细说明如何添加'cause'参数?我搜索了Jenkins文档并找不到对此参数的任何参考。 – Muxa

+0

这是您在通过* curl *或类似命令触发构建的URL中指定的参数。例如将该参数'cause = foo_100'添加到URL中。 – khampson

+0

伟大的回应!在搜索唯一ID的构建历史记录时,您的触发作业执行仍在队列中时,可能存在竞争状况。您可以通过使用201创建的响应中包含的位置避免这种情况,并基本上等待它离开队列。 – jpadams

29

由于詹金斯1.519,入队构建与在Location一个URL响应,指向你的项目在构建队列:

$ nc localhost 8666 
POST /jenkins/job/morgRemote/buildWithParameters?jenkins_status=1&jenkins_sleep=20&token=morgRemote HTTP/1.1 
Host: localhost:8666 

HTTP/1.1 201 Created 
Location: http://localhost:8666/jenkins/queue/item/39/ 
Content-Length: 0 
Server: Jetty(winstone-2.8) 

现在,如果您将api/json(或api/xml等)添加到其末尾(因此在此示例中它将是http://localhost:8666/jenkins/queue/item/39/api/json),那么您将获得将包含给定作业的构建ID的文档。对于json,检索到的对象具有executable属性,该属性又具有numberurl属性。 number是给定工作的构建ID(这里是35),url是jenkins构建页面的url。

{ 
    "actions" : [ 
    { 
     "parameters" : [ 
     { 
      "name" : "jenkins_status", 
      "value" : "1" 
     }, 
     { 
      "name" : "jenkins_sleep", 
      "value" : "20" 
     } 
     ] 
    }, 
    { 
     "causes" : [ 
     { 
      "shortDescription" : "Started by remote host 127.0.0.1", 
      "addr" : "127.0.0.1", 
      "note" : null 
     } 
     ] 
    } 
    ], 
    "blocked" : false, 
    "buildable" : false, 
    "id" : 39, 
    "inQueueSince" : 1423993879845, 
    "params" : "\njenkins_status=1\njenkins_sleep=20", 
    "stuck" : false, 
    "task" : { 
    "name" : "morgRemote", 
    "url" : "http://localhost:8666/jenkins/job/morgRemote/", 
    "color" : "red" 
    }, 
    "url" : "queue/item/39/", 
    "why" : null, 
    "cancelled" : false, 
    "executable" : { 
    "number" : 35, 
    "url" : "http://localhost:8666/jenkins/job/morgRemote/35/" 
    } 
} 

知道两两件事:

  • 在构建队列不活动的项目是几分钟后收集垃圾,所以你应该在默认情况下检索版本ID尽快
  • 需要项目之间几秒钟被添加到队列中直到获取构建ID。在此期间,executablecanceled属性将丢失,并且why将不为空。您可以通过修改“安静期”设置或在jenkins全局配置中,在作业配置的“高级项目选项”中更改此行为。

... 
    "url" : "queue/item/39/", 
    "why" : "In the quiet period. Expires in 2.4 sec", 
    "timestamp" : 1423993879845 
} 
+1

谢谢你的回答!这部分为我工作。我在v1.559上,如果我有一个非参数化的构建和使用/构建我得到的位置。当我使用buildWithParameters时,我得到一个错误...预计。在参数化版本上,我没有得到正确的位置。如果我使用/构建我得到作业网址,并且如果我使用buildWithParameters我在Location标头中什么都没有。有任何想法吗? –

+0

关于尽快检索构建ID,因为队列项目将被垃圾收集看到这个问题:https://issues.jenkins-ci.org/browse/JENKINS-31039 – KCD

+1

“默认情况下,它需要几秒之间的项目添加到排队,直到它获得生成ID“ - 实际上可能需要几秒钟,几小时或几天!直到詹金斯发现并指派执行人员来执行工作,该工作没有内部编号。 –

2

原来构建具有原始队列ID。此外,只能使用队列标识查询构建并轮询它,直到获得结果为止,因为404通常意味着它已排队。

从位置标题中拉出队列标识,例如39

/jenkins/queue/item/39/ 

与该队列号构建反复查询,直到你得到答案

"http://{jenkins}job/{job}/api/xml?tree=builds[number,queueId]&xpath=//build[queueId=\"{queueId}\"]"; 

<build> 
    <number>411</number> 
    <queueId>39</queueId> 
</build> 

从这个结果可以用XPath的拉动集结号/build/number/text()

(请注意,我可以在url中不使用&xpath=//build[queueId={queueId}]/number/text(),因为"primitive XPath result sets forbidden; implement jenkins.security.SecureRequester"

与轮询api的“可执行“构建。一个优点是端点将持续更长时间 - 直到构建被删除,与任意时间相比(似乎大约5分钟)。

+0

谢谢!此外,xpath的东西使事情变得更容易,不需要JSON解析器来找到正确的数据位。 – Frans

0

我能够使用Java Jenkins API来实现你正在寻找的东西。 https://github.com/jenkinsci/java-client-api

示例代码:

JenkinsServer jenkinsServer = new JenkinsServer(newURI("http://yourJenkinsServer:8080/")); 
JobWithDetails smokeTestJob = jenkinsServer.getJob("YourJobName");   
Map<String,String> jobParams = new HashMap<String,String>(); 
QueueReference queueReference = smokeTestJob.build(jobParams); 

do { 
    Thread.sleep(2000L); 
    queueItem = jenkinsServer.getQueueItem(queueReference); 
    log("Job still in queue"+queueItem.getExecutable()); 
    } while (queueItem.getExecutable() == null); 

Build build = jenkinsServer.getBuild(queueItem); 

while(build.details().isBuilding()){ 
    log("Job still running"); 
    Thread.sleep(10000L); 
} 

log("Result="+build.details().getResult()); 
0

想添加使用位置头morgwai答案。

我刚刚解决了这个问题。位置标题之后的键是轮询作业队列条目,直到它具有“可执行”条目,该条目给出已启动的作业编号。

我给出完整的答案,我首先看到的一个类似的问题,这并不能完全回答这个问题:

{ 
    "_class": "hudson.model.Queue$LeftItem", 
    "actions": [ 
     { 
      "_class": "hudson.model.CauseAction", 
      "causes": [ 
       { 
        "_class": "hudson.model.Cause$RemoteCause", 
        "addr": "10.20.30.60", 
        "note": null, 
        "shortDescription": "Started by remote host 10.20.30.60" 
       } 
      ] 
     } 
    ], 
    "blocked": false, 
    "buildable": false, 
    "cancelled": false, 
    "executable": { 
     "_class": "org.jenkinsci.plugins.workflow.job.WorkflowRun", 
     "number": 45, 
     "url": "http://192.168.115.187:8080/job/rf_systest/45/" 
    }, 
    "id": 95, 
    "inQueueSince": 1517342648136, 
    "params": "", 
    "stuck": false, 
    "task": { 
     "_class": "org.jenkinsci.plugins.workflow.job.WorkflowJob", 
     "color": "blue_anime", 
     "name": "rf_systest", 
     "url": "http://192.168.115.187:8080/job/rf_systest/" 
    }, 
    "url": "queue/item/95/", 
    "why": null 
} 

https://stackoverflow.com/a/48531874/9291603

JSON从詹金斯与可执行进入作业队列的条目