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 只会盲猜。

推荐分三层:

  1. 可重试瞬态:网络抖动、registry 429、缓存超时
  2. 确定性代码问题:断言失败、类型不匹配、lint rule 违反
  3. 环境/策略问题:凭证过期、权限拒绝、工作流配置错误

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 周时间:先落地“错误分类 + 最小补丁 + 人工审批”这三步,收益已经足够大。