Ошибки в зависимостях и lockfile, всплывающие в конце основного пайплайна, стоят дорого. Удалённый Mac с постоянно включённым OpenClaw — удобный префлайт-узел перед TeamCity: шлюз на loopback принимает исходящий webhook, за секунды проверяет секрет и ставит задачу, затем в изолированном каталоге выполняет «сухие» установки и сравнение lockfile и отправляет компактную сводку обратно в сервер или во внешний канал. Официальная документация: docs.openclaw.ai. Рядом по теме: Jenkins Generic Webhook и префлайт, повторы и восстановление OpenClaw; полный список материалов — раздел блога (без входа).

Установка, шлюз и идея onboarding (Node 22+)

Зафиксируйте Node 22.16+ или 24 LTS и глобальный пакет openclaw. Команда openclaw doctor должна завершаться без критичных замечаний. После первичного мастера выполните openclaw onboard --install-daemon, чтобы обработчик webhook жил в LaunchAgent и переживал перезагрузку без ручного входа в графическую сессию.

В launchd plist явно пропишите PATH, при необходимости NODE_BINARY и NODE_EXTRA_CA_CERTS — так среда демона совпадёт с вашей SSH-сессией и не «поедет» версия npm при префлайте. Токен панели OpenClaw, общий секрет для webhook и отдельный токен TeamCity REST храните в разных файлах с правами 600; в репозиторий их не коммитьте.

Приём HTTP для автоматизации привяжите к 127.0.0.1; наружу опубликуйте только узкий путь через TLS-терминацию (Caddy, nginx) или SSH reverse tunnel с того же хоста, где крутится агент TeamCity, если политика безопасности это допускает. Health-проба: периодический curl к маршруту здоровья шлюза из того же plist или отдельного LaunchAgent.

Матрица: шлюз × webhook × рабочая копия

Аспект Рекомендуется Избегать
Слушатель 127.0.0.1 + обратный прокси только на путь webhook Панель и handler на 0.0.0.0 без сегментации
Токены REST только на запись комментария к сборке нужного проекта Персональный полный токен администратора в скрипте
События TeamCity Успешные сборки целевой ветки и один buildTypeId Все статусы и все конфигурации в один endpoint
Файловая изоляция Отдельный каталог или git worktree на доставку Общий клон с артефактами параллельных job

TeamCity: webhook, проверка тела и идемпотентность

В разделе Webhooks (глобально, в проекте или шаблоне) создайте запись на событие завершения сборки. URL укажите на ваш публичный HTTPS. В теле JSON или в форме используйте параметры сборки, например %teamcity.build.id%, %build.vcs.number%, %teamcity.build.branch% — так обработчик однозначно свяжет префлайт с записью в TeamCity.

Проверка: передайте секрет в пользовательском заголовке (например X-Webhook-Secret) и сравните его после чтения сырого тела, константным временем, до разбора JSON — иначе прокси с перекодированием или лишний пробел в консоли TeamCity сломают доверие. Для повторных доставок TeamCity сохраните идемпотентный ключ (build id + тип события) в памяти или лёгком хранилище TTL, чтобы не запускать второй полный префлайт.

Чеклист шагов

  1. Проверьте curl с тестовым JSON на handler и ответ 2xx на /health шлюза.
  2. Создайте webhook только для нужной конфигурации и ветки; сохраните секрет и проверьте одну тестовую сборку.
  3. В коде: валидация заголовка → короткий 200 → фоновая очередь префлайта.
  4. Shallow clone в WORK_DIR/build-<id>; префлайт; git diff по lockfile или сухой npm ci.
  5. Сводка: TeamCity REST или второй HTTP; при ошибке сети и 5xx — паузы 2 / 4 / 8 с, не более трёх попыток, с лимитом времени curl.

Префлайт, lockfile и пример макросов

После извлечения ревизии из JSON выполните git fetch --depth=1 и checkout. Для Node — npm ci --dry-run или pnpm install --frozen-lockfile --dry-run; для PHP — composer validate и при необходимости composer install --dry-run. Результат lockfile оформите как краткий текст: изменился ли файл, длина diff, ненулевой код выхода инструмента.

# Плейсхолдеры TeamCity в теле webhook (пример)
{
  "buildId": "%teamcity.build.id%",
  "revision": "%build.vcs.number%",
  "buildTypeId": "%system.teamcity.buildType.id%",
  "branch": "%teamcity.build.branch%"
}

Обратная сводка: компактный JSON или одна строка в комментарий к сборке через REST. Не вкладывайте в сводку секреты и полные логи — только build id, статус префлайта и ссылку на артефакт при необходимости.

Частые ошибки и FAQ

Постоянный 401 при правильном «на бумаге» секрете

Сверьте имя заголовка без опечаток; удалите невидимые символы при вставке в TeamCity; убедитесь, что edge-прокси не режет пользовательские заголовки.

Таймаут webhook и лавина повторов

Укоротите синхронный путь до валидации и постановки в очередь; клон и установки — только асинхронно. Смотрите вкладку доставок webhook в TeamCity.

403 от REST TeamCity

Сузьте роль пользователя токена до проекта; проверьте, что токен не истёк и не заблокирован политикой SSO.

Разный Node у демона и в терминале

Абсолютный путь в NODE_BINARY в plist; расширенный разбор — в материале блога «OpenClaw: установка и типовые ошибки на удалённом Mac» (поиск по заголовку в каталоге блога).

Где смотреть логи

log stream с фильтром по подписи процесса; StandardOutPath в plist; на стороне TeamCity — статус исходящего запроса. В приложении логируйте build id и correlation id, не секреты.

Зачем выносить префлайт на удалённый Mac и как купить узел

Стабильный Apple Silicon с предсказуемым диском и сетью снижает шум от очередей общего пула агентов: префлайт отлавливает конфликты версий и дрейф lockfile до дорогих шагов на Windows/Linux-раннерах. Тот же Mac может hostить и агент TeamCity, и шлюз OpenClaw, если разделить корни кеша и рабочие каталоги.

MacPull даёт аренду удалённого Mac с SSH; страницы центра помощи, покупки и выбора конфигурации и главная доступны без обязательного входа — можно заранее оценить сценарий и оформить узел под префлайт.

Итог: связка TeamCity Webhook → OpenClaw на loopback с минимальными токенами, изолированным клоном и ограниченными повторами сводки даёт воспроизводимый префлайт без лишней attack surface. Другие сценарии OpenClaw и CI — в коллекции статей блога (кнопка ниже).

Префлайт TeamCity на удалённом Mac с OpenClaw

Помощь и SSH, покупка узла, главная и подборка OpenClaw в блоге — без обязательной авторизации.