Отслеживание хода сборки с помощью TeamCity REST API
Я использую API REST TeamCity (7.0), чтобы позволить разработчикам запускать пользовательские сборки. Я добавляю сборку в очередь следующим образом:
http://teamcity/httpAuth/action.HTML-код?add2Queue=[buildTypeId] & name=[propName]&value=[propValue]
мой вопрос в том, как я лучше всего могу отслеживать прогресс только что запущенной сборки. Вызов REST не возвращает никакой информации о идентификаторе сборки, назначенном сборке, поэтому, даже если я опрошу список сборок (запущенных/завершенных), я не буду знать, если один из их я вызвал. Потенциально может быть несколько сборок для одного и того же buildTypeId в очереди, поэтому мне нужен способ отделить тот, который я ищу.
Я где-то читал предложение о том, что вы можете добавить свойство сборки с уникальным значением для каждой сборки, которую вы помещаете в очередь, а затем позже опросите список сборки и найдите его с этим точным значением свойства. Однако я не нашел способа перечислить свойства для сборок, поэтому я все еще застрял. Этот вызов REST делает не предоставляем информацию о свойствах:
http://teamcity/httpAuth/app/rest/builds-?locator=buildType: [buildTypeId]
любые предложения о том, как это решить? В идеале я хотел бы знать, находится ли сборка в очереди, запущена ли она, и когда это будет сделано, я хотел бы получить статус. Однако самое главное-знать, сделано ли это и каков статус.
3 ответов
после небольшого исследования я придумал решение для этого, которое, кажется, работает нормально:
я узнал, что, хотя вы не получили никакой информации о пользовательских свойствах сборки с помощью " / builds/?locator=buildType: X " вызов, вы можете извлечь идентификатор сборки для каждой из сборок в этом списке, а затем выполнить другой вызов REST, чтобы получить более подробную информацию об одной конкретной сборке. Остальные звонки выглядят так:
http://teamcity/httpAuth/app/rest/builds/id:{0}
ответ от этого вызова даст вам "объект сборки", который содержит список свойств сборки, среди прочего.
мое решение для отслеживания прогресса сборки было таким:
когда сборка добавляется в очередь TeamCity, я сначала добавляю свойство в URL-адрес под названием "BuildIdentifier". Значение - это просто идентификатор GUID. Я передаю этот идентификатор обратно клиентскому приложению, а затем клиент начинает опрос сервера, запрашивая состояние сборки с этим конкретным идентификатором. Этот затем сервер выполняет некоторые шаги, чтобы определить текущий этап сборки:
1: Проверьте, выполняется ли сборка. Я получаю список запущенных сборок с вызовом " / builds?locator=running: true", выполните итерацию по сборкам и используйте идентификатор сборки для запроса подробностей REST API. Затем я просматриваю детали для каждой запущенной сборки, ища сборку с соответствующим свойством "BuildIdentifier" к тому, которое я получил от клиента. Если есть совпадение в одной из запущенных сборок I отправьте ответ с сообщением о том, что сборка выполняется в X процентах (свойство PercentageComplete объекта сборки) клиенту, который отслеживает ход выполнения. Если совпадение не найдено, я перейду к Шагу 2.
2: Проверьте, закончено ли это: сначала получите последний список сборки с помощью " / builds/?locator=buildType: X " вызов. Затем сделайте то же самое, что и на шаге 1, и извлеките X последних сборок из списка (я выбрал 5). Чтобы ограничить количество вызовов REST, я устанавливаю предположение, что сборка будет в последних 5 сборках, если она будет завершена. Затем я ищу совпадение на BuildIdentifier, и если я его получаю, я возвращаю статус сборки (FAILED, SUCCESS и т. д.).
3: Если на шаге 1 или 2 не было соответствия BuildIdentifier, я могу предположить, что сборка находится в очереди, поэтому я возвращаю это как текущее состояние.
на стороне клиента я опрашиваю сервер для статуса каждые X секунд, пока статус говорит, что сборка либо в очередь или бег.
надеюсь, что это решение может быть полезно, если есть кто-то еще с такой же проблемой там! Я бы подумал, что отслеживание прогресса запущенной сборки является довольно распространенной задачей, если вы используете TeamCity REST API.
на Очередь Строит REST api-лучший способ выполнить это, но был доступен только с версии 8.1.
-
чтобы начать сборку, отправьте запрос POST в
~/httpAuth/app/rest/buildQueue
такой{ buildType: { id: "bt667" }, branchName: "master", properties: { property: [ { "name": "Property", "value": "test" } ] } }
-
ответ содержит href, который можно использовать для проверки состояния сборки.
{ ... "href": "/httpAuth/app/rest/buildQueue/taskId:49337", ... }
чтобы проверить состояние очереди сборки, отправьте запрос GET в href, указанный в ответе из Шага 1.
Это огромное улучшение по сравнению с предыдущим API.
поскольку TeamCity 8.1, REST API получил выделенный способ запуска сборки и отслеживания результатов сборки в очереди намного проще, поскольку запрос очереди сборки возвращает ссылку на построенную в очереди сборку, которая позже может быть использована для отслеживания текущего состояния сборки. Подробности смотрите в разделе документация TeamCity.