Подтвердить что ты не робот

Получить идентификатор удаленной работы jenkins

Я запускаю параметризованные Jenkins из-за пределов jenkins через HTTP-запрос POST:

Я включил в настройке задания, что задание может быть запущено извне, и я действительно могу вызвать его, отправив jenkins запрос с таким содержимым:

POST
http://myJenkins.com/myJob/buildWithParameters?token=MYTOKEN Параметр: SCREEN_SIZE: 27

Запуск создания задания возвращает успешный ответ http-ответа.

Моя проблема в том, что я не знаю идентификатор созданного задания сборки. Я хочу следить за состоянием работы. Для этого мне нужно знать идентификатор. В противном случае, если я просто возьму последнюю сборку этой работы, я мог бы принять неправильную работу.

Есть ли надежный способ получить идентификатор созданного задания?

4b9b3361

Ответ 1

Update:

Добавлен другой ответ через 8 месяцев после моего. В то время я не знал о заголовке местоположения. В некоторых случаях это звучит неплохо. При этом, основываясь на предостережениях в ответе и комментариях (особенно в отношении параметризованных сборок), похоже, что этот ответ по-прежнему имеет некоторую полезность для некоторых случаев.

Оригинальный ответ:

К сожалению, они не делают это настолько простым, насколько это возможно. то есть, скажем, возвращать ответ JSON с информацией, подобной идентификатору.

Тем не менее, я считаю, что надежный, хотя, конечно, нетривиальный, обходной путь для этого заключается в том, чтобы использовать параметр причины в URL-адресе, который вы используете для запуска сборки, и в этой причине добавить уникальный текст, который вы можете впоследствии проанализировать до определите, что вы вызвали его из своей автоматизации.

Чтобы дополнительно определить конкретное задание, в случае, если несколько запусков в одно и то же время, даже из вашей автоматизации, также включают уникальный идентификатор некоторого типа (это может быть просто идентификатор последовательности из вашей РСУБД или аналогичной) внутри вызвать параметр.

Затем вы можете использовать JSON API для получения информации о задании, которое вы запускаете удаленно. Опять же, это несколько косвенное, но выполнимое:

Нажмите URL-адрес формы:

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

Вы можете добавить ?pretty=true, чтобы печатать его в браузере для лучшей читаемости.

Это даст вам JSON последней сборки. Он будет содержать атрибут причин в атрибуте actions, а там (в другом вложенном атрибуте с именем shortDescription) вы найдете параметр причины, который вы добавили, если это была одна из созданных вами сборок.

Вы можете проанализировать как специальный статический текст, так и свой сгенерированный идентификатор, чтобы увидеть, соответствуют ли они. Если они это сделают, вы также можете получить Jenkins id из JSON (найдите buildNumber, который вложен).

Если эта сборка либо не запускается вашей автоматизацией вообще, либо была, но ID не соответствует, вы можете повторить процесс для сборки N - 1, пока не найдете то, что ищете.

То, что JSON будет иметь следующий вид:

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

Ответ 2

Так как Jenkins 1.519, enqueuing build отвечает URL-адресом в Location, указывая на элемент в очереди сборки:

$ 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), тогда вы получите документ, который будет содержать идентификатор сборки для данного работа. Для json у получаемого объекта есть атрибут executable, который, в свою очередь, имеет атрибуты number и url. number - это идентификатор сборки для данного задания (здесь 35), а url - это URL страницы сборки jenkins.

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

знать 2 вещи:

  • Неактивные элементы в очереди сборки собирают мусор через несколько минут, поэтому вы должны получить идентификатор сборки ASAP
  • по умолчанию требуется несколько секунд между добавлением элемента в очередь до получения идентификатора сборки. За это время атрибуты executable и canceled будут отсутствовать, а why будет недействительным. Вы можете изменить это поведение в "Дополнительные параметры проекта" вашей конфигурации задания, изменив настройку "Тихий период" или в глобальной конфигурации jenkins.

:

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

Ответ 3

Оказывается, что сборки имеют исходный идентификатор очереди. Кроме того, вы можете запросить только сборку с идентификатором очереди и опросить ее до тех пор, пока не получите результат, потому что 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()

(Примечание. Я не мог использовать &xpath=//build[queueId={queueId}]/number/text() в URL-адресе, потому что "primitive XPath result sets forbidden; implement jenkins.security.SecureRequester")

Он также хромает, как опрос очереди api для "исполняемой" сборки. Одним из преимуществ является то, что конечная точка будет сохраняться дольше - пока сборка не будет удалена, по сравнению с произвольным временем (которое составляет около 5 минут).

Ответ 4

Я смог использовать 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());

Ответ 5

Требуется добавить в morgwai ответ с помощью заголовка Location.

Я просто решил эту проблему. Ключ после заголовка "Местоположение" должен опросить запись очереди заданий до тех пор, пока она не будет иметь "исполняемую" запись, которая дает номер задания, который был запущен.

Я даю полный ответ на аналогичный вопрос, который я видел первым, который не полностью ответил на проблему:

fooobar.com/info/413112/...

JSON из записи очереди заданий Jenkins с исполняемой записью:

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