变更检测(path filter)
先固定差异锚点:在 CI 里用 dorny/paths-filter,或脚本执行 git diff --name-only "$BASE_SHA"...HEAD。把每个变更文件映射到包根(例如 apps/ios/** → apps/ios),映射表放在仓库内 YAML,评审可见、可测假阴性。下游只读一份归一化产物:JSON 数组或换行列表。已用 Turborepo、Nx、Bazel 的团队可直接换 affected 子命令,但契约不变:各 MeshMac 节点对「要构建什么」理解一致。
在 main 与发布分支加护栏:若 ci/** 或 .github/** 有改动,当次可放宽为「相关移动目标全量」,下一提交再回到增量。并行 worktree 与 lockfile 争用另算,请与 Git worktree 与 lockfile 决策文对齐,避免路径过滤与 Package.resolved 竞态叠加。
队列 / 锁
增量构建仍要准入控制:两台任务若同时碰同一签名身份、模拟器缓存或 CocoaPods 沙箱,路径不同也可能互相污染。择一并写进运维手册:
- 中央队列 — 从 Redis、RabbitMQ 或 OpenClaw 任务面取单(见 多节点部署与任务队列同步);涉及 Xcode 的 lane 建议消费者上限为 1。
- 协作式 flock — 在共享卷上建
/build-locks/ios.signing.lock,用flock加超时;崩溃残留见 flock 构建队列 FAQ。
锁粒度需与 网关限流与会话并发 HowTo 一致,避免 CI 连开二十个会话而签名槽只有一个。
OpenClaw 生成构建摘要
原始 CI 日志不适合直接进频道。构建步骤结束后,向网关本地入队 OpenClaw 任务(或确定性模板):输入退出码、已构建包列表、mesh_node_id、耗时、首条编译/测试失败摘要;输出控制在数百字内,并带来源 run_url。把路径过滤 JSON 一并传入上下文,摘要首行即可写「本次构建包:…」。若导出 xcresult,优先喂解析后的失败列表,避免整段 xcodebuild 流水。成功构建可用静态模板只替换计数,压低多节点同一分钟内的延迟尖峰。字段命名与去重键可与 共享构建 Webhook 通知配置对齐,便于日后接 Teams/Matrix。
Slack Incoming Webhook 最小权限
旧版 Incoming Webhook 本质是「一条 HTTPS URL = 可向固定频道发帖」的 bearer,泄露即刷屏风险。目录 0750、文件 0440,属主为 root 或网关用户、组如 openclaw-notify,勿进 Git 与 CI 明文变量。仅网关读取并 POST;Runner 只推事件到内网队列。出站白名单 hooks.slack.com(及企业代理 SNI)。上架前在网关执行探针:
export SLACK_URL="$(sudo cat /etc/openclaw/secrets.d/slack/build-summary.url)"
curl -sS -X POST -H 'Content-Type: application/json' \
-d '{"text":"MeshMac 探针 OK · '"$(hostname -s)"'"}' "$SLACK_URL"
节点级秘密面与目录约定见 MeshMac 节点密钥最小权限。规模上来后可迁 Slack App 细粒度 bot,仍保持单发送者纪律。
失败退避
Slack 侧常见 429 与瞬时 5xx:使用指数退避 + 全抖动,约 2 分钟内 capped 五次即可起步;若响应带 Retry-After 应优先遵守。400、404 不重试,修正 JSON 或轮换 Webhook。用 provider_run_id 加结论在 72 小时窗口去重,防止抖动重跑双帖。队列侧语义见 任务队列与重试步骤。
网关与令牌轮换简表
| 面 | 轮换对象 | 提示 |
|---|---|---|
| OpenClaw 网关 TLS | 证书/密钥或 ACME | 热加载反代勿丢在途 Webhook;TLS 入口选型见 Nginx/Caddy 决策矩阵 |
| Slack Incoming Webhook | 完整 URL(新集成) | 切换期可双写;旧 URL 在 Slack 控制台吊销 |
| CI → 网关 HMAC | 共享签名密钥 | 多版本错峰;边缘拒未签名 POST |
| Git 读令牌 | PAT 或 GitHub App | 范围收敛到 monorepo contents: read |
网关前置负载均衡时,轮换与健康检查与 多节点负载均衡与故障转移 同步,避免排空节点时半写 Slack。
FAQ
| 问题 | 建议 |
|---|---|
| 绿构建也要每次走大模型吗? | 不必;成功用模板,失败或日志标「模糊」再调用模型。 |
| Incoming Webhook 算废弃吗? | 新工作区更推 App;内部 CI 仍大量可用,规划迁移但不阻塞本最小路径。 |
| flock 租约多长? | 略高于 p99 构建加清理;崩溃由运维脚本或租约过期回收,runbook 写明。 |
下一步(免登录购买与帮助)
为共享 Mac 池补齐路径过滤与单点通知
购买页公开比价、帮助中心免账号可读;与本篇配套的增量构建与 Slack 摘要链路可在一周内硬化。