网易首页 > 网易号 > 正文 申请入驻

凌晨2点CI/CD崩了只能爬起来救火?这个AI Agent自己诊断故障还自动开了修复PR

0
分享至

你有没有经历过凌晨被PagerDuty的尖啸声惊醒,揉着眼睛打开笔记本电脑,一头扎进4000行噪声日志里,最后发现只是一个不稳定的测试和一次依赖升级搞崩了整个构建?二十分钟,甚至是半个小时,就这么没了。而那个修复,说实话,真的挺明显的。现在想象一下:你还在梦里,流水线自己已经把故障诊断清楚了,开了一个带修复代码的合并请求,再把一条简洁的总结发到你手机上。等你醒来,一切已经绿了。这就是代理式DevOps,今年CI/CD领域最像样的一个变化。

市面上关于“AI驱动运维”的说法满天飞,但真正把代理系统塞进流水线里跑起来的实操方案并不多。我们今天用一台真实的GitHub Actions工作流,手把手搭一个能自我愈合的管道:测试挂了,它自动收日志、扔给大模型研判、在PR下写评论,甚至能直接帮你把修复请求打开。代码都可以直接复制,你只需要一个GitHub仓库和一组API密钥(OpenAI、Anthropic或者你自己的Copilot/Azure端点都行)。


先画一张概念图,一张图把这事儿讲清楚:
一个代码合并请求进来,先跑测试。过了当然就万事大吉,可以直接合入;挂了则触发一个专门的诊断作业——这个作业只在前一步失败时才启动。它会收集失败的日志,送给一个LLM智能体。智能体分析完,会在原PR下面写评论说明问题,还有一个可选的步骤:直接替你打开一个修复PR。整个链条,从失败到诊断再到修复建议,不需要人介入。

接下来我们拆开看,代理式AI在流水线里到底分哪几层。最外层是很多人已经在用的“辅助层”——比如GitHub Copilot在你本地编辑器里补全代码,或者某个机器人用自然语言解释失败信息。它看得到问题,但不动手。再往上一层是“自动化脚本层”,你事先写好规则:看到某种错误就重跑,匹配到某个关键字就通知某人。这套东西有用,但边界很硬,规则之外它就是个睁眼瞎。最里面才是真正的代理层:系统拥有一个目标(让构建变绿)、拥有工具(读日志、打开PR、添加评论、甚至修改代码),并且能自己决定在什么时候调用哪个工具,循环几次,直到目标达成或者确认自己搞不定。它表现出来的不是一连串写死的步骤,而是动态推理和动作的组合。

我们现在要搭的就是这种代理层的最小可用版本。整个方案依托GitHub Actions,思路非常清晰:先用一个标准的测试作业当门禁,然后利用failure()条件把控制权交给第二个作业。第二个作业里,我们重新拉取代码,跑一遍测试但把所有输出重定向到文件,再把文件内容喂给大语言模型。大语言模型返回结构化的诊断结果,我们把它写到PR评论里。如果故障模式简单到可以自动修,我们还可以直接在跑诊断的那个作业里,用GitHub CLI或者API创建一个新的分支并提交修复代码,然后开一个指向原分支的PR。当然,安全起见,本文里的代码只做到诊断评论这一步,开修复PR的部分标成可选,你可以根据自己的风险偏好加上。

开始写代码。第一步是一个毫无魔法的基线流水线。在仓库的 .github/workflows/ci.yml 文件里写下:

name: CI  on:  pull_request:  jobs:  test:    runs-on: ubuntu-latest    steps:      - uses: actions/checkout@v4      - uses: actions/setup-node@v4        with:          node-version: 20      - run: npm ci      - run: npm test

这几行做的事情很直白:任何PR进来,自动拉代码,在Ubuntu环境中配置好Node.js 20,安装干净依赖,然后跑测试。这一步是整条流水线的唯一真相源——如果测试全绿,后续的合并按钮才能亮起来。这时候还没AI什么事儿。

第二步,往这个工作流里加一个触发器,让它在测试炸掉的时候才启动。GitHub Actions的jobs级别支持一个叫if的条件表达式,这里我们用failure(),意思是“只有当前一个名为test的作业失败了,我才运行”。需要特别注意权限设置:因为这个新作业要往PR下面写评论,所以我们显式给它pull-requests: write权限。现在把这段拼上去:

diagnose:    needs: test    if: failure()    runs-on: ubuntu-latest    permissions:      pull-requests: write      contents: read    steps:      - uses: actions/checkout@v4      - name: 收集失败日志        run: |          npm ci          npm test > test-output.log 2>&1 || true

