“失败后自动拉起修复 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 分钟前
充电站底层脱机DLB引擎解构:基于Linux调度的边缘计算网关并发控制实战
linux·运维·人工智能·边缘计算·边缘计算网关·5g数采·工业级边缘计算网关
ADRU4 分钟前
深度拆解DeepSeek Harness插件热更新实现原理
人工智能·ai·ai编程
chemddd6 分钟前
第四节课:前端
前端
李昊哲小课8 分钟前
大模型应用开发课程——项目 13~16 完整教程
人工智能·大模型·智能体
雪芽蓝域zzs9 分钟前
(一)Vue3+JS+Vite+pnpm 仿若依后台 从零搭建
前端
有脚就行11 分钟前
第32篇-弹性训练与容错-让训练任务永不中断
人工智能
移动云开发者联盟12 分钟前
密态计算落地!MobileClaw解锁安全AI新范式
大数据·人工智能·安全
我的xiaodoujiao14 分钟前
使用PyMySQL模块技术操作MySQL数据库
数据库·python·测试工具·mysql
一次旅行19 分钟前
2026‑08‑19 AI产业深度解读|Mojo正式开源、Agent记忆剂量研究、OpenAI收紧模型安全管控
人工智能·开源·mojo
HackTwoHub20 分钟前
开箱即用 AI 渗透测试系统,整合多类AI工具、Web安全、内网攻防、二进制逆向、API测试、流量分析等多个安全领域
人工智能·安全·web安全·网络安全·系统安全·网络攻击模型·安全架构