检索远程触发的jenkins作业的id

nem*_*moo 24 jenkins

我通过http POST请求从jenkins外部触发参数化Jenkins:

我在作业配置中启用了可以从外部触发作业,我可以通过向jenkins发送带有如下内容的请求来触发它:

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

触发作业创建会返回成功的201 CREATED http响应.

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

有没有可靠的方法来获取创建的工作的ID?

mor*_*wai 35

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

现在,如果您添加api/json(或api/xml依此类型)到它的末尾(所以在这个示例中它将是http://localhost:8666/jenkins/queue/item/39/api/json),那么您将获得一个文档,其中包含给定作业的构建ID.对JSON所检索的对象具有executable属性,这反过来又具有numberurl属性.number是给定作业的构建ID(这里url是35),是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/"
  }
}
Run Code Online (Sandbox Code Playgroud)

要注意两件事:

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

:

  ...
  "url" : "queue/item/39/",
  "why" : "In the quiet period. Expires in 2.4 sec",
  "timestamp" : 1423993879845
}
Run Code Online (Sandbox Code Playgroud)

  • 谢谢您的回答!这部分地为我工作。我使用的是v1.559,如果我使用NON参数化构建,并使用/ build,则可以获取该位置。当我使用buildWithParameters时,出现错误……是预期的。在参数化的版本中,我没有得到正确的位置。如果使用/ build,则获得作业URL;如果使用buildWithParameters,则Location标头中没有任何内容。有任何想法吗? (2认同)
  • "默认情况下,在将项目添加到队列之前需要几秒钟才能获得构建ID" - 实际上它可能需要几秒,几小时或几天!在Jenkins找到并指定执行者来运行该作业之前,该作业没有内部版本号. (2认同)

kha*_*son 11

更新:

其他的答案矿后〜8月加入.我当时没有意识到响应中的位置标题.对某些情况来说,这听起来不错.也就是说,基于答案中的警告和评论(特别是围绕参数化构建),似乎这个答案在某些情况下仍然具有一些实用性.

原始答案:

不幸的是,他们并没有尽可能简单明了.也就是说,通过像id这样的信息返回JSON响应.

但是,我相信一个可靠但非常重要的解决方法是利用您用来触发构建的URL中的cause参数,并在该原因中添加您可以在以后解析以确定您的唯一文本从您的自动化中触发它.

为了进一步使特定作业唯一化,如果多个同时运行,即使从您的自动化,也包括在cause参数内部的某种类型的唯一ID(它可能只是来自您的RDBMS或类似的序列ID ).

然后,您可以使用JSON API获取有关您远程触发的作业的信息.同样,它有点间接,但可行:

点击表单的网址:

http://<server>:<port>/job/<jobname>/lastBuild/api/json
Run Code Online (Sandbox Code Playgroud)

您可以添加?pretty=true到浏览器中的漂亮打印,以提高人类的可读性.

这将获得最后一次构建的JSON.它将包含actions属性中的cause属性,并且在那里(在另一个名为shortDescription的嵌套属性中)您将找到您添加的cause参数(如果这是您触发的构建之一).

您可以解析特殊静态文本和生成的ID,以查看它们是否匹配.如果他们这样做,那么你也可以从JSON中获取Jenkins id(搜索嵌套的buildNumber).

如果该构建要么根本不是由您的自动化触发,要么是,但是ID不匹配,您可以重复N-1构建的过程,直到找到您要查找的内容.

JSON的形式如下:

http://<server>:<port>/job/<jobname>/<buildNumber>/api/json
Run Code Online (Sandbox Code Playgroud)