FlakeGate:别再把 flaky test“重跑到绿”了
最近两三周一直在针对开发方面的问题进行优化是否还能做一些有意义的开源项目也是挺值得思考的发现很多地方叶被大厂拿下了然后在某天项目合作的业务处理上发现很有意思的一点我们知道agent时代已经到来了很快agent集群的落地和agent任务的落地那么它的工程性质回更强现在遇到一个很场景的问题就是在CI有时候反馈给你出问题失败的不是刚修改的业务逻辑而是一个偶尔超时的集成测试。团队已经见过它很多次所以没有人先分析代码差异也没有人认真读失败栈。最自然的反应是“先重跑一下。”第二次运行变绿合并继续。看起来问题已经解决但实际上团队失去了一样更重要的东西对红色构建的信任。总的问题而言一旦“重跑到绿”成为默认动作CI 的失败就不再能清楚回答一个最基本的问题代码到底坏没坏开发者会逐渐忽略红灯发布负责人会依赖经验判断coding agent 看到的也只是一段没有历史背景的错误信息。Flaky test 的成本不只是多跑几分钟机器。它会污染整个工程系统的决策信号。接下来我会先针对商用角度去回答这个问题最近两三周一直在针对开发方面的问题进行优化是否还能做一些有意义的开源项目也是挺值得思考的发现很多地方叶被大厂拿下了然后在某天项目合作的业务处理上发现很有意思的一点我们知道agent时代已经到来了很快agent集群的落地和agent任务的落地那么它的工程性质回更强现在遇到一个很场景的问题就是在CI有时候反馈给你出问题失败的不是刚修改的业务逻辑而是一个偶尔超时的集成测试。团队已经见过它很多次所以没有人先分析代码差异也没有人认真读失败栈。最自然的反应是“先重跑一下。”第二次运行变绿合并继续。看起来问题已经解决但实际上团队失去了一样更重要的东西对红色构建的信任。总的问题而言一旦“重跑到绿”成为默认动作CI 的失败就不再能清楚回答一个最基本的问题代码到底坏没坏开发者会逐渐忽略红灯发布负责人会依赖经验判断coding agent 看到的也只是一段没有历史背景的错误信息。Flaky test 的成本不只是多跑几分钟机器。它会污染整个工程系统的决策信号。接下来我会先针对商用角度去回答这个问题Retry 为什么不是治理策略Retry 能降低一次偶发失败阻断流水线的概率但它没有回答三个问题1. 这个测试是否真的已经有 flaky 证据2. 如果暂时放行谁负责修、什么时候到期3. 同一份报告里如果出现一个新的真实回归怎样保证它不会被一起放过去简单的 retry 或 blanket quarantine 很容易把“降低噪音”变成“降低警觉”。最危险的结果不是 CI 经常变红而是团队学会了忽略红色。因此一个完整方案至少需要三种能力检测、隔离和治理。只有检测列表没有最终 gate团队仍然要人工猜测只有 quarantine没有 owner 和 expiry临时例外最终会变成永久债务。FlakeGate 的边界已知 flaky 可以放行未知回归必须保持红灯FlakeGate 是一个本地优先的 flaky-test CI gate。它把每次 CI 产生的标准 JUnit XML 写入本地 SQLite 历史并从中寻找同一代码上的结果矛盾。最强的两类证据是同一次运行中一个逻辑测试既通过又失败同一个 commit SHA 的不同运行中同一测试既通过又失败。五步闭环这里我就简单描述了希望佬们有问题开源直接问FlakeGate 的完整路径不是“检测以后自动跳过”而是通过1.Ingest每次 CI 结束后读取 JUnit XML2.Detect从 SQLite 历史中寻找同代码矛盾和反复振荡3.Suggest为有证据的 finding 生成待审核的隔离条目4.Govern把 reason、owner、since、expires 写进版本控制5.Gate根据当前报告和有效策略决定最终退出码。代码没有变化而结果相反这比“某个测试失败了一次”提供了更明确的 flaky 证据。对于长期在不同 commit 之间反复翻转的测试FlakeGate 还会计算普通 flip rate 和近期权重更高的 EWMA flip rate。同时它保护一个关键性质一次真实 regression 从绿变红并持续为红只发生了一次状态翻转不应该因此被高分识别为 flaky。有效隔离中的 flaky test 仍然执行、仍然记录、仍然出现在报告里只是不再阻断合并。未知失败继续阻断。隔离到期后的失败也重新阻断。Quarantine-as-codeFlakeGate 不把 quarantine 状态藏在一个独立 dashboard 中而是使用项目仓库里的 .flakegate.yml这意味着 quarantine 不是测试的坟场而是一条有负责人、有时钟、有退出条件的修复队列。配置会拒绝未知字段、错误日期、重复 test ID 和缺失治理字段。条目在 expires 当天仍然有效从第二天开始重新进入阻断路径。这样做的好处是隔离通过现有 pull request 流程审核责任和期限在代码历史中可追踪不需要再维护一套孤立权限和状态系统。为什么是 JUnit XML SQLite 单二进制FlakeGate 有意保持一个很窄的集成面。JUnit XMLpytest、Jest、Maven Surefire、Gradle、gotestsum、RSpec 等大量框架都可以输出 JUnit。与其为每个框架写插件不如统一读取测试已经产生的报告。SQLite历史不需要另一个托管服务。一个 SQLite 文件可以通过 CI 自己的 cache 或 artifact 机制在运行之间传递。测试数据仍留在用户自己的基础设施内。纯 Go 二进制FlakeGate 使用 pure-Go SQLite 驱动不需要 CGO。Linux、macOS 和 Windows 可以使用同一个集成模型。核心工作流不要求网络。只有可选 BYOK 根因分类和显式启用的 GitHub issue escalation 会访问外部接口。同一个判断同时提供给人、CI 和 coding agentFlakeGate 的数据型命令支持稳定 JSONgate 可以写 GitHub Markdown summary本地 stdio MCP 则提供 test status、detect、gate 和 quarantine 查询。这解决了 agentic development 中一个很现实的问题coding agent 通常只能看到当前失败却不知道它是否曾经在同一 commit 上通过也不知道团队是否已经为它建立了有效隔离。通过本地 MCPagent 获得的不是一个模糊的“可能 flaky”而是和 CI 使用同一份历史、同一份配置与同一套边界得出的判断。部分实验结果因为还没有佬使用过然后这个也在开发阶段我们只能用已经用的数据做了测试测试结果如下FlakeGate 的 benchmark 将不同问题拆开验证因为没有一个数据集能同时证明检测、产业影响、外部覆盖和 gate 安全性。当前仓库中可复现的主要结果包括- FlakeFlagger ICSE 202126,765 个带标签测试其中 828 个 flaky、25,937 个 stable- 原始归档回放47,430 份 Surefire XML、869,550 次测试执行- IDoFT 固定快照10,687 个有效唯一记录、916 个项目和 14 个观察类别- 17 个严格定义的固定 revision false-red 运行对 retry、active quarantine、unknown regression 和 expiry 分别执行 17/17 控制- 100,000 次执行的本机 microbenchmark当前流式聚合测得 13.3 ms、3.83 MB/op 和 10,036 allocs/op。最后欢迎各位佬能持续提供意见和支持这个项目算是我除了商业方面看到的算是第一个开源很多地方都是自己想想也感谢各位佬的star和关注GitHubGitHub - xiao-zi-chen/FlakeGate · GitHub项目网站FlakeGate — Make red mean broken again

