Install
openclaw skills install merge-deploy-verify-loop将"本地改动 → 选择性提交 → push → 合并到目标分支 → CI 构建部署 → 重启工作负载 → 端到端功能/数据库验证 → 失败则补丁再循环"这一段发布闭环按通用 SOP 跑通的技能。 当用户的意图包含"提交并推送 / 合并到 develop 或 feature/* / 用 Jenkins/CI 部署到 DEV/STG / 重启 pod 后自动测试 / 跑通发布闭环 / 改完上一道再走一遍" 等触发语境时使用; 同样覆盖"测试不过 → 定位 → 仅提交本次修复 → 再次部署验证"的下一轮迭代。 与具体项目/分支名/MCP 实现解耦,仅在描述步骤时给出常见 MCP(GitLab / Jenkins / Kubernetes / Postgres / Fetch)的推荐用法。
openclaw skills install merge-deploy-verify-loop把"本地已 ready 的改动"安全送到目标环境并完成验证闭环的通用流程。不绑定具体项目、具体分支命名、具体 MCP 实现。
用户意图涉及以下任一项时按本 SOP 走:
Task Progress:
- [ ] 1. 选择性暂存 - 只 add 本次相关的改动
- [ ] 2. Commit + Push
- [ ] 3. 合并到目标分支(MR)
- [ ] 4. 触发 CI 构建
- [ ] 5. 重启工作负载
- [ ] 6. 端到端验证
- [ ] 7. 若 6 失败 → 仅提交补丁 → 回到 2
铁律:永远只 git add <file> 单文件清单。禁止 git add -A / git add . / git commit -am。
git status 先全量列出变更,对每个文件单独判断"是否属于本次任务":
| 必须排除 | 理由 |
|---|---|
| 本地调试改动(config 指向 localhost / 自己机器路径) | 推上去会让 CI/同事炸 |
.idea/ .vscode/ *.exe *.log 等 IDE/构建产物 | 该走 .gitignore |
| 含密钥、token、私钥的文件 | 安全事故 |
| 别人未关联本次任务的 in-flight 改动 | 偷带 |
判定不明时:用 AskQuestion 让用户拍板,不要替用户决定。
暂存后用 git status --short 复核:M 前空格=已 staged, M=未 staged。
git log --oneline -10 看一下)git config--amend 已经 push 过的 commit;不 --no-verifygit push origin HEAD目标分支优先级:用户明说的 > 项目默认分支 > 询问用户。不要猜 main / master。
有 GitLab/GitHub MCP 时:
merge_status 从 checking → can_be_merged(一般 5-15 秒)无 MCP 时:把 MR URL 输出给用户,请其完成合并后回告 merge SHA。
有 Jenkins MCP 时:
<env>_<service> 这类命名规律找到目标 jobgetBuild 看上一次成功构建的参数集 —— 直接照抄参数名和取值惯例(如 branch=refs/heads/<target>),不要自己造参数triggerBuild;返回 HTTP 201 才算入队成功getBuild 直到 building: false;校验 result == "SUCCESS"lastBuiltRevision.SHA1 核对等于第 3 步的 merge SHA,确认 CI 拉到的就是这次合并的代码多 service 并行:边/云、多微服务都要部署时,所有 triggerBuild 在同一消息里并行触发;轮询时也并行查。
轮询节奏:先 sleep ~30s,之后参考 estimatedDuration 与上次 build duration 估时长,指数回退(30s → 60s → 120s → 180s)。
有 Kubernetes MCP 时:
pods_delete 删 pod 让 RS 拉新,前提用 pods_get 确认 imagePullPolicy: Always 且 image tag 不变READY=N/N 全就绪、旧 pod Terminating 完成关键检查:
imagePullPolicy 必须 Always;IfNotPresent + 不变 tag = 用本地缓存的旧 image,等于没部署覆盖原则:每个新增/改动的接口都要被实际打到,每个落库字段都要被 SELECT 确认。
按权限差异分层选工具:
| 通道 | 工具 | 何时用 |
|---|---|---|
| 不要 token 的内部接口 | K8s pods_exec + curl localhost:<port> | 后端到后端互调(如内部 sync/health/admin) |
| 要 token 的外部接口 | 用户提供 token + Fetch MCP / shell curl | 完整模拟前端用户视角 |
| 数据库断言 | 对应 DB 的 MCP,或 pods_exec 进 DB pod 执行 psql/mysql | 任何"已落库"断言 |
| 路由生效验证 | pods_log 看启动日志里的路由列表 / "Total: N routes" | 确认新代码已部署 |
最少覆盖的 4 类场景:
updated_* 变、created_* 保留测试数据可清理:
E2E001 / E2E-<service>-001),不要用真实业务样子的 key断言强度:
effectCount=0 也是 200测试不过 / 部署失败 / pod 起不来时:
pods_log(带上下文窗)、getBuild 失败 stage、DB 查询、关键事件--amend 已 push 的 commit;新建 fix: <原因简述> commitmerged 才触 CI;CI SUCCESS 才动 pod;pod Ready 才开测每轮闭环结束给一份对账,让用户一眼能复核:
| 阶段 | 状态 | 关键凭证 |
|---|---|---|
| Commit | ✅ | <short-sha> |
| Merge | ✅ | MR #X,merge commit <sha> |
| Build A | ✅ | job #N SUCCESS,拉取 SHA = merge SHA ✅ |
| Build B | ✅ | job #M SUCCESS,拉取 SHA = merge SHA ✅ |
| Restart | ✅ | 新 pod Ready N/N,旧 pod 已 Terminating |
| Test 1..K | ✅ K/K | 见下方明细 |
后接每个测试场景的 HTTP 状态码、effectCount、DB SELECT 结果。
git add . / git commit -am — 容易把 IDE 配置、本地调试、别人改动一起推effectCount=0 也是 200pods_log 取最后 20 行做断言 — ERROR 刷屏的服务关键日志会被冲掉,改成按时间窗 / grep 关键词--amend — 历史被改还要 force push;正确做法是新 commitmain / master 当目标 — 不同项目流派不同,必须问cursor-self-bootstrap-workflowserver-log-analysis;复杂 bug 多轮排查参考 complex-bug-debugging-with-ai