OpenClaw на фронтенде в 2026 году:
Deploy Hook → смоук, мёртвые ссылки и сводка сборки на удалённом Mac
2026-openclaw-netlify-deploy-hook-smoke-test-remote-mac.htmlДля кого материал: команды на Netlify, которым нужна постдеплойная уверенность без привязки к закрытому ноутбуку. Ниже — цепочка Deploy Hook → один и тот же скрипт на удалённом Mac: прогрев боевого URL, смоук и обход мёртвых ссылок в реальных браузерах, затем обратная передача build_summary в чат или тред PR. Дополнительно: смоук и проверки перед деплоем, Lighthouse, ссылки и базовая доступность, метрики сборки → сводка в PR — когда нужны числа рядом с текстом отчёта.
01 Зачем Deploy Hook рядом с OpenClaw на удалённом Mac
Сборка на Netlify доказывает, что код компилируется; пользователи через несколько минут всё равно видят ошибки маршрутизации, устаревший edge-кэш и баги только в WebKit/Safari. Deploy Hook — минимальный контракт платформы: «деплой завершился — реагируйте». Если передать этот сигнал на удалённый Mac с работой 7×24, вы получаете настоящие движки Safari, стабильные сессии и автоматизацию, которая не обрывается, когда кто-то закрыл крышку ноутбука.
OpenClaw удобен там, где один POSIX-хост оркестрирует Playwright, curl и небольшие утилиты на Node. Считайте хук постановкой задачи в очередь, а не приглашением выполнять сорок минут тестов внутри одного HTTP-запроса: быстро подтвердите приём, запустите долгую работу в фоне и пишите структурированные логи — дежурному проще сопоставить падения по netlify_deploy_id, чем открывать десять дашбордов.
02 Архитектура: от Netlify до callback
После сборки Netlify может вызвать ваш Build hook методом POST. Запрос должен попадать в ingress под вашим контролем: шлюз OpenClaw, лёгкий Worker на периметре или nginx на Mac с TLS. Ingress проверяет общий секрет (X-Webhook-Secret или HMAC), выставляет OPENCLAW_RUN_ID и запускает, например, ~/runners/netlify-post-deploy.sh (или эквивалент на Node).
Runner определяет целевой URL — прод-домен или deploy preview через API Netlify с NETLIFY_AUTH_TOKEN и DEPLOY_ID. Дальше три фазы по порядку: (A) прогрев, (B) смоук и граф ссылок, (C) POST сводки. Каждая фаза дописывает строку NDJSON в .openclaw/reports/deploy_hook.ndjson, чтобы логи уходили в S3 или прикреплялись к CI без передачи секретов Netlify в GitHub Actions.
03 Цепочка скриптов: локально и на удалённой машине
Положите скелет в репозиторий как scripts/netlify/openclaw-post-deploy.sh, сделайте исполняемым и направьте хук Netlify (или curl из GitHub Actions) на ingress, который запускает этот файл. Один и тот же сценарий годится для сухого прогона на Mac разработчика и для «боевого» прогона на арендованном удалённом Mac.
- Контекст:
export GIT_SHA="${COMMIT_REF:-$(git rev-parse HEAD)}",export NETLIFY_DEPLOY_ID="${DEPLOY_ID:-unknown}",export OPENCLAW_RUN_ID="$(uuidgen)";DEPLOY_URL— из JSON тела хука или вывода Netlify CLI. - Прогрев с повторами: цикл
curl -fsS -o /dev/null -w '%{http_code}' "$DEPLOY_URL/healthz"(или лёгкая страница) до200или дедлайна; пауза с экспоненциальным backoff с потолком ~30 с, чтобы не забивать edge при серии 429. - Смоук:
npx playwright test tests/smoke --project=webkit --project=chromiumпротивDEPLOY_URL; держите набор короче десяти минут, чтобы случайный синхронный вызов хука не упёрся в таймаут. - Мёртвые ссылки: обход внутренних якорей из
/sitemap.xmlили фиксированного списка маршрутов; фиксируйтеurl,final_status,redirect_chain,content_type. Этап падает, если обязательный маршрут отдаёт404или зацикленный редирект. - JSON сводки: объедините длительности Playwright и краулера в
.openclaw/reports/build_summary.jsonс полямиschema: "build_summary/v1",git_sha,netlify_deploy_id,smoke_ms,link_scan_ms,failed_cases[],exit_code. - Callback: POST JSON на webhook комментария PR или совместимый с корпоративным мессенджером endpoint с заголовками
Authorization: Bearer $OPENCLAW_GATEWAY_TOKENиIdempotency-Key: ${GIT_SHA}:${NETLIFY_DEPLOY_ID}:summary, чтобы повторная доставка хука не спамила треды.
Для более глубоких UX-проверок до этой цепочки используйте материал по Lighthouse и ссылкам из вводного абзаца; сам post-deploy hook лучше держать узким: быстрые регрессии, которые заметят клиенты в первую очередь.
04 Поля логов, повторы и дисциплина оператора
Каждая строка NDJSON должна содержать одинаковый набор ключей — и дашборды, и люди говорят на одном языке:
- ▸
tsв ISO-8601,level,openclaw_run_id,git_sha,netlify_deploy_id,phase(warmup|smoke|links|callback). - ▸
attempt(с единицы),http_statusилиcurl_exit,duration_ms,url(без токенов в query),error_class(dns,tls,timeout,assert). - ▸При смоуке —
playwright_projectи путь кtrace_pathвместо вставки секретов в stdout.
Повторы: идемпотентные GET-прогревы имеет смысл повторять при 429, 502, 503 и обрыве соединения с джиттером и экспоненциальным backoff (например база 2 с, множитель 1,8, не более шести попыток). Мутирующие сценарии смоука не ретраить вслепую: перезапускайте набор только после смены deploy ID или подтверждённой инвалидации кэша. Числовые дельты длительности фиксируйте в сводке рядом с текстом отчёта, чтобы продакт видел регрессии времени и причину падения в одном сообщении.
05 FAQ: типовые 4xx и 5xx для хуков и callback
| Код | Что обычно значит | Что проверить |
|---|---|---|
| 400 | Невалидный JSON в callback или отсутствуют обязательные поля. | Валидируйте build_summary/v1 JSON Schema в CI; тело ошибки сервера — уровень warn без секретов. |
| 401 / 403 | Несовпадение HMAC или bearer, слишком узкие OAuth-скоупы для комментария в PR. | Ротация OPENCLAW_GATEWAY_TOKEN; для GitHub — PAT с pull_requests: write; при JWT проверьте сдвиг часов. |
| 404 | Устаревший URL хука, удалённый сайт Netlify или неверный slug ветки. | Пересоздайте хук, обновите vault, прогрепайте документацию на старые URL. |
| 409 | Коллизия идемпотентности — дубликат деплоя отфильтрован. | Считайте успехом, если сводки совпадают; иначе расширьте пространство имён ключа. |
| 429 | Лимиты Netlify API или вторичные лимиты GitHub при всплеске сводок. | Backoff, разнесение хуков по окружениям, кэш метаданных деплоя на 3–5 минут. |
| 502 / 504 | Холодный старт edge, «просыпающиеся» serverless, TLS-посредники. | Увеличьте дедлайн прогрева; сверьте DNS для preview-ветки; сравните curl -v с удалённого Mac и локально. |
Нужно ли вызывать тесты прямо из Deploy Hook?
Только для тривиального пинга. Длинные прогоны Playwright держите в воркере или очереди, чтобы Netlify и ваш ingress не держали полуоткрытые HTTP-сессии минутами. Для собственного приёмника разумно сразу отвечать 202 Accepted.
Где проявляются баги только в Safari?
В ассершенах WebKit и на редиректах к CDN-хостам ассетов. Запускайте --project=webkit на Apple-железе: контейнеры на Linux не заменят сигнал для реальных пользователей Safari.
Кормите Netlify Hooks стабильным Mac-runner
Запускайте сценарии OpenClaw при каждом деплое, храните trace Playwright на реальных GPU Apple и не теряйте ночи из‑за ноутбука, который уснул. Тарифы и помощь доступны без обязательного входа; когда минут CI не хватает — аренда или покупка выделенной мощности под браузерную автоматизацию и постоянные webhook-триггеры.