2026 OpenClaw 프론트 실전:
Netlify Deploy Hook → 원격 Mac 스모크·깨진 링크 순찰·빌드 요약 회수
대상: Netlify 프론트 팀. 배포 직후 품질 신호를 노트북 없이 받으려면 Deploy Hook → 동일 스크립트 체인(워밍업·스모크·깨진 링크·build_summary)을 원격 Mac에 두면 됩니다. slug 예: 2026-openclaw-netlify-deploy-hook-smoke-test-remote-mac.html. 함께 읽기: 배포 전 스모크, Lighthouse·링크·a11y, 빌드 메트릭 PR 요약.
01 왜 Deploy Hook 옆에 OpenClaw·원격 Mac인가
빌드 성공 뒤에도 라우팅·엣지 캐시·Safari(WebKit) 이슈는 늦게 드러납니다. Build hook은 “배포 완료” 신호이고, 7×24 원격 Mac에 넘기면 절전과 무관하게 실제 WebKit에서 Playwright를 돌릴 수 있습니다.
OpenClaw는 curl·Node·Playwright를 한 호스트에 묶기 좋습니다. 훅은 빠른 응답 후 백그라운드로 처리하고, 긴 스위트는 워커 큐로 넘기세요.
02 아키텍처: Netlify → Ingress → 콜백
Netlify는 Build hook으로 POST하고, Ingress(OpenClaw 게이트웨이·Worker·nginx 등)가 비밀 검증 후 OPENCLAW_RUN_ID를 붙여 엔트리 스크립트를 실행합니다.
러너는 DEPLOY_PRIME_URL(프로덕션 또는 API로 조회한 Deploy Preview)을 고정한 뒤 (A) 워밍업 → (B) 스모크·링크 그래프 → (C) build_summary POST 순으로 진행하고, 단계별 로그는 .openclaw/reports/deploy_hook.ndjson에 적습니다.
03 로컬·원격 동일 재현 스크립트 체인
scripts/netlify/openclaw-post-deploy.sh를 저장소에 두고 훅은 Ingress만 치게 합니다. 로컬 드라이런과 상시 원격 Mac에 동일 파일을 씁니다.
- 컨텍스트 export:
GIT_SHA,NETLIFY_DEPLOY_ID,OPENCLAW_RUN_ID(uuid 등), 훅 본문 또는 CLI에서DEPLOY_URL매핑. - 워밍업·재시도:
curl -fsS로 헬스 문서 폴링. 429·502·503에는 지수 백오프(예: 2초 시작·1.8배·캡 30초·최대 6회)와 지터. - 스모크:
npx playwright test tests/smoke --project=webkit --project=chromium를DEPLOY_URL기준으로 실행. 훅을 실수로 동기 호출해도 되도록 전체 10분 이내를 권장합니다. - 링크 순찰: sitemap·화이트리스트에서 내부만 확장,
url·상태·리다이렉트·content_type기록, 필수 경로404·루프는 실패. - build_summary JSON:
.openclaw/reports/build_summary.json에schema: "build_summary/v1",git_sha,netlify_deploy_id,smoke_ms,link_scan_ms,failed_cases[],exit_code를 합칩니다. - 콜백: PR Webhook·Slack 호환 URL로 POST할 때
Authorization: Bearer $OPENCLAW_GATEWAY_TOKEN와Idempotency-Key: ${GIT_SHA}:${NETLIFY_DEPLOY_ID}:summary로 중복 훅 전달을 흡수합니다.
배포 전 UX는 링크한 Lighthouse 글을 앞에 두고, 훅 체인은 빠른 회귀 신호에 집중하세요.
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은 마스킹,error_class(dns|tls|timeout|assert). - ▸해당 시
playwright_project, 비밀 대신trace_path포인터.
재시도: 워밍업 GET만 429·502·503·리셋에 백오프. 변이 스모크는 deploy_id·캐시 확인 후 재실행.
05 훅·콜백 HTTP 4xx / 5xx FAQ
| 상태 | 의미 | 점검 |
|---|---|---|
| 400 | 콜백 JSON 형식 오류·필수 필드 누락. | CI에서 JSON Schema 검증, 응답 본문은 warn·비밀 마스킹. |
| 401 / 403 | 훅 HMAC·Bearer 불일치, PR 코멘트 PAT 권한 부족. | 토큰 순환, PAT에 PR 쓰기 권한, JWT면 시계 스큐. |
| 404 | 오래된 훅 URL·삭제된 사이트·브랜치 슬러그 오류. | 훅 재생성, 금고 값 갱신, 문서 내 구 URL grep. |
| 409 | 멱등 충돌·동일 배포 요약 중복. | 본문이 같으면 성공 취급, 다르면 멱등 네임스페이스 조정. |
| 429 | Netlify API 또는 GitHub 보조 한도. | 백오프·훅 샤딩·메타 5분 캐시. |
| 502 / 504 | 엣지 콜드스타트·Functions 기동·TLS 중간 장비. | 워밍업 연장·DNS 확인·원격/로컬 curl -v 비교. |
훅이 테스트를 직접 호출해도 되나요?
핑 수준이면 가능합니다. 긴 Playwright는 워커 큐로 넘기고 Ingress는 빨리 닫으세요.
Safari 전용 실패는 어디에 남나요?
WebKit 프로젝트 단언과 리다이렉트된 정적 호스트에 자주 남습니다. --project=webkit은 Apple 실기에서 돌리는 것이 신호가 가장 정직합니다.