相关新闻

JS的多线程与线程池

JS的多线程与线程池

线程与线程池原理全解析:打破单线程误区,从底层讲透 转载请注明出处:本文从底层原理出发,把JS多线程和线程池讲得明白,看完再也不会被"JS单线程"的说法误导。 一、先搞懂:JS到底是不是单线程? 几乎所有入门教程第一句都会告诉你:JS是单线程语言。但这句话其…

2026/10/2 2:05:12 阅读更多 →
2026江南程序设计竞赛联盟暑期多校第一场_补题题解

2026江南程序设计竞赛联盟暑期多校第一场_补题题解

A 构造的芙莉莲题目分析: 题目给了我们两个长度均为 n 的排列数组,一个是原数组 a,一个是目标数组 b,要求我们利用异或运算在不超过 3*n 次的操作下,判断是否可以将 a 数组转化为 b 数组。可以则输出Yes,并…

2026/10/6 18:56:44 阅读更多 →
Flask-PyMongo扩展开发:如何自定义BSON转换器

Flask-PyMongo扩展开发:如何自定义BSON转换器

Flask-PyMongo扩展开发:如何自定义BSON转换器 【免费下载链接】flask-pymongo PyMongo support for Flask applications 项目地址: https://gitcode.com/gh_mirrors/fl/flask-pymongo Flask-PyMongo是一个为Flask应用提供PyMongo支持的强大扩展,它…

