“失败后自动拉起修复 Agent”的闭环流水线

可以把它设计成"失败后自动拉起修复 Agent"的闭环流水线。核心思路是:门禁失败不是直接结束,而是把错误日志、代码上下文、测试命令交给机器上的修复工具,让它在受控环境里改代码、跑验证、提交 commit,然后再次触发流水线,直到通过或达到上限。

推荐方案
#mermaid-svg-FBu0jiP70rMz7oNu{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-FBu0jiP70rMz7oNu .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-FBu0jiP70rMz7oNu .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-FBu0jiP70rMz7oNu .error-icon{fill:#552222;}#mermaid-svg-FBu0jiP70rMz7oNu .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-FBu0jiP70rMz7oNu .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-FBu0jiP70rMz7oNu .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-FBu0jiP70rMz7oNu .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-FBu0jiP70rMz7oNu .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-FBu0jiP70rMz7oNu .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-FBu0jiP70rMz7oNu .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-FBu0jiP70rMz7oNu .marker{fill:#333333;stroke:#333333;}#mermaid-svg-FBu0jiP70rMz7oNu .marker.cross{stroke:#333333;}#mermaid-svg-FBu0jiP70rMz7oNu svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-FBu0jiP70rMz7oNu p{margin:0;}#mermaid-svg-FBu0jiP70rMz7oNu .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-FBu0jiP70rMz7oNu .cluster-label text{fill:#333;}#mermaid-svg-FBu0jiP70rMz7oNu .cluster-label span{color:#333;}#mermaid-svg-FBu0jiP70rMz7oNu .cluster-label span p{background-color:transparent;}#mermaid-svg-FBu0jiP70rMz7oNu .label text,#mermaid-svg-FBu0jiP70rMz7oNu span{fill:#333;color:#333;}#mermaid-svg-FBu0jiP70rMz7oNu .node rect,#mermaid-svg-FBu0jiP70rMz7oNu .node circle,#mermaid-svg-FBu0jiP70rMz7oNu .node ellipse,#mermaid-svg-FBu0jiP70rMz7oNu .node polygon,#mermaid-svg-FBu0jiP70rMz7oNu .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-FBu0jiP70rMz7oNu .rough-node .label text,#mermaid-svg-FBu0jiP70rMz7oNu .node .label text,#mermaid-svg-FBu0jiP70rMz7oNu .image-shape .label,#mermaid-svg-FBu0jiP70rMz7oNu .icon-shape .label{text-anchor:middle;}#mermaid-svg-FBu0jiP70rMz7oNu .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-FBu0jiP70rMz7oNu .rough-node .label,#mermaid-svg-FBu0jiP70rMz7oNu .node .label,#mermaid-svg-FBu0jiP70rMz7oNu .image-shape .label,#mermaid-svg-FBu0jiP70rMz7oNu .icon-shape .label{text-align:center;}#mermaid-svg-FBu0jiP70rMz7oNu .node.clickable{cursor:pointer;}#mermaid-svg-FBu0jiP70rMz7oNu .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-FBu0jiP70rMz7oNu .arrowheadPath{fill:#333333;}#mermaid-svg-FBu0jiP70rMz7oNu .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-FBu0jiP70rMz7oNu .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-FBu0jiP70rMz7oNu .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-FBu0jiP70rMz7oNu .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-FBu0jiP70rMz7oNu .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-FBu0jiP70rMz7oNu .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-FBu0jiP70rMz7oNu .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-FBu0jiP70rMz7oNu .cluster text{fill:#333;}#mermaid-svg-FBu0jiP70rMz7oNu .cluster span{color:#333;}#mermaid-svg-FBu0jiP70rMz7oNu div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-FBu0jiP70rMz7oNu .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-FBu0jiP70rMz7oNu rect.text{fill:none;stroke-width:0;}#mermaid-svg-FBu0jiP70rMz7oNu .icon-shape,#mermaid-svg-FBu0jiP70rMz7oNu .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-FBu0jiP70rMz7oNu .icon-shape p,#mermaid-svg-FBu0jiP70rMz7oNu .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-FBu0jiP70rMz7oNu .icon-shape .label rect,#mermaid-svg-FBu0jiP70rMz7oNu .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-FBu0jiP70rMz7oNu .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-FBu0jiP70rMz7oNu .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-FBu0jiP70rMz7oNu :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 否

否且未超上限
通过
超过上限
门禁流水线执行
是否失败
合入/通过
收集日志、失败命令、环境信息
拉起自动修复 Agent
分析失败原因并修改代码
本地执行测试/构建/静态检查
是否通过
提交 commit / 推送分支
重新触发门禁
停止并通知人工介入

