2026 OpenClaw 前端實戰:
遠端 Mac 上網關 Webhook 收預覽 URL、串 Lighthouse 閾值與 PR 摘要
適用對象:已在遠端 Mac上跑 OpenClaw,希望建置完成後由網關 Webhook 單點收束預覽網址,再觸發 Lighthouse CLI、用庫內 閾值 JSON 做可重現裁決,並把短 Markdown冪等寫回 PR。固定 slug:2026-openclaw-remote-mac-preview-lighthouse-webhook.html。若還要把狀態寫進 Deployments 列,可併讀 GitHub Deployments × Lighthouse;排程告警見 Lighthouse 效能告警;供應商 Hook 冒煙見 Vercel Deployment Hook。
預覽 URL 常附帶部署保護、邊緣快取與 HTTP/3 協商差異;在 Linux 容器裡跑的 Lighthouse 與設計師手上的 Safari/WebKit 所見未必一致。OpenClaw 網關負責驗簽、速率限制、載荷正規化與任務 enqueue;實際量測放在租用的 遠端 Mac 上執行,可固定 Chromium 通道、對齊字型與合成器行為,並在同一台機器上再排短程 Playwright webkit 冒煙,補上實驗室指標以外的真機訊號。
本文路徑刻意不綁定單一 PaaS:只要 Webhook 能把 preview_url 與 GIT_SHA 送到網關,後續暖站、lighthouse CLI、perf/thresholds.json 比對與退出碼映射皆可版本庫化複製。
01 可複現 HowTo 步驟
- 網關 Ingress。在 OpenClaw 暴露
POST /hooks/preview-lighthouse(路徑自訂即可),強制X-OpenClaw-Signature或 mTLS;拒絕缺少Idempotency-Key的請求,避免雙送洗版。 - 解析載荷。讀取
preview_url、git.sha、pull_request.number(或供應商別名欄位),校驗僅https:且主機名在白名單;寫入佇列並附OPENCLAW_RUN_ID。 - Runner checkout。遠端 Mac 以該 SHA fetch,確保
perf/thresholds.json與腳本同源;環境變數注入預覽鑑權(例如PREVIEW_BEARER),勿寫進 PR 正文。 - 暖站。以與 Lighthouse 相同的 User-Agent 對 HTML 與主入口 JS 各做一次 GET;遇
429指數退避一次。 - Lighthouse CLI。範例:
lighthouse "${PREVIEW_URL}" --output=json --output-path="./.openclaw/reports/${OPENCLAW_RUN_ID}.lhr.json" --chrome-flags="--headless=new" --only-categories=performance(類別視團隊擴充)。 - 閾值閘道。以 Node 或小腳本讀取
lhr.json與perf/thresholds.json,產出gate.json(通過/失敗欄位與差額);映射退出碼後結束程序。 - 回傳 PR。將同一 Markdown 填入「更新既有 bot 留言」或 Checks 摘要;隱藏鍵建議
<!-- openclaw-lh-preview:${GIT_SHA} -->。可選追加一行 NDJSON 供網關儀表板。
OpenClaw 網關適合集中簽章驗證、金鑰旋轉與佇列反壓;Mac Runner 只處理長耗時瀏覽器工作,爆炸半徑較小、也方便稽核「誰在何時對哪個預覽網址做了量測」。
02 閾值 JSON 與退出碼對照
將門檻寫入版本庫的 perf/thresholds.json(鍵名與內部腳本對齊即可)。下列為建議欄位與程序退出碼語意,供合併佇列與網關告警規則共用。
| JSON 鍵/指標 | 建議語意 | 退出碼 |
|---|---|---|
performanceScore.min |
效能類別加權分數下限(0–100)。 | 未達成 → 2(回歸) |
metrics.LCP_ms.max |
最大內容繪製上限(毫秒)。 | 超標 → 2 |
metrics.CLS.max/TBT_ms.max |
版面穩定與主執行緒阻塞預算。 | 任一超標 → 2 |
schemaVersion 不符或 JSON 損毀 |
無法裁決。 | 1(設定/工件錯誤) |
| 頁面載入逾時、無頭瀏覽器崩潰、DNS 間歇 | 與產品效能無關的基礎設施不穩定。 | 3(建議重試排程,勿當作回歸) |
| 全指標在門檻內 | 通過閘道。 | 0 |
// perf/thresholds.json 範例片段
{
"schemaVersion": 1,
"performanceScore": { "min": 0.85 },
"metrics": {
"LCP_ms": { "max": 2800 },
"CLS": { "max": 0.08 },
"TBT_ms": { "max": 350 }
}
}
03 PR 可讀摘要模板(Markdown)
維持四至六行,只寫與基線的差額與裁決;連結到短效簽章的 lhr.json 或內部工件,勿貼長效 Cookie 或祕鑰。
<!-- openclaw-lh-preview:${GIT_SHA} -->
### Lighthouse 預覽閘道(OpenClaw/遠端 Mac)
- **預覽**:${PREVIEW_URL}
- **提交**:\`${GIT_SHA}\` · run \`${OPENCLAW_RUN_ID}\`
- **裁決**:${VERDICT}(perf ${PERF_SCORE},LCP ${LCP_MS} ms,CLS ${CLS},TBT ${TBT_MS} ms)
- **工件**:見 CI/網關工件 \`lhr.json\`/\`gate.json\`
04 Safari/WebKit 與自動化如何並陳
Lighthouse 預設以 Chromium 產出可重現的實驗室曲線,適合當合併閘道;但業務方常問「Safari 上是否也炸裂」。建議在同一台遠端 Mac上為通過閘道的提交再加一段極短的 Playwright webkit 冒煙(關鍵路由與 LCP 元素可見性),失敗類型與 Lighthouse 分開標籤,避免把 WebKit 佈局差異誤判成「效能回歸」。
05 FAQ:403、逾時
為何無頭 Chrome 對預覽網址拿到 HTTP 403?
常見原因包括:部署保護(Vercel/Netlify 等)、地理封鎖、或缺少與瀏覽器一致的 Authorization/Cookie。請把網關在冒煙測試已驗證可用的標頭與憑證,經環境變數注入 Runner,並讓暖站與 Lighthouse 共用同一組標頭;若策略允許,將遠端 Mac 的固定出口 IP加入允許清單,優於全域關閉保護。
Lighthouse 間歇逾時要怎麼分類?
以相同 OPENCLAW_RUN_ID 重試一次,同步調高等待上限並固定 Chromium 版本。若仍失敗,請以退出碼 3 結束並標記為基礎設施事件,讓合併佇列與 on-call 不把冷啟動與 CDN 抖動誤當效能回歸。