Перейти к содержимому

TeamCity

Читает версию анонимно из GET /app/rest/server/version, если credentials не настроены, либо из GET /app/rest/server — точки входа, на которую первым делом указывает собственный справочник REST API TeamCity, — если настроен токен.

targets:
- id: teamcity-main
product: teamcity
address: https://teamcity.example.com
# credentials: teamcity-pat # опционально, см. ниже

Аутентификация — необязательна, но если её добавить, её легко перепутать местами

Заголовок раздела «Аутентификация — необязательна, но если её добавить, её легко перепутать местами»

Credentials не нужны. TeamCity отдаёт /app/rest/server/version кому угодно, обычным текстом — 2026.1.1 (build 222577), — даже при выключенном гостевом входе. Подтверждено на свежих серверах от 2017.2 до 2026.1 без созданного администратора и на семи продакшн-инстансах (от 2024.03 до 2026.1.3) без credentials. Это не гостевой доступ: /app/rest/server и эндпоинты только для гостей на тех же серверах отклоняются. Пока TeamCity запускается, он отвечает на любой путь HTML-страницей обслуживания с кодом 200, поэтому ответ должен целиком соответствовать YYYY.N[.N] (build N), иначе таргет падает как неразбираемый.

Если токен настроен, проба читает вместо этого /app/rest/server — вы попросили аутентифицированное чтение, там же есть internalId, а неверный токен остаётся видимой ошибкой авторизации, а не маскируется анонимным путём. /app/rest/server анонимно никогда не доступен: свежий инстанс отвечает 401 с вызовами и Basic, и Bearer. У TeamCity два разных вида токена, подтверждено вживую, и они работают только как противоположные виды credential:

  • Одноразовый bootstrap-токен суперпользователя, который свежий сервер выводит в лог при первом запуске, работает только как Basic — пустой username, токен вместо пароля. Отправленный как обычный Authorization: Bearer, он отклоняется.
  • Personal access token обычного пользователя (Profile → Access Tokens — способ, которым реально аутентифицируется долгоживущая автоматизация) — наоборот: подтверждено на семи реальных продакшн-инстансах, он работает как Bearer и однозначно отклоняется как Basic («Incorrect username or password» даже с пустым username).
credentials:
# bootstrap-токен — Basic, пустой username
teamcity-bootstrap:
kind: basic
username: ""
password: "${TEAMCITY_BOOTSTRAP_TOKEN}"
# personal access token — Bearer
teamcity-pat:
kind: bearer
value: "${TEAMCITY_TOKEN}"

Используйте personal access token в любом долгоживущем конфиге — bootstrap-токен предназначен для того, чтобы его отозвали сразу после первого входа.

  • version — полная строка, например 2026.2 (build 238924)
  • extra.buildNumber
  • extra.internalId — только с токеном (/app/rest/server)

Сверяется с NVD и БДУ ФСТЭК, если настроен блок cve:.

Отсутствует — у endoflife.date нет календаря для TeamCity (подтверждено 404). Пока только инвентаризация.