CI 每天红、每次都靠人肉盯日志,是团队迭代速度最隐蔽的税。真正可落地的“AI 自愈流水线”,不是让 Agent 直接乱改代码,而是把 归因、补丁、审批、回滚 四件事拆开做,并且每一步都可审计、可中断。
这篇给你一套能直接上线的最小闭环:Claude Code 负责“提修复建议+生成最小补丁”,GitHub Actions 负责“自动分级+门禁+回归验证”,人类只在高风险节点按一次按钮。
1) 目标边界:先定义“自愈”不做什么
先把安全边界写死,否则自动化越强,翻车越快。
- 只处理可回归的 CI 失败(测试失败、lint、类型检查)
- 不处理 schema 迁移、生产配置、依赖大版本升级
- 补丁行数上限(例如 <= 120 行)
- 必须附带“失败根因 + 修复依据 + 回归结果”
建议把边界配置成仓库变量:
# .github/ai-heal-policy.yml
max_patch_lines: 120
allowed_jobs:
- unit-test
- lint
- type-check
blocked_paths:
- infra/prod/**
- migrations/**
require_human_approval: true
2) 错误归因:先分类,再修复
先归因是关键。没有分类,Agent 只会盲猜。
推荐分三层:
- 可重试瞬态:网络抖动、registry 429、缓存超时
- 确定性代码问题:断言失败、类型不匹配、lint rule 违反
- 环境/策略问题:凭证过期、权限拒绝、工作流配置错误
GitHub Actions 里先跑 classifier:
- name: Classify CI failure
run: |
python3 scripts/ci/classify_failure.py \
--workflow-run "${{ github.run_id }}" \
--out /tmp/failure.json
输出示例:
{
"class": "deterministic_code",
"confidence": 0.86,
"job": "unit-test",
"root_cause": "Null pointer in user profile mapper"
}
3) 最小修复补丁:只改必须改的地方
把 Claude Code 当“补丁生成器”,不是“全仓重构器”。核心是限制输入和输出。
claude code run \
--task "Fix failing unit-test only; keep patch <=120 LOC" \
--context /tmp/failure.json \
--allow-path src/ tests/ \
--deny-path migrations/ infra/prod/ \
--output /tmp/patch.diff
然后在流水线做硬校验:
git apply --check /tmp/patch.diff- 变更路径白名单检查
- 变更行数检查
- 仅允许触达失败 job 相关模块
4) 人工审批闸门:高风险只留一个按钮
“自动修复”不等于“自动合并”。最稳妥是分级审批:
- 低风险:补丁小、测试全绿、无敏感路径 → maintainer 一键批准
- 中风险:触发关键模块 → 代码 owner 审批
- 高风险:跨目录大改或置信度低 → 直接转人工处理,不自动提补丁
GitHub Environments 可直接做审批门:
environment:
name: ai-heal-approval
url: ${{ steps.report.outputs.pr_url }}
5) 回归与回滚:别把“修好”定义成一次通过
稳定团队会把成功标准写成可观测指标:
- 修复 PR 合并后 24h 内是否再次触发同类失败
- 首次修复成功率(First-Fix Rate)
- 平均恢复时间(MTTR)
- 误修复率(False-Fix Rate)
建议把失败分级结果和修复结果写入同一份审计日志,后续用于策略迭代。
6) 可直接落地的 GitHub Actions 骨架
name: ci-self-heal
on:
workflow_run:
workflows: ["CI"]
types: [completed]
jobs:
heal:
if: ${{ github.event.workflow_run.conclusion == 'failure' }}
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Classify
run: python3 scripts/ci/classify_failure.py --workflow-run "${{ github.event.workflow_run.id }}" --out /tmp/failure.json
- name: Generate patch with Claude Code
run: bash scripts/ci/generate_patch.sh /tmp/failure.json /tmp/patch.diff
- name: Validate patch
run: bash scripts/ci/validate_patch.sh /tmp/patch.diff
- name: Open fix PR
run: bash scripts/ci/open_fix_pr.sh /tmp/patch.diff
总结
能上线的 CI 自愈,不靠“模型更聪明”,靠的是 边界清晰 + 分级治理 + 人在关键处按确认。先把“可修、可审、可回滚”的闭环跑通,再追求覆盖率。
如果你现在只有 1 周时间:先落地“错误分类 + 最小补丁 + 人工审批”这三步,收益已经足够大。