Netlify · Deploy Hook · OpenClaw · Удалённый Mac · 2026

OpenClaw на фронтенде в 2026 году:
Deploy Hook → смоук, мёртвые ссылки и сводка сборки на удалённом Mac

14.04.2026 Фронтенд / релизная автоматизация 10 мин чтения
Пример постоянного slug: 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.

  1. Контекст: 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.
  2. Прогрев с повторами: цикл curl -fsS -o /dev/null -w '%{http_code}' "$DEPLOY_URL/healthz" (или лёгкая страница) до 200 или дедлайна; пауза с экспоненциальным backoff с потолком ~30 с, чтобы не забивать edge при серии 429.
  3. Смоук: npx playwright test tests/smoke --project=webkit --project=chromium против DEPLOY_URL; держите набор короче десяти минут, чтобы случайный синхронный вызов хука не упёрся в таймаут.
  4. Мёртвые ссылки: обход внутренних якорей из /sitemap.xml или фиксированного списка маршрутов; фиксируйте url, final_status, redirect_chain, content_type. Этап падает, если обязательный маршрут отдаёт 404 или зацикленный редирект.
  5. 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.
  6. 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.

Удалённый Mac 7×24 · Safari и Chromium в автоматизации

Кормите Netlify Hooks стабильным Mac-runner

Запускайте сценарии OpenClaw при каждом деплое, храните trace Playwright на реальных GPU Apple и не теряйте ночи из‑за ноутбука, который уснул. Тарифы и помощь доступны без обязательного входа; когда минут CI не хватает — аренда или покупка выделенной мощности под браузерную автоматизацию и постоянные webhook-триггеры.

Триггеры 7×24 Смоук WebKit Браузерная автоматизация
Mac под Deploy Hook и QA