2026/10/7 4:14:28 阅读更多 →

最新新闻

COMSOL仿真极化无关BIC超表面:特征模式、Q值追踪与多极子分解全解析

COMSOL仿真极化无关BIC超表面:特征模式、Q值追踪与多极子分解全解析

超表面里的连续束缚态(Bound States in the Continuum,BIC)这两年是真的火,尤其在光子晶体超表面方向,高Q值、超窄线宽这些特性,直接把传感、激光、非线性谐波转换一系列应用的性能天花板抬了一大截。我前阵…

2026/10/13 19:16:34 阅读更多 →
配电网韧性提升:移动储能预布局与动态调度策略解析

配电网韧性提升:移动储能预布局与动态调度策略解析

配电网韧性、移动储能、预布局、动态调度,这几个词放在一起,基本就是当前配电系统防灾减灾领域最热的方向之一。我之前在好几个项目里都碰到过类似的课题,这次完整跑通并复现了IEEE33节点下的移动储能预布局与动态调度策略,整个过…

2026/10/13 19:16:34 阅读更多 →
STM32 GPS导航实战:从NMEA解析到地图绘制完整指南

STM32 GPS导航实战:从NMEA解析到地图绘制完整指南

简介:基于STM32与UC/GUI的GPS导航完整工程包,面向嵌入式开发者、电子竞赛参赛者及GUI入门学习者,定位在资源受限MCU上实现GPS定位信息采集与图形化交互界面的场景。压缩包约20.23MB,共548个文件,其中h头文件124个、c源…

2026/10/13 19:16:34 阅读更多 →
用Playwright MCP让AI真正操作浏览器:配置与实战

用Playwright MCP让AI真正操作浏览器:配置与实战

很多同学应该都遇到过这样一种场景:让 AI 写代码,它几分钟就能交付一个像模像样的脚本;但要是让它“去浏览器里把某个网页的信息提取出来再填个表单”,它立马就懵了。原因很简单,大多数 AI 应用没有“手”,…

2026/10/13 19:16:34 阅读更多 →
知识工作插件集合实战:从捕获到输出的完整工作流搭建指南

知识工作插件集合实战:从捕获到输出的完整工作流搭建指南

1. 这个插件仓库到底解决了什么问题第一次看到knowledge-work-plugins这个标题,我脑子里蹦出来的第一个念头是:又是一个“大而全”的知识管理插件集合?市面上这类东西太多了,Obsidian 插件市场一搜一大把,Notion 模板站…

2026/10/13 19:16:34 阅读更多 →
矩阵论期末复习:Jordan标准形、QR分解与广义逆手算全攻略

矩阵论期末复习:Jordan标准形、QR分解与广义逆手算全攻略

简介:矩阵论期末考试参考答案是一份针对矩阵论课程期末考试的完整解题资料,面向正在复习矩阵论、线性代数的本科生及考研备考生,也适用于需要快速回顾核心计算方法的工程类学生。资源包内共1个PDF文件,大小约284KB,文件…

2026/10/13 19:15:31 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →