议题背景:
解决的问题:将流水线的测试信息从“噪声”变成“结论 + 归因 + 推送”。
核心痛点:
1. 流水线的测试失败信息分散且没有去重;
2. 原始内容噪声大、重复多、上下文不完整;
3. 研发和测试经常需要在多处来回切换才能确认“失败了什么、为什么失败、是不是持续失败、是否需要立即处理”。
思考的方向:不是单纯做告警通知,而是把“失败分析 + 自愈修复”做成一条工程链路:
1)先保证信息稳定接入,再把报告加工成结构化结果;
2)进一步结合历史失败情况判断稳定性,结合AI进行失败分析;
3)最后决定是否推送、如何推送、是否可自动修复。核心目标是同时解决看不懂、找不全、重复吵、难复盘、修不动这几类问题。
基于以上背景,我们希望把失败报告接入统一处理链路,通过任务化、结构化蒸馏、稳定性判断、业务知识库和AI分类,把原始失败信息转成可直接行动的结论;对其中可规则化、可确认的失败,再进一步自动触发自愈与重试,减少人工排查和重复修复成本,并用 MySQL 沉淀任务、结果和推送状态,形成稳定、可追溯、可迭代的闭环。
内容大纲:
1. 背景与痛点:
1.1 流水线信息原始内容噪声大、重复多,无法获取核心关键信息;
1.2 测试人员需要手动定位失败信息和日志,确认为什么失败。
2. 总体思路:把失败处理做成闭环
2.1 这套方案不是单点优化,而是围绕“接入—分析—决策—推送—自愈”五个环节做闭环设计;
2.2 入口上同时保留 webhook 和定时 scanner,两路互补,当webhook不工作时,scanner作为兜底;
2.3 处理上由 worker 统一消费任务,拉取 report/detail,抽取失败 case、断言、响应片段和步骤信息,再交给蒸馏模块做结构化整理;
2.4 决策上结合稳定性历史、业务知识库、规则分类和 AI 分类,判断这次失败属于“新问题、持续问题、偶发问题”还是“可自动修复问题”;
2.5 输出上分成两条线,一条是企业微信推送,另一条是自愈重试任务。这里 MySQL 不是简单存结果,而是承担任务队列、状态流转、结果沉淀和去重状态的中心角色,保证链路可追踪、可恢复、可重放。
3. 核心链路:从原始报告到可行动结论
3.1 第一步是接入与入队。系统收到测试失败通知后,会先做幂等校验,再把 report_id、plan_id、触发来源、通知策略等信息写入 MySQL 的任务表,避免同一失败被重复消费。
3.2 第二步是详情拉取与蒸馏。worker 会根据 report_id 拉取报告详情,识别失败 case,提取步骤、断言、请求响应、错误码等关键字段,并整理成统一的结构化结果。
3.3 第三步是分类与稳定性判断。系统会结合最近 N 次报告的历史失败情况,判断 case 是稳定失败、间歇失败还是新失败,同时把业务知识库、样本召回和规则分类一起用于归因。
3.4 第四步是推送和去重。只有满足通知条件的报告才会进入推送,且要和上次推送的失败集合做比较,避免相同失败在短时间内反复刷群。
3.5 第五步是自愈。对于明确的参数漂移、断言变化、请求结构变化等场景,系统会进入自愈流程,生成修复动作或重试任务,让一部分失败在机器侧先闭环。
4. 技术抉择:为什么这样设计
4.1 服务采用容器化方式部署,保障了高可用、易扩缩、易重启、易观测。避免单点进程挂掉导致整条链路失效。
4.2 多处使用缓存:这个系统里很多信息是高频复用的,比如业务知识、分类结果、样本召回结果等;如果每次都实时查外部接口或重复计算,成本高且容易被短时抖动拖慢。缓存是为了降低外部依赖压力、减少LLM调用次数、提升链路稳定性。我们把“高频读、低频变”的内容前置下来,既减少接口调用次数,也降低 AI 分类和蒸馏链路的延迟。
4.3 为什么需要样本库,为什么用 BM25检索:样本库的作用不是“给 AI 凑上下文”,而是把历史上已经人工确认过的失败模式沉淀下来,作为分类和归因的参照系。没有样本库,AI 很容易只看当前 case 的表面特征,缺少业务语义和历史类比,分类会飘。BM25 的选择是因为它简单、可解释、稳定,适合在样本规模不算特别大、但需要快速做关键词和语义近似召回的场景里使用。它比纯手写规则更灵活,比直接上复杂向量检索更轻量,尤其适合这个项目里“先召回少量高相关样本,再交给 prompt 进一步判断”的工作方式。
4.4 为什么要用文件存储: 文件存储更适合放大一些、非强事务但需要持久化的对象数据,比如样本内容、历史归档、结构化结果快照或一些需要跨进程共享的 blob 数据。它和 MySQL 的分工是清楚的:MySQL 管索引、状态和查询主路径,文件存储 管较大的内容体和归档体。这样做可以避免把大 JSON、历史样本、反馈材料全压在 MySQL 里,保持主库表结构更轻,也方便后续做冷热分层和批量处理。
5. 工程实践:把“能跑”做成“长期能跑”
这套系统里有几个关键工程实践:
1) 第一是幂等设计,所有任务围绕 idempotency_key 建模,避免 webhook 重复投递、scanner 重复补入造成双重处理。
2) 第二是状态机设计,任务从 pending 到 processing,再到 done 或 failed,每一步都能回溯。
3) 第三是退避重试,短暂抖动不会让任务直接失败,而是按 next_run_at 延后重试。
4) 第四是推送去重,使用 last_notified 记录上次失败集合和时间窗口,既避免刷屏,也保留持续失败的再次提醒。
5) 第五是知识沉淀,业务知识库和 few-shot 样本池不是一次性配置,而是持续更新的,用户可以针对每次的AI分类进行反馈,反馈内容回流进样本库。
6) 第六是自愈分层,把“可自动修复”的问题单独识别出来,不和普通告警混在一起,保证修复动作不会污染主链路。
6. 总结与展望
6.1 实际效果总结:这套方案的价值不只是“自动发消息”,而是把失败处理变成了一条可持续演进的工程链路。
6.1.1 失败信息从原始通知变成了结构化结论,排查路径明显缩短,
6.1.2 推送去重,减少相同失败测试的内容通知,使重复噪声也得到了有效控制;
6.1.3 利用AI进行失败归因,使分类准确率相比规则分类有了明显提高,能够覆盖更多常见失败模式;
6.1.4 自愈能力则把部分可规则化、可确认的失败前移处理,减少了人工重复介入。
6.2 未来规划:
6.2.1 继续扩展自愈能力,把目前已验证有效的规则化处理经验推广到更多失败类型和业务线;
6.2.2 持续完善业务知识库和样本库,提升 AI 分类的准确率和稳定性;
6.2.3 推动系统从单一工具演进为统一的平台能力,逐步承接更多测试和质量信号,形成更完整的分析、修复和度量闭环。
听众收益:
1. 获得一套可复用的测试失败治理思路:听众可以看到如何从“失败通知”升级到“接入、蒸馏、归因、推送、自愈、复盘”的完整链路,而不是只做一个告警机器人。对于已有自动化测试体系的团队,可以直接借鉴其中的任务化、幂等、去重、稳定性判断和失败分类设计。
2. 理解 AI 能力在工程系统中的落地边界:分享会重点讲为什么没有把失败归因完全交给大模型,而是采用“规则兜底 + 样本库 + BM25 召回 + AI 分类”的组合方案。听众可以获得一套更务实的 AI 工程化经验:哪些场景适合 AI 增强,哪些地方必须保留确定性逻辑,如何处理格式漂移、分类不稳定和业务知识缺失等问题。
3. 学习一个长期可运维系统的技术取舍:通过 K8s 容器化部署、MySQL 与 BOSS 的职责划分、多级缓存、自愈任务隔离、推送去重和可观测性建设,听众可以看到一个内部效率工具如何从脚本演进为长期运行的服务。这部分对有一定经验的技术同学更有价值,因为重点不是“功能怎么写”,而是“系统为什么这样设计、如何避免线上跑不稳”。