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

检索远程触发的jenkins作业的id,jenkins,Jenkins,我正在通过http POST请求从Jenkins外部触发参数化Jenkins: 我在作业配置中启用了可以从外部触发作业的功能,我可以通过向jenkins发送包含以下内容的请求来触发作业: 张贴 参数:屏幕尺寸:27 触发作业创建将返回成功创建的http响应 我的问题是我不知道创建的构建作业的id。我想监控工作的状态。为了做到这一点,我需要知道id。否则,如果我只接受该作业的最新版本,我可能会接受错误的作业 是否有可靠的方法获取所创建作业的id?更新: 在我死后约8个月,又加了一个。当时我不知道响

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

我在作业配置中启用了可以从外部触发作业的功能,我可以通过向jenkins发送包含以下内容的请求来触发作业:

张贴
参数:屏幕尺寸:27

触发作业创建将返回成功创建的http响应

我的问题是我不知道创建的构建作业的id。我想监控工作的状态。为了做到这一点,我需要知道id。否则,如果我只接受该作业的最新版本,我可能会接受错误的作业


是否有可靠的方法获取所创建作业的id?

更新:

在我死后约8个月,又加了一个。当时我不知道响应中的位置标题。在某些情况下,这听起来确实是一个不错的选择。也就是说,根据答案中的警告和注释(特别是关于参数化构建的注释),这个答案在某些情况下似乎仍然有一些实用性

原始答案:

不幸的是,他们没有把这件事说得那么直截了当。i、 例如,返回一个JSON响应,其中包含id之类的信息

然而,我相信一个可靠的,但肯定不是琐碎的解决方法是利用URL中的原因参数来触发构建,并在该原因中添加唯一的文本,您可以稍后解析该文本以确定您是从自动化中触发的

为了进一步唯一化特定作业,如果多个作业在同一时间运行,即使是从您的自动化中运行,也应在原因参数中包含某种类型的唯一ID(它可能只是RDBMS或类似系统中的序列ID)

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

点击表单的URL:

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

自Jenkins 1.519以来,将生成排队时会在
位置
中显示一个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
属性,该属性依次具有
number
url
属性
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。在此期间,
    可执行文件
    已取消
    属性将丢失,
    为什么
    将不为空。通过修改“静默期”设置或jenkins全局配置,可以在作业配置的“高级项目选项”中更改此行为
:


结果显示生成具有原始队列ID。此外,您可以仅查询具有队列ID的生成并轮询它,直到得到结果,因为404通常意味着它已排队

将队列ID从位置标头中拉出,例如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>
“http://{jenkins}job/{job}/api/xml?tree=builds[number,queueId]&xpath=//build[queueId=\“{queueId}\]”;
411
39
从这个结果中,您可以使用xpath
/build/number/text()

(注意,我无法在url中使用
&xpath=//build[queueId={queueId}]/number/text()
,因为
“禁止原始xpath结果集;实现jenkins.security.SecureRequester”


它与轮询队列api以获得“可执行”构建一样蹩脚。一个优点是端点将持续更长时间,直到构建被删除,而不是任意时间(大约5分钟)

我能够使用Java Jenkins 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());
jenkinserver-jenkinserver=newjenkinsserver(newURI(“http://yourJenkinsServer:8080/"));
JobWithDetails smokeTestJob=jenkinsServer.getJob(“您的JobName”);
Map jobParams=newhashmap();
QueueReference=smokeTestJob.build(jobParams);
做{
睡眠(2000L);
queueItem=jenkinsServer.getQueueItem(queueReference);
日志(“作业仍在队列中”+queueItem.getExecutable());
}while(queueItem.getExecutable()==null);
Build Build=jenkinserver.getBuild(queueItem);
while(build.details().isBuilding()){
日志(“作业仍在运行”);
线程。睡眠(10000L);
}
日志(“Result=“+build.details().getResult());

希望使用位置标题添加到morgwai答案

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

我首先看到的一个类似问题没有完全回答这个问题,我给出了完整的答案:

来自Jenkins作业队列条目和可执行项的JSON:

{
    "_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
}

您能否详细说明如何添加
原因
参数?我搜索了Jenkins文档,但找不到此参数的任何引用。您可以在URL中指定此参数,用于通过curl或类似方式触发构建。e、 g.将参数
cause=foo_100
添加到URL。响应非常好!在生成历史记录中搜索唯一ID时,如果触发的作业执行仍在队列中,则可能会出现争用情况。您可以使用队列中包含的位置来避免这种情况
{
    "_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
}