落地步骤

  1. 在 Linux 机器上预置工具

    • 代码工具:gitgh 或 GitLab/Jenkins CLI。
    • 构建工具:项目需要的 mavengradlenpmpnpmgopythoncargo 等。
    • 检查工具:pytesteslintruffmypygo testmake test 等。
    • 自动修复工具:例如内部代码修复 Agent、Codex CLI、脚本化 LLM Agent,或基于规则的 fix 工具。
  2. 失败后收集上下文

    必须把这些信息传给修复工具:

    • 失败日志。
    • 失败命令。
    • 当前分支、commit SHA。
    • 变更文件列表。
    • 项目测试命令。
    • CI 环境变量、系统版本、依赖版本。
  3. 让 Agent 在隔离 workspace 中修复

    不建议直接在主工作区改。每次修复应使用临时目录或干净分支:

    bash 复制代码
    git checkout -B auto-fix/$BUILD_ID
    # 调用自动修复工具
    codex "根据 ci.log 修复当前仓库代码,运行测试直到通过"
  4. 本地验证通过后再提交

    Agent 修改代码后,流水线执行固定验证命令:

    bash 复制代码
    make test
    make lint
    make build

    通过后提交:

    bash 复制代码
    git config user.name "ci-fix-bot"
    git config user.email "ci-fix-bot@example.com"
    
    git add .
    git commit -m "fix: repair gate pipeline failure"
    git push origin auto-fix/$BUILD_ID
  5. 支持迭代但要设置上限

    建议最多迭代 3 到 5 次:

    bash 复制代码
    MAX_RETRY=5
    for i in $(seq 1 $MAX_RETRY); do
      run_auto_fix
      run_tests && break
    done

    如果超过次数仍失败,应自动创建 issue 或评论 PR,附上失败日志和 Agent 的尝试摘要。

可能问题与解决办法

问题 风险 解决办法
Agent 误改代码 引入新 bug 限制只改失败相关文件,必须跑完整测试
死循环修复 浪费机器资源 设置最大迭代次数、超时和 diff 大小限制
环境不一致 本地通过、CI 失败 修复 Agent 使用和门禁一致的 Docker 镜像
权限过大 可能泄露密钥或破坏仓库 使用最小权限 token,只允许推送 bot 分支
依赖下载失败 修复误判 区分代码失败、网络失败、缓存失败
测试不稳定 Agent 反复改错地方 失败重跑一次,标记 flaky test
Commit 污染历史 自动提交太多 统一使用 auto-fix/* 分支,人工确认后 squash
安全问题 Agent 可能修改敏感配置 禁止修改密钥、部署脚本、权限文件,或要求人工 review

比较合理的策略

不要让自动修复直接合入主干。更稳妥的是:

  1. 门禁失败。
  2. 自动修复 Agent 新建 auto-fix/xxx 分支。
  3. 修复并验证。
  4. 自动提交 commit。
  5. 创建 PR 或更新原 PR。
  6. 门禁重新跑。
  7. 通过后由人工或规则系统合入。

这样既能自动迭代修复,又不会让机器在没有审查的情况下直接改主干。对于企业门禁流水线,这是安全性和效率比较平衡的做法。

相关推荐
许彰午1 小时前
03_Java流程控制详解
java·开发语言·python
2601_957879331 小时前
企业矩阵系统建设实践:从账号管理到AI内容协同
大数据·人工智能·矩阵系统·数字化运营
我爱cope1 小时前
【Agent智能体10 | 反思设计模式-AI数据分析的可视化实战】
人工智能·设计模式·数据分析
Dxy12393102161 小时前
HTML中如何写键盘事件
前端·html·计算机外设
2601_957882241 小时前
矩阵系统在企业内容管理与数字获客中的实践分析
人工智能·矩阵系统·企业数字化运营
霍格沃兹测试学院-小舟畅学1 小时前
接口自动化测试的下一个十年:从脚本到Skills,让AI学会“如何测”
java·前端·人工智能
暴躁小师兄数据学院1 小时前
【AI大模型应用开发工程师特训笔记】第04讲(第10章):Python 高阶编程
人工智能
T_Wang_Lab1 小时前
跨领域语义漂移的双视角量化框架:基于知识图谱邻居的Jaccard方法与跨域对齐的Word2Vec方法的系统比较与联合诊断
人工智能·知识图谱·word2vec
huangfuyk1 小时前
前端使用Cursor编辑器方面遇到的问题及注意细节
前端·编辑器·ai编程·cursor