Настройка webhook-триггера YouTrack
Считайте триггер частью поставки, а не личной автоматизации: один HTTPS URL на шлюз OpenClaw переживёт смену Xcode, вывод машины из пула и рост числа параллельных веток.
- Условие. Привяжите триггер к узкому событию: переход в состояние вроде «Ready to build», изменение согласованного поля или метки, чтобы шум из истории задачи не забивал очередь.
- URL. Укажите стабильный путь вида
https://gateway.example/openclaw/v1/youtrack/webhook(иллюстративно). Держите хост и TLS на инфраструктурном уровне, а не на ноутбуке разработчика. - Секрет. В UI JetBrains задайте длинный случайный секрет (практика документации — не короче 32 символов энтропии); храните копию только на шлюзе в файле с правами вроде
0440— см. секреты и минимальные права на узлах MeshMac. Не кладите секрет webhook в образы сборщиков. - Тело. Включите в полезную нагрузку идентификатор задачи, человекочитаемый заголовок, проект, ссылки на репозиторий и целевую ветку — всё, что нужно воркеру без дополнительного запроса к YouTrack на горячем пути.
- Ответ шлюза. После аутентификации и постановки в очередь отвечайте
200или204быстро; тяжёлая работа остаётся во внутренней очереди.
Ограничьте параллельные входящие соединения и размер тела на краю, чтобы пики активности в трекере не вытеснили другие интеграции на том же хосте.
Секрет, заголовки и подпись по сырому телу
Сначала аутентификация, потом JSON. Типичный путь JetBrains — передать общий секрет в Authorization: Bearer … или в согласованном пользовательском заголовке; если ваша конфигурация добавляет подпись по байтам тела, вычисляйте HMAC-SHA256 от точного raw body и сравнивайте в постоянном времени.
- Прочитайте сырое тело до любого JSON-парсера; отключите «умное» пересобирание тела в middleware.
- Для статического секрета сравните буферы через
timingSafeEqual(или эквивалент в вашем рантайме). - Для HMAC не логируйте секрет и полный payload; достаточно длины тела, маршрута и обезличенного
correlation_id. - При провале —
401; при семантическом «не наш кейс» после успешной аутентификации можно200с коротким полемignoredво внутреннем логе.
Опционально отбрасывайте слишком старые метки времени в payload (окно 2–5 минут), если JetBrains передаёт время события, чтобы снизить риск повторов replay с украденного архива трафика.
Маршрутизация и мультиузел
Маршрут — контракт между «что сказал YouTrack» и «что имеет право выполнить любой узел MeshMac». Одна таблица в конфиге OpenClaw сопоставляет тип события нормализованной build_job.
- Извлеките
issue_id, проект, стабильную ссылку на задачу и поля репозитория или пользовательского поля с SHA ветки. - Соберите
idempotency_keyиз идентификатора доставки триггера или детерминированного хешаissue_id + action + минутное_окно. - Положите в общую очередь поля для скрипта:
repo,ref,correlation_id; при необходимостиpreferred_mesh_node_idдля редких лейнов с GPU, но избегайте жёсткой привязки к одному железу. - Узлы публикуют завершение только на шлюз с полями
mesh_node_id,duration_ms,exit_code, усечённыйlog_tail— дальше шлюз делает broadcast в Slack, Mattermost, Teams или второй webhook, не открывая каждому Mac исходящий доступ к YouTrack.
Так вы получаете замкнутый цикл: тикет → сборка на любом свободном Mac → единый канал статуса → краткий ответ в задачу при сбое, без гонок «кто первый дернул API».
Повторы, backoff и ротация токена
Исходящие вызовы REST YouTrack для комментария со сводкой ошибки должны жить на шлюзе и разделять политику с чат-webhook: при 429 уважайте Retry-After, иначе экспоненциальный backoff base·2^n с джиттером и жёстким потолком попыток на correlation_id. Сериализуйте комментарии по одной задаче, чтобы параллельные узлы не удвоили трафик при инциденте.
На 401 от REST не крутите бесконечный цикл: зафиксируйте инцидент, остановите исходящую очередь для YouTrack, выполните ротацию permanent token по runbook (новый токен только в файле шлюза, перезагрузка процесса, проверка smoke-комментария). Ротацию webhook-секрета и PAT разводите по разным календарям; узлы сборки PAT не хранят.
Для согласованной политики ретраев входящих доставок от YouTrack см. очередь и повторы: 200 после долговременной записи в хранилище очереди, чтобы джиттер повторов триггера не плодил дубликаты джобов.
FAQ
- Дубли комментариев в задаче после redeploy шлюза
- Чаще всего потерян дедуп по
build_idили шлюз не видит стабильное хранилище состояний. Включите короткое окно дедупликации по пареissue_id + exit_code + commitперед вызовом REST. - Статус в чат пришёл, а в YouTrack — тишина
- Разделите каналы: broadcast мог пройти, а REST уперся в 403 по проекту или в исчерпанный лимит. Проверьте область токена, роль пользователя токена и отдельный лог исходящей очереди с телом ошибки без секретов.
- Нужен ли отдельный сервис аккаунт YouTrack на каждый Mac?
- Нет и нежелательно: один технический пользователь или токен на шлюзе упрощает аудит и ротацию; Mac остаются без долгоживущих секретов трекера.
Кратко
Итог: один шлюз OpenClaw, webhook YouTrack с длинным секретом, проверка заголовка или HMAC по сырым байтам, общая очередь MeshMac, единый broadcast, краткая сводка в задачу при ошибке и управляемые retry с ротацией токена — минимальный каркас для малой команды с несколькими сборочными Mac.
Публичные страницы без входа
Главная, индекс блога, справочный центр и тарифы и покупка открываются без регистрации — удобно заранее оценить, сколько узлов MeshMac нужно под шлюз и стабильный контур YouTrack.
Закройте цикл «тикет → сборка → статус» без хаоса webhook
Дополнительные узлы MeshMac дают параллельные iOS/macOS сборки при одном входе YouTrack: секрет триггера и PAT остаются на шлюзе, очередь честно раздаёт джобы, дежурные видят предсказуемый поток. Перед заказом откройте страницу тарифов и покупки (без входа в аккаунт), центр помощи по доступу, главную и индекс блога — спланируйте пропускную способность шлюза и размер пула, затем оформите покупку, когда контур YouTrack → OpenClaw → MeshMac будет готов к продакшену.