onboard/doctor、LaunchAgent。延伸:Jenkins 預檢、CircleCI lockfile、重試;docs.openclaw.ai。
安裝、閘道與守護程序(Node 22 以上)
1)安裝:官方指令或 npm i -g openclaw;openclaw onboard 後跑 openclaw doctor 驗證憑證與埠。
2)閘道:僅綁 127.0.0.1,外層 TLS 終止;launchd 常駐並寫死 PATH/NODE_BINARY,與 SSH 互動一致。
3)目錄:每次 mktemp -d,結束刪除,避免並行覆寫暫存依賴。
- 閘道儀表板使用窄用途 Bearer;與 TeamCity 入站共享祕鑰、REST 寫回權杖分桶存放。
- 每 60 秒探針
/health,異常告警並保留最近日誌便於比對。
# 閘道健康(替換 PORT、GATEWAY_TOKEN)
curl -sS -o /dev/null -w '%{http_code}\n' \
-H 'Authorization: Bearer YOUR_GATEWAY_TOKEN' \
--connect-timeout 3 --max-time 10 \
http://127.0.0.1:PORT/health
痛點:筆電閘道易斷線、權杖過大難稽核、lockfile 漂移未前移而浪費佇列與頻寬。
決策矩陣:誰適合承載 CI 前置節點
| 面向 | 筆電或臨時 VM | MacPull 遠端 Mac |
|---|---|---|
| 可用性 | 休眠易斷 | 機房常駐、Webhook 穩 |
| 稽核 | 帳號混用 | 專用節點與日誌集中 |
| 鎖檔 | 環境漂移 | 固定 Node 對齊 TC |
TeamCity Webhook、令牌最小權限與簽章
於專案/型樣啟用 Webhook:在「建置開始」等事件 POST JSON(含 buildId、revision 等)。URL 用長隨機路徑當共享祕鑰,可再加標頭或 HMAC(對原始本文)。Personal Access Token 僅給讀建置與寫註解所需範圍。
| 項目 | 建議值/行為 | 目的 |
|---|---|---|
| 入站祕鑰 | 路徑 token 或標頭 | 防掃描 |
| REST | 僅寫註解/讀建置 | 最小權限 |
| Content-Type | application/json | 解析一致 |
| 逾時 | 10~30 秒 | 不阻塞佇列 |
| 來源 | 內網或固定 IP | 邊界 |
OpenClaw:lockfile 漂移掃描與依賴乾跑
Handler:驗祕鑰或 HMAC → 淺克隆與 checkout 修訂版 → git diff 看 lock 與 manifest → npm ci --dry-run → tail 取摘要。組態建置宜由上層型樣聚合觸發一次,避免子組態重試風暴。
# lockfile 與乾跑(示例) git diff --exit-code origin/main -- package-lock.json || true npm ci --dry-run 2>&1 | tail -n 60
- 子程序加
timeout,避免占滿外掛連線。 - 完整輸出落盤再以
tail做摘要,便於對時戳排查。
建置摘要回傳、失敗重試與日誌定位
預檢後以 curl 呼叫 TeamCity REST(註解或第二 Webhook),附 Bearer;路徑依版次文件。設 --connect-timeout、--max-time;非 2xx 用二四八秒退避至多五輪並落盤;排查時對齊閘道日誌與外掛請求序號。
# 摘要 POST 示例(替換 SERVER、BUILD_LOCATOR、TOKEN) curl -sS -X POST "https://SERVER/app/rest/builds/BUILD_LOCATOR/comment" \ -H 'Content-Type: text/plain' \ -H "Authorization: Bearer $TC_REST_TOKEN" \ --data-binary @/tmp/preflight-summary.txt \ --connect-timeout 5 --max-time 25
最小可複現步驟清單
- Node 22+、
onboard、doctor。 - 閘道回環、Bearer、
launchd、/health。 - TeamCity Webhook:JSON、修訂版、祕鑰或 HMAC。
- Handler:暫存目錄、lock diff、
npm ci --dry-run。 - REST 回寫摘要;二四八秒重試;比對日誌。
常見報錯排查 FAQ
TeamCity 顯示 Webhook 成功但 Mac 無日誌?
檢查隧道或反向代理轉發埠;核對路徑祕鑰;若閘道要求 Authorization: Bearer,於外掛或代理層補標頭。
REST 回傳 401/403?
確認權杖範圍含目標專案;BUILD_LOCATOR 與文件一致;勿將權杖寫入可被建置日誌列印的參數。
簽章失敗或 npm 找不到?
HMAC 對原始本文;TC 是否重排 JSON;plist 寫死 PATH/NODE_BINARY;which npm。