2026 OpenClaw 프론트 실전:
Vercel Deployment Hook → 원격 Mac 스모크·Headers·빌드 요약
대상: Vercel 배포 후 공개 URL에서 CSP·HSTS·Permissions-Policy를 증명해야 하는 팀. Deployment Hook은 빌드 신호일 뿐이므로 OpenClaw 러너를 원격 Mac에 두고 스모크·헤더·build_summary를 한 셸로 재현합니다. 슬러그 2026-openclaw-vercel-deployment-hook-smoke-headers-summary.html. 참고 Netlify 훅·CF Pages·CSP.
01 OpenClaw와 Hook URL
Deployment Hook은 빌드 신호일 뿐 실제 호스트의 middleware·ISR 합성 응답을 보장하지 않습니다.
- 스테일: 워밍 없이 콜드 ISR만 보면 통과 오판.
- 헤더:
vercel.json과curl -sSI불일치 시 게이트 무력화. - 브라우저: 원격 Mac에서
webkit·chromium병행이 안전.
의사결정 표: 임시 수동 QA와 자동 훅 러너를 비교합니다.
| 주제 | 임시 수동 QA | 훅 + OpenClaw 러너 |
|---|---|---|
| 트리거 | 수동은 슬랙 뒤 기억 의존. | 프로덕션마다 동일 스크립트. |
| 증거 | 채팅 캡처. | NDJSON·헤더 diff·build_summary+배포 ID. |
| 비밀 | 급하게 광범위 공유. | Ingress 단일 비밀·토큰은 훅 밖. |
재현 배선 단계.
- Settings → Git → Deploy Hooks에서 Production URL 발급·주기적 회전.
- Ingress만 노출·HMAC/Bearer 검증·
202·OPENCLAW_RUN_ID로~/runners/vercel-post-deploy.sh에 전달. DEPLOY_URL·배포 ID·커밋 SHA 내보내고 호스트 허용 목록 외 거절.scripts/vercel/openclaw-post-deploy.sh를 단일 진실원으로 SSH·로컬 동일 경로.- 배포 단위 잠금으로 웹훅 재시도 시 Playwright 중복 방지.
02 스모크·Headers 검사 스크립트 계약
세 단계마다 .openclaw/reports/deploy_hook.ndjson에 phase·http_status·duration_ms·openclaw_run_id 한 줄씩 기록합니다.
(A) 워밍: curl -fsS로 200+HTML 마커까지 백오프·429 지터.
(B) Headers: headers_expect.json과 curl -sSI를 비교해 headers_diff.txt·필수 지시 누락 시 실패.
(C) 스모크: BASE_URL=$DEPLOY_URL로 npx playwright test tests/smoke --project=webkit --project=chromium를 실행합니다. Apple Silicon에서는 ITP 변화를 먼저 보려 WebKit 순서를 권장하고 실패 시 .openclaw/traces/에 trace를 남깁니다.
03 실패 요약 회수 패턴
성공·실패 모두 build_summary/v1 형태로 build_summary.json에 기록하고 실패 시 failed_phase·stderr·exit_code를 같이 둡니다.
POST 시 Idempotency-Key: ${VERCEL_GIT_COMMIT_SHA}:${VERCEL_DEPLOYMENT_ID}:summary로 재시도 중복을 막고 토큰은 로그에서 마스킹합니다. 대시보드 연동은 빌드 메트릭 PR 요약 필드와 맞춥니다.
워밍 상한(예: 5분)·x-vercel-id·cf-ray 기록.
headers_diff.txt를 아티팩트에 붙여 리뷰 대조.
OPENCLAW_GATEWAY_TOKEN은 큐·요약 API만·번들·로그에 타사 토큰 금지.
04 FAQ
| 증상 | 가능 원인 | 확인할 것 |
|---|---|---|
| 401 | Ingress 비밀·Authorization 불일치. | 훅 재발급·금고·문서 동기화. |
| 헤더 불일치 | Middleware·vercel.json·ISR. |
배포 ID별 curl·DNS 전에 diff 축소. |
| WebKit만 실패 | ITP·저장소·쿠키. | trace·쿠키 jar 재시도. |
| POST 429 | GitHub 보조 한도. | 백오프·코멘트 재사용·재시도 간격. |
curl이 Playwright를 대체하나요?
아니요. curl은 전송 헤더와 리다이렉트 체인을 빠르게 증명하고 브라우저는 CSP·혼합 콘텐츠·저장소를 다르게 적용합니다. curl로 1차 게이트를 두고 DOM·스토리지는 Playwright로 이어지는 편이 안전합니다.