2026 OpenClaw 前端實戰:
遠端 Mac 對接 Cloudflare Pages Deploy Hook——冒煙、安全 Headers 巡檢與建置摘要回傳
適用對象:以 Cloudflare Pages 託管前端、希望在每次建置完成後自動驗證邊緣快取一致性、回應標頭合規與真機冒煙的團隊。本文與 Netlify 版對照:側重 CF Deploy Hook、快取失效策略、Headers 基線 diff(_headers/規則與實測標頭)、以及 curl 批跑預熱;OpenClaw 閘道在入站側做任務編排與失敗摘要回傳。延伸閱讀:Netlify Deploy Hook 串聯冒煙、CSP 與 Safari 清單、建置指標 PR 摘要、HTTP/3 與 curl 舉證、Service Worker 與快取發布、部署前冒煙與預檢。
2026-openclaw-cloudflare-pages-deploy-hook-remote-mac-howto.html(便於書籤、Runbook 與自動化內鏈收錄)。
01 為何在 CF Pages 上單獨談 Hook、快取與 Headers
Pages 建置成功只代表產物已上傳;全球邊緣上舊 HTML 仍可能被複用,而安全標頭既可能來自倉庫根目錄 _headers,也可能疊加 Transform Rules 或 Workers——與 Netlify「通知+單一邊緣行為」不同,你必須明確定義何時 Purge、驗證哪一層快取、以哪一份 JSON 作為 Headers 基線。把 Deploy Hook 接到長期在線的遠端 Mac,可在同一台 Apple 硬體上對 Safari WebKit 與 Chromium 跑輕量冒煙,並以腳本對生產 URL 做可重複的 curl 舉證,避免「我本地重新整理就好」的不可複現結論。若你也關心 QUIC/Alt-Svc,可平行參考 HTTP/3 驗收清單,把傳輸層與應用層 Headers 分開討論。
02 從 Pages Hook 到 OpenClaw Runner 的一跳
建議路徑:Cloudflare Pages Deploy Hook(或建置完成後的 Git 整合回呼)→ 你方 Ingress(OpenClaw 閘道)校驗簽章 → 立即 202 Accepted,非同步執行 scripts/cf-pages/openclaw-post-deploy.sh(與本機相同路徑)。Runner 內順序建議:(A)按需快取失效 → (B)curl 批跑+Headers diff → (C)Playwright 冒煙 → (D)build_summary 冪等 POST。與 Netlify 條目區分:日誌欄位用 cf_pages_deployment_id、cf_ray、cf_cache_status,便於與儀表板對齊;若站內另有 打包圖譜 PR 摘要,請勿把 CF 與 Netlify 的 deploy id 混寫在同一條冪等鍵。
03 可複現步驟(遠端 Mac 與筆電同腳本)
- 匯出脈絡:
GIT_SHA與CF_PAGES_COMMIT_SHA對齊;DEPLOY_URL填生產網域或本次 Preview;OPENCLAW_RUN_ID用uuidgen;密鑰僅注入 Runner 程序環境,不寫入倉庫。 - 快取失效:若全站靜態指紋變更,可對帳戶呼叫 Purge Everything;若僅部分路由更新,使用依 URL Purge 或建置流水線內已知清單,避免無謂清空全站。失效後等待數秒再進入 curl 階段。
- curl 批跑預熱:自
urls.txt(可由 sitemap 產生)以xargs -P或 GNU parallel 對每條 URL 執行curl -fsSI,收集狀態碼、retry-after、cf-cache-status;對 429/5xx 採指數退避+抖動,上限與 SLO 對齊。 - Headers 規則 diff:將回應標頭過濾為關心集(如
content-security-policy、strict-transport-security、permissions-policy),排序後寫入headers_observed.json,與headers_baseline.json(由_headers與規則匯出)做結構化 diff;僅回報新增/缺失/值變更,避免雜訊。 - 冒煙:
npx playwright test tests/smoke --project=webkit --project=chromium,失敗案例附 trace 路徑。若需釐清快取鍵,可搭配 SW 鍵差分摘要。 - 建置摘要回傳:寫入
.openclaw/reports/build_summary.json(schema: "build_summary/v1"、各階段duration_ms、headers_diff_failed、failed_cases);POST時帶Idempotency-Key: ${GIT_SHA}:cf-pages:${DEPLOYMENT_ID}:summary。
實務上可把 curl 與標頭擷取包成單一 Node 或 shell 函式,輸出欄位固定為 url、http_status、cf_ray、cf_cache_status、age,再餵給 diff 與儀表板;同一函式在 CI 乾跑與遠端 Mac 正式跑應得到相同契約,才能把「偶發邊緣不一致」收斂成可追的 ticket,而不是口頭描述。
04 OpenClaw 閘道側編排與失敗摘要
閘道負責:鑑權、限流、任務分片(避免單次 Hook 觸發重複全量 Purge),以及把 Runner 退出碼與 NDJSON 聚合為一條人類可讀失敗摘要(例如「Headers:CSP 缺少 nonce 來源;冒煙:結帳逾時」)。每行 NDJSON 建議含 phase(purge|curl_batch|headers_diff|smoke|callback)、attempt、error_class(cache|tls|assert)。僅對讀路徑自動重試;寫庫或支付沙箱用例須在新 deployment 上整組重跑。摘要與 JSON 一併 POST,IM 裡只貼摘要與連結,避免洩露 Token。
05 常見問題(Hook、快取與 Headers)
| 現象/碼 | 常見原因 | 處理要點 |
|---|---|---|
| Hook 已觸發但仍為舊內容 | 邊緣快取未失效或瀏覽器 SW 快取。 | 查 cf-cache-status 與 Purge 範圍;對照 SW 鍵差分摘要。 |
| Headers diff 全紅 | Preview 與 Production 規則不一致,或 Workers 注入標頭。 | 分環境基線;對同一 URL 固定 curl -H 'Host: …' 與解析路徑。 |
| 429/5xx 批跑 | Purge 後冷請求集中、源站限流。 | 降低 xargs -P 併發;退避後單 URL 串行複驗。 |
| 401/403 回呼 | 閘道 Token 輪替或 HMAC 時鐘漂移。 | 同步祕鑰庫;校時 NTP;最小權限 Scope。 |
與 Netlify 流程能共用嗎?可共用 Playwright 與 build_summary 契約;差異在 Hook URL、快取 API 與日誌欄位——建議依平台分目錄,避免把 NETLIFY_* 與 CF_* 混在同一 Idempotency 命名空間。細節可對照 Netlify 版 HowTo。