Как параметризировать требования агента в TeamCity

1391
Tonny Madsen

В TeamCity, можно параметризовать требования агента на основе проекта или создать параметры конфигурации? Например, может ли значение включать %...%замены?

Пример: у нас есть параметры проекта, env.XXX_VERSIONкоторые указывают необходимую версию продукта XXX во всех конфигурациях сборки проекта. Затем мы можем использовать это значение в соответствующих сценариях сборки проекта. (Со временем мы создаем копии этого проекта сборки для разных вариантов некоторых продуктов, от которых мы зависим, поэтому у нас теперь есть 12 разных проектов с разными значениями параметров). Теперь я также хотел бы включить требование агента из всех соответствующих конфигураций сборки в проект, чтобы рассматривать только используемые агенты. Но учитывая количество конфигураций сборки и количество вариантов проектов, я бы предпочел параметризовать требование по значению выхода env.XXX_VERSION. Это возможно?

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

2
Привет, Тонни, тебе когда-нибудь удавалось найти способ параметризовать требования? Я нахожусь в вашей описанной ситуации и хотел бы знать, что это действительно возможно. Leonid Usov 6 лет назад 0
Леонид (извините за поздний ответ), но нет, мы не нашли способ сделать это, кроме использования нового Kotlin DSL от 2018.1. Теперь мы фактически генерируем все конфигурации из кода Python, а затем «устанавливаем» их с помощью поддержки версионных настроек ... Tonny Madsen 5 лет назад 0
Хорошо, спасибо за ссылку, я не слышал об этой опции раньше. Началось расследование. А пока не могли бы вы вкратце описать, как именно использование версионных настроек позволяет подобрать динамический выбор агента? Вы как-то добавляете требования к агенту в виде жестко запрограммированного раздела конфигурации, автоматически создаваемого для каждой сборки? Leonid Usov 5 лет назад 0
(поздно, но ...) Именно так. Можно сказать, что мы просто разрешаем все переменные при генерации конфигураций. Конечно, это также означает, что мы можем делать все виды манипуляций, поэтому замены не должны быть «линейными». Tonny Madsen 5 лет назад 0
(поздно, но ...) Это также означает, что мы можем делать все виды манипуляций, поэтому замены не должны быть «линейными». Мы настроили генерацию как конфигурацию сборки с зависимостями от всех необходимых файлов, поэтому все, что изменит конфигурацию, автоматически запустит генерацию. Версионные настройки просты: конфигурация TeamCity автоматически сохраняется в VCS (например, Git). Это двусторонняя вещь: изменения в VCS будут обнаружены автоматически, и TeamCity выровняет свою конфигурацию. Таким образом, наш генератор "просто" сохраняет требуемый конф в VCS ... Tonny Madsen 5 лет назад 0

3 ответа на вопрос

2
kdtong

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

Почему бы не автоматизировать это с помощью TeamCity REST API? Сервер TeamCity имеет встроенный HTTP API, который вы можете использовать для редактирования / обновления (почти) любых полей, которые вы можете использовать с помощью веб-интерфейса.

Вы можете взаимодействовать с API, используя предпочитаемый язык сценариев, используя вызовы HTTP GET / PUT для получения и обновления значений. В этом случае, я думаю, что стоит потратить время на написание сценария, чтобы избежать необходимости проходить через пользовательский интерфейс для обновления всех конфигураций сборки, которые вы упомянули.

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

  1. Перебирайте проекты в TeamCity

Получить список проектов

curl -i -H "Accept: application/json" http://teamcity/httpAuth/app/rest/projects --user username:password 
  1. Получить XXX_VERSIONпараметр из проектов.

Переберите все проекты, получите все параметры и проанализируйте наш XXX_VERSION

curl http://teamcity/app/rest/projects/id:PROJECT_NAME/parameters 
  1. Задайте требование агента в конфигурациях сборки.

Для каждой конфигурации сборки в каждом проекте задайте требования агента к конфигурации сборки, используя проанализированное значение XX_VERSION

curl -X PUT http://teamcity/httpAuth/app/rest/buildTypes/<buildTypeLocator>/agent-requirements/<id> --user username:password 

Это общая идея, но не полная, потратив время на то, чтобы избавиться от этого сценария, вы сэкономите много времени на управлении им с помощью TeamCity UI.

https://confluence.jetbrains.com/display/TCD9/REST+API

I cannot see how this would work. Please explain further. Tonny Madsen 7 лет назад 0
Tonny, I updated with some additional details. You'll have to excuse me for it not being fully complete. Hope it helps or at least gets you along the right path. kdtong 7 лет назад 0
0
Animesh Patra

Вы можете принудительно настроить TeamCity на конкретном агенте, не отключая все остальные подключенные агенты.

Вот как:

Перейти к настройкам конфигурации сборки

Требования к следующему агенту

Теперь вам нужно установить явное требование для конкретного агента:

Имя параметра: system.agent.name

Состояние: равно

Значение: YOUR_SPECIFIC_AGENT_NAME

Также вы можете попробовать это:

Просмотрите: TeamCity -> Администрирование -> Агенты -> Выберите агент -> вкладка «Совместимые конфигурации», затем « Политика конфигурации текущего запуска», затем « Запустите только назначенные конфигурации» и нажмите « +» Назначить конфигурации и завершите.

Пожалуйста, дайте мне знать, если это поможет.

Спасибо.

Но, к сожалению, это потребует некоторого микроуправления, которого мы хотим избежать. У нас есть 10 агентов, где 8-9 могут быть использованы для конфигураций сборки конкретного проекта. Таким образом, нам нужно будет пройти 23 конфигурации сборки, умножить на 12 проектов и установить для каждого из них требование agent.name. Не так хорошо, как хотелось бы. И что еще хуже, мы получим больше агентов и будем постоянно менять конфигурацию всех агентов. Tonny Madsen 7 лет назад 0
-1
Andrew Kolbus

Я не смог найти способ параметризации значения с помощью %...%подстановок, но я нашел обходной путь. Это не идеально, но это работает для моего небольшого варианта использования.

Вариант использования: я создаю конфигурации сборки из шаблона и мне нужно, чтобы каждая конфигурация сборки работала только на одном конкретном компьютере. Я хотел сделать teamcity.agent.name equals %buildAgentName%в шаблоне, чтобы TeamCity подсказывал мне ввести параметр при создании конфигурации сборки из шаблона.

Решение: вместо того, чтобы использовать параметр, я просто помещаю строку, которая не соответствует ни одному из имен агентов, например, teamcity.agent.name equals replaceThisWithActualAgentNameв шаблоне. У меня не запрашивается параметр, но это предотвращает случайный запуск конфигурации сборки на неправильном компьютере, пока я не переопределю требование агента.

Я не уверен, что это решит ваш вариант использования, но я публикую его здесь на случай, если это будет полезно для кого-то другого.