“失败后自动拉起修复 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. 通过后由人工或规则系统合入。

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

相关推荐
乱世刀疤5 分钟前
WorkBuddy防踩坑指南
人工智能·workbuddy
爱读源码的大都督6 分钟前
DeepSeek面试官问:生产RAG系统回答不准确,该如何定位和优化?这样回答,能让面试官当场给你Offer!
java·后端·python
开开心心就好9 分钟前
PDF图片去水印软件,支持批量处理页面
前端·javascript·人工智能·智能手机·pdf·语音识别
深兰科技14 分钟前
深兰科技亮相2026全球独角兽大会,获评“2026环卫机器人品类领袖企业”
人工智能·科技·jupyter·vim·腾讯会议·深兰科技·全球独角兽大会
HAHAXX815 分钟前
2026智能自动化落地:通义灵码与Cursor加持,RPA融合生成式AI的工程化实践
人工智能·自动化·rpa
爱敲代码的小杨.17 分钟前
【Spring】Spring Web MVC
前端·spring·mvc
chuntian_tester17 分钟前
AI自动化第1步【系统探索】
人工智能·测试工具·ai·自动化
月华路18 分钟前
《模型不玄学》第29章 上线监控与再训练
人工智能·深度学习·机器学习
zcg194219 分钟前
基于Qwen的SR——ODTSR
人工智能
小马92621 分钟前
从单模型到多模型编排:GitHub HydraFusion 如何让编程 Agent 降本 36%-67%
人工智能·github