needs: test 告诉GitHub这个作业得等test跑完才能动。在它的步骤里,我们再一次checkout代码,重新安装依赖,然后故意用 || true 保证即使测试挂了这一步也不会失败退出,同时把标准输出和错误输出都塞进 test-output.log 文件里。这一步成功之后,我们手里就攥着当前故障的全部现场信息。

第三步才是智能体的心脏。我们在仓库里放一个 Node.js 脚本 scripts/diagnose.js,它干三件事:读取刚刚那坨日志文件,调用大语言模型的API,拿到一个结构化的诊断结果。原文展示了脚本的开头片段:

import fs from "node:fs";import OpenAI from "openai";  const client = new OpenAI({ apiKey: process.en

虽然这里被截断了,但意图很明显:用环境变量里的API密钥初始化一个OpenAI兼容客户端。后续我们会把 test-output.log 的内容读出来,拼接一条精心设计的提示词让模型梳理故障。提示词里会要求模型输出固定的JSON格式,比如包含“根因摘要”“受影响文件”“建议修复方案”等字段。然后脚本把JSON解析出来,按照我们想要的样子拼接成Markdown评论,再通过GitHub API贴到当前PR里。整个过程中,最关键的工程细节是提示词的设计——你需要明确告诉模型,它看到的日志可能很长,但只聚焦错误和警告,忽略正常信息,并且禁止臆测那些日志里没有证据支撑的结论。这一步如果做得好,诊断精度跟调用GPT-4或者Claude一样靠谱。

你可能会问,模型真的能看懂这些乱七八糟的CI日志吗?实际测试下来,只要你给的提示词包含几个关键约束,效果就会非常稳定。比如可以这样写:“以下是运行npm test的完整日志,请识别导致测试失败的根本原因,并以JSON形式返回。只引用日志中出现的错误,不要推测。字段包括root_cause(字符串)、affected_files(字符串数组)、fix_suggestion(字符串)。如果无法确定,请返回unknown。”然后你收到的响应差不多会是:root_cause: “依赖包foo从1.0升级到2.0导致API签名变更,某测试用例未更新”,affected_files会指向那几个测试文件。这已经是高质量的问题票,比半夜靠自己瞪眼好太多。

以上三步搭完,你每次创建PR时都会自动获得一位不会睡觉的守夜人。接下来,我们顺着流程图,把刚才的代码和概念揉在一起,再给你捋一遍它的运转逻辑。
第一条线:PR触发test作业。test作业跑npm ci、npm test。如果全绿,GitHub Actions在界面上显示一个优雅的绿色对勾,啥也不干,等你自己点merge。
第二条线:test作业红了。这时diagnose作业被failure()唤醒。它先把代码拉下来,再跑一次测试并捕获全部输出。注意,这一步跑了测试本身,目的是拿到当前失败状态的完整文字记录,而不是重新判定成功失败。
第三条线:diagnose作业把日志文件交给scripts/diagnose

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
车贷还没还完,车先趴窝了——20余万辆埃安的账到底该谁算?

车贷还没还完,车先趴窝了——20余万辆埃安的账到底该谁算?

斗子侃车
2026-07-20 11:38:55
杭州路边出现“胶囊小吃车”,需2万押金+每月1200多元租金,自带油烟机和空调,有夫妻摆摊4天每天近1000元流水

杭州路边出现“胶囊小吃车”,需2万押金+每月1200多元租金,自带油烟机和空调,有夫妻摆摊4天每天近1000元流水

极目新闻
2026-07-22 10:40:59
台球助教不能乱摸!杭州一男子在台球厅消费1万多元,伸手摸女助教屁股,被行拘

台球助教不能乱摸!杭州一男子在台球厅消费1万多元,伸手摸女助教屁股,被行拘

火山詩话
2026-07-22 10:28:28
悲催!中山继佳能之后,又一大厂全面停工,全员解除劳动关系,近800人面临失业

悲催!中山继佳能之后,又一大厂全面停工,全员解除劳动关系,近800人面临失业

火山詩话
2026-07-22 15:31:03
泽连斯基任命乌武装部队总参谋长

泽连斯基任命乌武装部队总参谋长

国际在线
2026-07-22 18:19:04
上海40岁女子自曝丈夫和侄女保持关系2年,破坏18年婚姻

上海40岁女子自曝丈夫和侄女保持关系2年,破坏18年婚姻

九方鱼论
2026-07-22 06:39:14
罕见一幕出现!王毅落地菲律宾,马科斯召见中方大使,提了3条件

罕见一幕出现!王毅落地菲律宾,马科斯召见中方大使,提了3条件

菠萝欣赏家本尊
2026-07-22 04:00:32
谢贤火葬不到1天,荒谬一幕接连发生,死因曝光,林青霞无妄之灾

谢贤火葬不到1天,荒谬一幕接连发生,死因曝光,林青霞无妄之灾

孤城落叶
2026-07-21 21:38:25
上海92岁老人猝然离世,无儿无女,节俭一生,留下500万遗产,多次坦言不想留给毫无往来的远亲……

上海92岁老人猝然离世,无儿无女,节俭一生,留下500万遗产,多次坦言不想留给毫无往来的远亲……

都市快报橙柿互动
2026-07-22 08:10:11
比销量更重要的,是车企手里有多少张底牌

比销量更重要的,是车企手里有多少张底牌

虎嗅APP
2026-07-20 19:25:21
进入灭亡倒计时?韩国或将成为世界上,首个自然消失的国家

进入灭亡倒计时?韩国或将成为世界上,首个自然消失的国家

麓谷隐士
2026-07-22 07:00:03
让人愤怒!冉莹颖说坐月子,公婆没出现,却被扒出,邹父早就去世,邹市明在豪宅请了4个保姆

让人愤怒!冉莹颖说坐月子,公婆没出现,却被扒出,邹父早就去世,邹市明在豪宅请了4个保姆

火山詩话
2026-07-22 06:53:41
汤唯宣布二胎孩子出生,晒出一家四口牵手照

汤唯宣布二胎孩子出生,晒出一家四口牵手照

韩小娱
2026-07-22 17:50:32
耐克将清退中国数千家在线经销商”冲上热搜第一!

耐克将清退中国数千家在线经销商”冲上热搜第一!

南传
2026-07-22 17:54:53
太炸裂了!一大妈发帖炫耀儿子有貌有才,北美留学,家里有钱有房有车,结果被扒出儿子已成白人老头的“小娇夫”

太炸裂了!一大妈发帖炫耀儿子有貌有才,北美留学,家里有钱有房有车,结果被扒出儿子已成白人老头的“小娇夫”

火山詩话
2026-07-21 15:23:18
国家林草局原副局长李春良,被判无期

国家林草局原副局长李春良,被判无期

新京报政事儿
2026-07-22 17:26:06
台湾现职警员福建旅游被盘查?国台办:只要不从事违法犯罪活动,台湾同胞来大陆完全不需有任何顾虑

台湾现职警员福建旅游被盘查?国台办:只要不从事违法犯罪活动,台湾同胞来大陆完全不需有任何顾虑

红星新闻
2026-07-22 13:54:11
中小学入学迎来重大调整,教育部已经下达通知,2026年9月1日全国统一执行

中小学入学迎来重大调整,教育部已经下达通知,2026年9月1日全国统一执行

每天分享天下事
2026-07-20 17:30:27
多模态迎来「架构换代」:商汤连出两张牌,划定大一统基座新标准

多模态迎来「架构换代」:商汤连出两张牌,划定大一统基座新标准

机器之心Pro
2026-07-21 18:09:31
今年世界杯刚落幕,这六支国家队就已晋级2030年世界杯决赛圈

今年世界杯刚落幕,这六支国家队就已晋级2030年世界杯决赛圈

红星新闻
2026-07-22 14:36:09
2026-07-22 19:28:49
灰度测试中
灰度测试中
生活正在重构,目前还在灰度测试阶段,暂不全量发布。
371文章数 53关注度
往期回顾 全部

科技要闻

马斯克看笑了:谷歌什么都有 偏偏没最强AI

头条要闻

美军公布最新对伊战事损失:18人阵亡 耗费375亿美金

头条要闻

美军公布最新对伊战事损失:18人阵亡 耗费375亿美金

体育要闻

阿根廷的亚军:单核足球的极限?

娱乐要闻

47岁汤唯宣布二胎产子 大女儿10岁

财经要闻

美国想对中国AI动手?"大人,时代变了"

汽车要闻

上汽贾健旭谈汽车全球化:出海要合规 欧洲人只爱小车是误解

态度原创

艺术
亲子
本地
数码
家居

艺术要闻

书坛唯一能称为大师的人,他的字俗人看不懂

亲子要闻

科学通报|儿童期逆境如何影响大脑?综述构建基于双通路的整合模型

本地新闻

杭州诗意路名,自带氛围感

数码要闻

防堵垃圾处理器推荐:5款实测 进口大牌性价比逆袭!

家居要闻

2026建博会(广州) 公装联探展交流活动

无障碍浏览 进入关怀版