线上 CI 一旦连续红灯,团队最怕的不是“修得慢”,而是“修坏更多”。 这篇给你一套可落地的 GitHub Actions + AI Agent 自动修复流水线:先做失败分级,再限制 AI 修改范围,最后用回归与安全闸门兜底。

先给结论:自动修复只处理“低风险、可验证”问题

建议把失败分成三档:

  • P0(高风险):安全、数据一致性、迁移脚本,禁止自动修复
  • P1(中风险):依赖冲突、类型错误、lint,允许 AI 出补丁但必须人工批准
  • P2(低风险):格式化、文档、简单测试修复,可自动合并

核心原则:允许 AI 快,但不允许 AI 越权。

1) 失败分级:先判定再调用 Agent

在 workflow 中先解析失败日志并打标签:

name: ci-auto-fix
on:
  workflow_run:
    workflows: ["CI"]
    types: [completed]

jobs:
  classify:
    if: ${{ github.event.workflow_run.conclusion == 'failure' }}
    runs-on: ubuntu-latest
    outputs:
      severity: ${{ steps.cls.outputs.severity }}
    steps:
      - uses: actions/checkout@v4
      - name: classify failure
        id: cls
        run: |
          python3 scripts/classify_failure.py > result.txt
          cat result.txt
          echo "severity=$(cat result.txt)" >> "$GITHUB_OUTPUT"

classify_failure.py 的最低实现建议:

  • 匹配 security, migration, destructiveP0
  • 匹配 test failed, type error, dependencyP1
  • 匹配 markdownlint, prettier, ruff formatP2

2) 给 Agent 上“笼头”:限制改动目录和行数

不要把整个仓库丢给 Agent。只允许它改白名单路径:

ALLOWED_PATHS="src/ tests/ .github/"
MAX_CHANGED_LINES=200

git diff --name-only > changed_files.txt
python3 scripts/check_scope.py changed_files.txt "$ALLOWED_PATHS" "$MAX_CHANGED_LINES"

check_scope.py 失败就立即终止并转人工。

3) 自动生成修复 PR(不直接推主分支)

  propose-fix:
    needs: classify
    if: ${{ needs.classify.outputs.severity != 'P0' }}
    runs-on: ubuntu-latest
    permissions:
      contents: write
      pull-requests: write
    steps:
      - uses: actions/checkout@v4
      - name: run agent patch
        run: |
          ./scripts/run_agent_fix.sh "${{ needs.classify.outputs.severity }}"
      - name: open PR
        run: |
          gh pr create \
            --title "ci: agent fix for failed run ${{ github.run_id }}" \
            --body "Auto-generated patch. Requires gated checks."

4) 安全闸门:三道必须过

合并前至少强制三道检查:

  1. 回归测试通过(单测 + 关键 e2e 冒烟)
  2. 安全扫描通过(CodeQL/SAST + secret scan)
  3. 策略校验通过(改动范围、敏感文件未触达)

示例:

- name: gated regression
  run: make test-critical

- name: security scan
  run: make security-scan

- name: policy check
  run: python3 scripts/policy_guard.py

5) 常见翻车点与排障

现象 A:Agent 一直修同一个错误,进入重试风暴

  • 限制同一 run 最多 1 次自动修复
  • 对同一错误指纹 24 小时内只允许 3 次尝试
python3 scripts/retry_budget.py --fingerprint "$ERR_FP" --max 3 --window 24h

现象 B:修复成功但引入隐性性能退化

  • benchmark smoke 放进闸门
  • 对关键接口设置 P95 阈值,超过就阻断合并

现象 C:AI 修改了不该改的基础设施文件

  • policy_guard.py 硬编码 denylist:terraform/, migrations/, secrets/

6) 最小可行落地(MVP)

如果你今天就要上线,按这个顺序:

  1. 只开 P2 自动修复
  2. 所有修复都走 PR,不直推主分支
  3. 打开回归 + 安全闸门
  4. 记录指标:自动修复成功率、回滚率、平均恢复时间(MTTR)

当回滚率连续两周低于 3%,再扩展到 P1。

总结

AI 自动修复流水线的关键不是“让模型更聪明”,而是 把失败分级、权限边界、验证闸门做扎实。先用保守策略换稳定收益,再逐步放权,才是团队可长期复用的路径。