導讀:本文說明Azure DevOps Pipelines以 Service hook 將建置完成等事件 JSON POST 至遠端 Mac OpenClaw 閘道(Node 22 LTS、127.0.0.1 埠),先做依賴預拉取/乾跑,再以PAT 最小權限寫回結構化摘要(標籤或日誌 JSON)。重點含 Basic 密碼即 Webhook 祕鑰、觸發欄位與 api-version、二四八秒退避。站內:閘道安全強化、失敗恢復與重試、預拉與版本一致。

2026 常見閘道部署:Node 版本、埠與 Bearer

1)Node:建議 22 LTS 或 24 LTS;以 node -v 與 openclaw doctor 對齊發行說明。

2)閘道埠:openclaw doctor 會列出本機 HTTP 埠(常見如 18789,實際以輸出為準);僅綁 127.0.0.1,由企業 TLS 或 SSH 反向轉發對外。

3)守護程序:launchd plist 寫死 NODE_BINARY、PATH、NODE_EXTRA_CA_CERTS;閘道管理 API 使用窄用途 Bearer,與 Azure 入站 Basic 祕鑰、PAT 分桶。

  • 痛點一:筆電休眠導致 Webhook 逾時。
  • 痛點二:PAT 範圍過大難通過稽核。
  • 痛點三:未驗 Basic 祕鑰即執行預拉,易被偽造事件觸發。
# 閘道健康(將 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

決策矩陣:誰適合承載 CI 前置節點

筆電/自建 VM 對照遠端 Mac 託管
面向筆電或臨時 VMMacPull 遠端 Mac
可用性休眠易斷機房常駐、Webhook 穩
稽核帳號混用專用節點與日誌集中
管線對齊環境漂移固定 Node 對齊 ADO Agent 池

Azure DevOps 觸發器欄位、Webhook 祕鑰與 PAT 最小權限

於 Project Settings → Service hooks → Create subscription 選 Web Hooks,事件例如 Build completed;資源可篩特定管線。Azure 對 Web 掛鉤常見做法為 HTTP Basic:使用者名稱留空、密碼欄填長隨機 Webhook 祕鑰;OpenClaw handler 應解碼 Authorization 後比對密碼,而非僅信任來源 IP。

觸發器欄位備忘(Service hook)
欄位建議填寫備註
Payload URLHTTPS 反代至閘道路徑與閘道路由完全一致
API version與文件一致(如 1.0)影響 JSON 形狀
Filters限定專案/管線/分支降低噪音觸發
Basic 密碼長隨機祕鑰即 Webhook secret 校驗
PAT(出站)僅 Build 讀寫所需寫標籤或呼叫 REST

Handler:Webhook 祕鑰校驗與依賴預拉取

流程:驗 Basic 密碼與可選閘道 Bearer → 解析 resourceContainers/resource 取得 buildId、repository、commitId → 於 mktemp -d 淺克隆該提交 → 執行 npm ci --dry-run 或自訂 pod install/xcodebuild -resolvePackageDependencies 等預拉指令 → 將末段日誌與狀態寫入暫存 JSON。

# 依賴乾跑(示例;於暫存目錄執行)
git fetch --depth 1 origin COMMIT_SHA && git checkout --detach FETCH_HEAD
npm ci --dry-run 2>&1 | tee /tmp/prefetch.log | tail -n 80
  • 以 timeout 包住預拉,避免 Service hook 逾時拖滿。
  • 多管線並行時限制同時預拉數,保護磁碟與網路。

摘要回傳、日誌 JSON 模板與二四八秒重試

先將摘要寫成單檔 JSON,再以 curl -u :$ADO_PAT 呼叫 dev.azure.com REST(例如建置標籤);api-version 須與文件一致。非 2xx 時以二四八秒指數退避至多五輪,並保留 /tmp/ado-callback.log。

# 日誌回傳 JSON 模板(寫入 /tmp/ado-summary.json 後可再 POST 至內部觀測或管線工件)
cat > /tmp/ado-summary.json <<'EOF'
{"schema":"macpull.openclaw.ado.summary.v1","buildId":BUILD_ID,"status":"prefetch_ok","durationSec":0,"tailLines":["replace-with-tail-of-log"]}
EOF
# 建置標籤(範例;替換 ORG、PROJ、BUILD_ID、PAT)
for s in 2 4 8 16 32; do
  code=$(curl -sS -o /tmp/ado.tag.rsp -w '%{http_code}' -X PUT \
    "https://dev.azure.com/ORG/PROJ/_apis/build/builds/BUILD_ID/tags/openclaw-prefetch-ok?api-version=7.1" \
    -u ":$ADO_PAT" --connect-timeout 5 --max-time 25)
  [ "$code" -ge 200 ] && [ "$code" -lt 300 ] && break
  sleep "$s"
done

最小可複現步驟清單

  1. openclaw doctor 無紅字;閘道僅 127.0.0.1 且 health 回 200。
  2. Service hook 測試傳送:Mac 端收到並寫入 requestId/訂閱識別。
  3. 刻意錯誤 Basic 密碼時 handler 回 401 且不執行預拉。
  4. 正確事件下暫存目錄可完成乾跑,磁碟剩餘高於內部閾值。
  5. 標籤或 REST 回寫成功,且重試迴圈於 2xx 提前結束。
  6. PAT 僅具 Build 相關最小範圍,無法修改原始碼庫設定。

常見報錯排查 FAQ

Azure 顯示 Webhook 已送達但 Mac 無紀錄?

核對反代 upstream 埠是否等於 doctor 所列;URL 路徑是否含版本前綴;若閘道另要求 Authorization: Bearer,請在反代注入。

回寫 REST 回 401/403?

確認 PAT 勾選範圍含目標專案與 Build;api-version 與 URL 中組織/專案 slug 正確;勿將 PAT 寫入可由管線列印的變數。

Basic 祕鑰比對總失敗?

確認以原始位元組解 Base64;密碼欄不含換行;中介層未剝除 Authorization;與 Service hook 儲存格內密碼一致。

結語

總結:Azure Service hook 與 OpenClaw 的接縫在於 Basic Webhook 祕鑰、觸發篩選、閘道埠與 Bearer、PAT 最小權限與二四八秒退避。遠端 Mac常駐可顯著降低 Webhook 斷線與環境漂移。首頁、購買、說明中心免登入;延伸閱讀技術部落格列表。

Azure DevOps × OpenClaw × 遠端 Mac

租用遠端 Mac 承載 Azure Webhook 閘道

首頁、購買、說明中心與技術部落格皆站內公開免登入。

多地域可選
SSH 存取
彈性租期
支援管道