Отслеживание хода сборки с помощью 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.