subscriptionId、notificationId、resource 与 HTTP Basic 密钥在 OpenClaw 的落点。Mac 上 Node 22+ / 24,网关端口以文档为准(Runbook 常记 18789),构建终态后再做有界预拉取。内链:网关加固、预拉取与版本一致、失败恢复与重试。
- 误把「解析后 JSON」拿去验签:Azure DevOps 的 Basic 密码在
Authorization头,与 Harbor HMAC 体签名不同;混淆后永远对不齐。 - 重复投递:同一
notificationId触发两次 git fetch,远程 Mac 磁盘与带宽被自建队列打穿。 - PAT 过宽:为写回一个标签申请了跨组织全权限,评审过不去。
目标、2026 常见网关参数与验收清单
目标。构建完成进网关:验 Basic 与路径令牌;按 resource.sourceVersion 预热依赖;NDJSON 写盘;可选 REST 打标签作回执。
部署。openclaw doctor → 支持则 openclaw onboard --install-daemon;端口以 CLI 打印为准(Runbook 常写 18789)。Dashboard Bearer 与挂钩 Basic 密码分文件、0600。
验收。跳板机 TLS 重放成功;错 Basic→401;同 notificationId 再入→204 且不入队;低于 MIN_FREE_GB 跳过预拉;出站失败日志含 2/4/8 秒退避。
Azure DevOps 触发器字段与 Webhook secret(Basic)配置
Project settings → Service hooks:Build / Build completed;集成 Web Hooks。URL 带路径密钥 ?k=;认证选 HTTP Basic(用户名可空),密码即共享密钥——网关对解码密码做常量时间比对,勿写入 YAML。
| JSON 路径(信封) | 用途 |
|---|---|
subscriptionId | 排障与审计:对应控制台里整条订阅。 |
notificationId | 短期去重键;建议 TTL 15~60 分钟。 |
resource.id | 构建 ID,用于 REST 回写标签或拉取详情。 |
resource.buildNumber / result / status | 摘要展示与分支策略:可仅在 result=succeeded 时预热。 |
resource.sourceBranch / sourceVersion | git fetch 与缓存键;注意 refs/heads/ 前缀。 |
resource.repository.id / projectId | 多仓库单 Mac 时做路由与配额隔离。 |
k,再校验 Basic;两者通过后才 JSON.parse。notificationId 命中内存或 Redis SetNX;重复则直接 204。可执行命令:守护、健康探针与预拉取骨架
# 环境与守护(路径按团队约定)
node -v # 期望 v22.x 或 v24.x
openclaw doctor
openclaw onboard --install-daemon
# 网关自检:端口以本机文档为准,示例 18789;密码用环境变量注入
curl -fsS --max-time 5 "http://127.0.0.1:18789/health"
# 预拉取骨架:SOURCE_VERSION 由处理器从 resource.sourceVersion 注入
export GIT_TERMINAL_PROMPT=0 MIN_FREE_GB=18
avail_gib="$(df -g / | awk 'NR==2{print $4}')"
[ "${avail_gib:-0}" -ge "$MIN_FREE_GB" ] || exit 0
git -C /var/lib/openclaw/mirrors/your-repo fetch --prune origin "${SOURCE_VERSION}"
包管理器预热套用同一磁盘阈值与独立缓存目录;外层并发 2~4。
构建摘要回传、PAT 最小权限与重试退避
回传。主线 NDJSON 落盘(下模板)免 PAT。可选:项目 Scoped PAT 勾选构建写标签所需最小范围,PUT …/builds/{id}/tags/{name}?api-version=7.1;禁 PAT 则只做内网线。
重试。2→4→8 秒,≤3 次;curl --max-time 25;仅 429/5xx。
# 日志行模板(追加到按日滚动的 NDJSON,供 Vector / OpenSearch 采集)
{"ts":"2026-04-16T12:34:56Z","source":"ado-servicehook","subscriptionId":"…","notificationId":"…","buildId":12345,"result":"succeeded","prefetch":"ok","branch":"refs/heads/main","commit":"abc1234","duration_ms":820,"host":"mac-ci-04"}
# 可选:标签回写(切勿把 PAT 写进 git)
# curl -fsS --max-time 25 -u ":$ADO_WRITE_PAT" -X PUT \
# "https://dev.azure.com/org/project/_apis/build/builds/12345/tags/openclaw.prefetch.ok?api-version=7.1"
FAQ(与 Harbor / 其他 CI 文错开的角度)
服务挂钩的一等公民是 RFC 7617 Basic;团队应把「路径令牌 + Basic 密码」视作双因素,而不是照搬容器 Registry 的 HMAC 范例。
resourceContainers 里的链接要跟吗?
网关默认不要自动跟随 collection 级 URL 出站;仅允许配置表白名单主机;需要详情时用 PAT 显式调用已知模板 URL。
「Build completed」在整次构建终态后触发;若要在某阶段后预热,应改用阶段级集成或流水线内任务,而不是硬扭服务挂钩语义。