2026 OpenClaw 前端實戰:
遠端 Mac 聚合 Vite/Webpack 建置耗時並生成 PR 效能回歸摘要
合併前要看清production 建置 wall time是否回歸,但 Vite 與 Webpack 日誌難用同一口徑橫向對比。本文給出遠端 Mac Runner可複現串聯:落盤 build_metrics.json,對比基線分級閘道,OpenClaw 生成 pr_build_perf_summary.md,由 CI Webhook 或 PR 留言冪等回傳。延伸閱讀 Bundle 體積閾值 PR 摘要、import 圖譜 PR 摘要、esbuild/SWC Monorepo 矩陣。
01 痛點與目標
痛點一:兩套工具終端輸出格式不同,難用「慢百分之幾」一句話對齊。痛點二:整段日誌貼進 PR 易洩露絕對路徑與內網主機名。痛點三:把高權限 Git 權杖交給單一代理,稽核面過大。目標是以薄 schema聚合階段耗時與快取狀態,閾值分級後由 OpenClaw 只輸出短摘要;憑證拆成網關與 Git 兩類最小權限,寫入與推論分離。落地時可先從「只記總時長與三個最慢階段」做起,再逐步加上細粒度 phases,避免第一版就被維護成本拖垮。
02 採集方式對照:Vite 與 Webpack
只採集可機讀毫秒與階段名 slug,避免依賴 ANSI 色彩與外掛雜訊。遠端 Mac 上請鎖定 Node 小版本與 lockfile,並在 manifest 附 runner 標籤(含 Apple Silicon 機型),便於事後對照冷/暖快取。若 Monorepo 內同時存在 Vite 與 Webpack 應用,建議在 JSON 頂層加 appId 或 package,避免不同子專案報告互相覆寫;夜間全量與主線抽樣可分目錄存放,降低單次 artifact 體積。
| 工具 | 建議鉤子 | 注意 |
|---|---|---|
| Vite | 外掛 buildStart/closeBundle 打點或累計階段。 |
區分 dev 與 build;記錄 cacheDir 是否命中。 |
| Webpack | done 與 processAssets 間分段;必要時再裁剪 stats。 |
平行子工作多時以階段牆鐘為準,避免把 CPU 加總誤當單線程。 |
03 build_metrics.json 欄位解析
鍵名可依團隊微調,建議保留下列欄位以利 jq 與 OpenClaw 模板對齊。
| 欄位 | 含義 |
|---|---|
repo sha pr toolchain |
座標、提交、可選 PR 號;工具鏈與 Node 小版本、Runner 標籤含機型。 |
totalMs |
從入口指令到成功退出的牆鐘毫秒,不含上傳 artifact 的網路時間。 |
phases cacheHit |
phases 為 name+ms 陣列;cacheHit 解釋是否因快取未命中而變慢。 |
schemaVersion ciRunUrl |
契約版本號便於向後相容;可選 CI 執行頁連結(不含 Token),方便從 PR 跳回完整日誌。 |
① 階段名用英文 slug,避免本地化字串。② PR 內嵌摘要宜控制在數百 KB 內,其餘連結工件。③ 對基線須同一壓縮與 sourcemap 策略,否則耗時差異會混入 I/O。④ 同一 PR 多次 push 時以最新 SHA 覆寫摘要,舊版保留於工件供比對與稽核。
04 可執行腳本串聯(≥5 步)
build:metrics:production 建置後由 Node 寫入.openclaw/reports/${SHA}/build_metrics.json(建置腳本結束碼為零才寫入,失敗則另存build_failed.txt僅含錯誤類型與行數,避免把堆疊全文進 PR)。- CI:
jq empty驗證 JSON,失敗則非零退出。 - 拉取 main 綠建置基線,輸出
build_gate.json(level、reasons)。 - OpenClaw 讀取 metrics 與 gate,落地
pr_build_perf_summary.md;stdout 不列印任何金鑰。 fail則 job 標紅;warn則綠但觸發通知頻道。- 通知:HMAC Webhook 或
gh pr comment,正文附 artifact 連結。
目錄約定可與既有 Bundle 圖譜或體積閘道管線共用 .openclaw/reports/<sha>/ 前綴,便於同一 PR 多份機讀報告並行稽核;各檔案以檔名區分語意,避免互相覆蓋。
- 同一 SHA 觸發建置與摘要,避免合併後指標錯綁。
- 長構建可改夜間批次,主線只跑抽樣或閾值 warn。
- Mac 與 Linux 各跑一次,對照 Apple 堆疊與檔案系統差異。
05 閾值與告警分級
採總時長與最長階段雙軌對比基線:低於 warn 記 INFO;介於 warn 與 fail 標黃並輸出摘要;超過 fail 則紅。建議設最小絕對增量(例如總時長慢滿五百毫秒才算回歸),避免 CI 抖動誤傷。快取未命中應單獨標 warn 並附原因,勿與程式碼效能回歸混談。體積與耗時常同時劣化,可在摘要中並列「最慢階段」與「gzip 體積差」,必要時分開 gate,避免單一指標誤判。
06 CI Webhook 聯動與冪等
Webhook 負載建議含 sha、pr、gate.level 與摘要前兩百字,必要時附 artifact 下載路徑而非內嵌大段 JSON。服務端以常數時間校驗 HMAC,防重放可用短時間戳視窗;內網接收端應限制來源 IP 或 mTLS,避免誤把摘要 POST 到公網。PR 留言去重可用隱藏 HTML 註解鍵 <!-- openclaw-build-metrics:$SHA --> 或先查 API 是否已有同前綴留言。失敗重試採指數退避並設上限,避免合併潮打滿內部網關;若與 Slack/企業微信並行,請統一由一個 fan-out 服務轉發,避免重複告警。
07 OpenClaw 網關 Token 與最小權限
網關 Token僅用於呼叫受控模板與模型路由:綁定工作區、限速、停用任意網路抓取;生命週期短並支援按環境輪換。寫入 Git仍優先 GITHUB_TOKEN 並於 workflow 宣告 permissions: pull-requests: write,或使用細粒度 PAT 限定單一儲存庫且只開 PR 留言與 Contents 讀。勿把組織管理員或 workflow 寫權限交給 OpenClaw 執行層;網關與 Git 憑證分庫儲存,流水線日誌對兩類 Token 一律脫敏。fork PR 與不可信貢獻者情境下,寧可只上傳 artifact、由維護者手動觸發回傳,也不要在惡意 workflow 中暴露寫入權杖。Monorepo 併發相關的堆與 worker 上限,請另參考首段內鏈之 esbuild/SWC 對照表調參。
08 FAQ
為何不用終端全文做 diff?日誌含外掛雜訊與路徑抖動,版本升級後格式亦可能變動;薄 JSON 契約便於 jq 與代理按欄位裁剪,並利於長期儲存與稽核。
閾值怎樣少誤報?總時長與最長階段雙軌;相對基線設 warn/fail 兩檔,並設最小絕對增量毫秒。樣本單次偏離可先標記為「待觀察」,連續兩次再升級為 fail。
網關與 GitHub Token 分工?網關只負責模板與配額;寫 PR 仍用最小 scope 的 Git 權杖,分金鑰輪換。Rotate 時先換網關、驗證摘要無誤,再換 Git PAT,降低雙重故障窗口。
鎖檔 manifest → build_metrics.json → build_gate.json → OpenClaw Markdown → 冪等 PR/Webhook;網關與 Git 最小權限與逾時。遠端 Apple Silicon 節點見 購買公開頁免登入。