“失败后自动拉起修复 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 机器上预置工具

    • 代码工具:git、gh 或 GitLab/Jenkins CLI。
    • 构建工具:项目需要的 maven、gradle、npm、pnpm、go、python、cargo 等。
    • 检查工具:pytest、eslint、ruff、mypy、go test、make 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. 通过后由人工或规则系统合入。

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

相关推荐
m4Rk_2 小时前
【论文阅读】Agent 记忆机制(83):Inside Out——用可演化 PersonaTree 构建 Agent 的核心长期记忆
论文阅读·人工智能·学习·开源·github
运行时异常2 小时前
【WMS 仓储系统集成 AI Agent 实战】第 8 讲(终篇):生产部署与并发安全——Semaphore 放进 Flux.defer 的坑,压测抓了一晚上
人工智能·安全
FungLeo2 小时前
成为全栈·React 管理后台篇·总复盘:从“接口能调通”到“后台值得使用”
前端·react.js·前端框架·项目复盘·成为全栈
杨杨杨大侠2 小时前
Jev、Kev、Laya:决策模型怎么选,什么时候需要微调?
人工智能·python·agent
代码方舟2 小时前
零信任架构实战:基于天远人企关联构建自动化供应链金融网关
运维·人工智能·架构·自动化
虹科网络安全3 小时前
“顶会”看安全(十八):超越越狱:揭示由能力边界模糊引发的 LLM 应用安全风险
人工智能·安全
LOVE️YOU3 小时前
Python 在定义函数时,究竟定义的是什么?
python
Maiko Star3 小时前
* LangChain 提示词模板详解:ChatPromptTemplate 的使用与高级特性
java·人工智能·langchain
段一凡-华北理工大学3 小时前
大模型应用开发 100 天:Python + LLM 从入门到精通 day26~Prompt 调试与优化——A/B 测试与效果评估
windows·python·大模型·prompt·智能体·提示词工程·高炉智能化
Minecraft红客3 小时前
以撒的结合
python·游戏·电脑·娱乐