2026 OpenClaw 前端實戰:
Netlify Deploy Hook 串聯遠端 Mac——冒煙測試、死鏈巡檢與建置摘要回傳
適用對象:以 Netlify 託管靜態站或 SSR 轉接器的前端團隊,希望在「建置綠燈」之外,於上線後數分鐘內自動驗證路由、快取與 WebKit 行為,又不希望綁在單一筆電上。本文整理 Deploy Hook → 本機或遠端腳本鏈 的可複現步驟:暖站、Playwright 真瀏覽器冒煙、站內死鏈巡檢,最後將 build_summary 冪等回傳至 PR 或聊天。延伸可搭配 OpenClaw 冒煙與部署前檢查、Lighthouse、連結與無障礙門檻,以及 建置耗時 → PR 摘要,讓數字與敘述並陳。
01 為何 Deploy Hook 適合與 OpenClaw、遠端 Mac 並用
Netlify 能證明編譯通過,使用者仍可能在幾分鐘後遇到轉址錯誤、邊緣快取未更新或僅 Safari 觸發的互動問題。Deploy Hook 是平台提供的最小契約:代表「某次建置/發布流程已觸發或完成,請開始後續動作」。把訊號餵給常駐的遠端 Mac,就能在7×24 時段內用原生 WebKit 與穩定的圖形/瀏覽器工作階段跑自動化,不必擔心筆電闔蓋或睡眠中斷排程。
OpenClaw 適合同一台 POSIX 主機上編排 Playwright、curl 與小型 Node 工具。請把 Hook 當成入列工作,而非在 HTTP 連線內直接跑四十分鐘測試:入口快速回應(自架接收器可回 202 Accepted),實際檢查丟給背景 Worker,並以結構化日誌讓值班能用 deploy_id 對齊 CDN 與建置版本。
02 架構:從 Netlify 到回傳摘要
建置完成後,Netlify 可對您的 Build hook 發出 HTTP POST。請求應先抵達您掌控的入口(OpenClaw 閘道、極小的 Cloudflare Worker,或 Mac 上帶 TLS 的 nginx)。入口驗證共享密鑰、寫入 OPENCLAW_RUN_ID,再 exec 到 ~/runners/netlify-post-deploy.sh(或 Node 同等物)。
Runner 解析 DEPLOY_URL:正式網域或由 NETLIFY_AUTH_TOKEN 搭配 DEPLOY_ID 查 Deploy Preview。建議依序三階段:(A)暖站探測、(B)冒煙+連結圖、(C)build_summary 回傳。每階段寫入 .openclaw/reports/deploy_hook.ndjson,必要時再上傳物件儲存,避免把 Netlify 或 Git 的長效憑證塞進同一台筆電腳本。
03 可複現腳本串聯(本機與遠端同一套)
將下列骨架複製到版本庫 scripts/netlify/openclaw-post-deploy.sh,chmod +x 後,把 Netlify Hook(或 GitHub Action 內的 curl)指向會觸發該腳本的入口。同一檔案可在開發者 Mac 乾跑驗證,也可在租用的遠端 Mac 上當正式 Runner。
- 匯出情境:
GIT_SHA、NETLIFY_DEPLOY_ID、OPENCLAW_RUN_ID(例如uuidgen),以及從 Hook JSON 或 CLI 對應的DEPLOY_URL。 - 暖站與重試:對
$DEPLOY_URL/healthz或輕量文件循環curl -fsS取狀態碼,直到 200 或逾時;遇 429/連線重設時採指數退避+抖動,上限例如單次睡眠不超過 30 秒,避免打爆邊緣。 - 冒煙:
npx playwright test tests/smoke --project=webkit --project=chromium,環境變數帶入DEPLOY_URL;建議總時長控制在十分鐘內,以免誤把長測同步掛在 Hook 呼叫鏈上。 - 死鏈巡檢:以
/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。 - 回傳:以標頭
Authorization: Bearer $OPENCLAW_GATEWAY_TOKEN與Idempotency-Key: ${GIT_SHA}:${NETLIFY_DEPLOY_ID}:summaryPOST 至 PR Webhook 或 Slack 相容端點;重複 Hook 投递不應洗版。
若發布前還需更細的體感與效能門檻,請改在上線前流程套用前文內鏈的 Lighthouse/連結/a11y 文章;Deploy Hook 鏈則專注上線後最快能代表使用者感受的訊號。
04 結構化日誌欄位、失敗重試與值班衛生
寫入 NDJSON 的每一行應帶相同鍵名,方便儀表板與人類對齊:
- ▸
ts(ISO-8601)、level、openclaw_run_id、git_sha、netlify_deploy_id、phase(warmup|smoke|links|callback)。 - ▸
attempt(從 1 起算)、http_status或curl_exit、duration_ms、url(遮罩 token)、error_class(dns、tls、timeout、assert)。 - ▸Playwright 相關另加
playwright_project與trace_path指標,勿把祕鑰貼進日誌正文。
重試策略:僅對冪等讀取的暖站 GET 在遇到 429、502、503 與連線重設時退避重試(例如基底 2 秒、係數 1.8、最多六次並加抖動)。冒煙本體不應在未知狀態下無限重跑;應先確認 deploy_id 是否變更或快取是否已刷新,再決定是否重試整包。
數值型耗時可再匯出到建置指標流水線,與內鏈的 PR 建置摘要做法對照,方便產品與工程同看「變慢」與「失敗」兩條線。
05 Hook 與回傳常見 HTTP 4xx/5xx FAQ
| 狀態碼 | 常見意義 | 建議檢查 |
|---|---|---|
| 400 | 回傳 JSON 不符合契約或缺必填欄位。 | 於 CI 用 JSON Schema 驗證 build_summary/v1;伺服器錯誤本文以 warn 記錄且去敏。 |
| 401/403 | Hook HMAC/Bearer 不符,或 Git 留言權杖範圍不足。 | 輪替 OPENCLAW_GATEWAY_TOKEN;確認細粒度 PAT 含 PR 留言所需 scope;若用 JWT 注意時鐘偏移。 |
| 404 | Deploy Hook 網址過期、站台刪除或分支 slug 錯誤。 | 於 Netlify 重新產生 Hook、更新祕鑰庫並搜尋 README 內舊連結。 |
| 409 | 冪等鍵碰撞——回傳端將重複建置視為重複摘要。 | 若內容一致可視為成功;否則調整 Idempotency 命名空間。 |
| 429 | Netlify API 或 GitHub 次要速率限制。 | 退避、分環境 Hook、Deploy 中繼資料快取數分鐘再查。 |
| 502/504 | 邊緣冷啟動、無伺服器函式喚醒或 TLS 中間盒。 | 放寬暖站截止時間;自遠端 Mac 與本地各跑一次 curl -v 對照 DNS 與憑證鏈。 |
Deploy Hook 應直接呼叫長測嗎?
僅適合極輕量 ping。長時 Playwright 應進佇列由 Worker 執行,避免 Netlify 與入口長連線逾時;自架接收器請盡快結束 HTTP 並改以日誌/回呼追蹤。
Safari 專屬問題會出現在哪?
多見於 WebKit 斷言、轉址後資產網域與第三方 Cookie 策略。務必在 Apple 硬體跑 --project=webkit;Linux 容器無法取代真實 Safari 訊號。