构建重跑率怎么计算:口径、步骤与异常判断

构建重跑率=统计周期内因失败或结果不可信而重新触发的构建次数÷同期构建总次数×100%。这个指标单独看意义有限,需要与构建失败率、失败类型分布放在同一时间窗内对照,才能判断“构建频繁失败”是偶发波动还是需要专项治理的问题。下文给出分子分母的界定方式、取数字段、可复算的计算步骤和一个完整示例。




要点总览(TL;DR)


  • 构建重跑率=统计周期内因失败或结果不可信而重新触发的构建次数÷同期构建总次数×100%,计算前先固定流水线、分支、触发方式和时间窗四个范围维度。
  • 重跑识别依赖同一提交重复构建、手动重试、失败后自动重试三类信号,取数时写明采用范围,并同时给出含自动重试与不含自动重试两个口径。
  • 重跑率要与构建失败率、失败类型分布放在同一时间窗内对照,失败集中在环境、依赖等可治理类别时,专项治理才有明确抓手。
  • 阈值应基于自身历史基线的波动区间设定,不套用通用达标线;分母为零或样本过少时标注样本不足,不据此判定异常。
  • 重跑率适合作为诊断工具,与失败类型分布、平均修复时长一起看,避免单独挂钩绩效导致减少重跑但延长修复时间等规避行为。


评估目标:重跑率要回答什么问题


重跑率衡量两件事:构建结果的可信度,以及团队为获得一个可用构建结果所付出的返工成本。重跑次数多,说明相当一部分构建没有一次产出可信结果,团队需要重复等待、重复排查,流水线占用的机器时间也随之增加。


这个指标不能单独作为结论依据。重跑率高可能来自环境不稳定,也可能来自依赖下载失败、配置错误或代码本身质量差,不同原因对应的治理动作完全不同。因此实际评估时通常三项指标一起看:


  • 重跑率:反映返工规模,回答“有多少构建需要重来”。
  • 构建失败率:反映失败发生的广度,回答“有多少构建第一次就没通过”。
  • 失败类型分布:反映失败的结构,回答“失败集中在哪一类原因上”。

判断“构建频繁失败”是否构成专项治理问题,可以按以下思路推进:先看重跑率和失败率是否持续高于自身历史基线;再看失败类型是否集中在少数可治理的原因上;最后评估这些失败对交付节奏的实际影响,例如是否频繁阻塞发布分支的合并。三项同时指向同一类问题时,专项治理才有明确抓手;若失败分散在大量偶发原因上,优先做的是提升可观测性而非立即立项。



指标与范围:分子分母怎么界定


重跑率是派生指标,需要在构建记录基础上二次加工。定义清楚分子、分母和统计范围,是后续数据可复算的前提。


指标 公式 分子 分母 单位
构建重跑率 重跑构建次数÷构建总次数×100% 统计周期内因失败或结果不可信而重新触发的构建次数 同期同一统计范围内的构建总次数 百分比
构建失败率 失败构建次数÷构建总次数×100% 统计周期内首次执行结果为失败的构建次数 与重跑率相同的构建总次数口径 百分比
失败类型分布 某类失败次数÷失败构建总次数×100% 按分类维度归入某一类的失败次数 同期失败构建总次数 百分比

失败类型建议按以下维度分类,团队可在此基础上增删,但分类标准一旦确定,应在多个统计周期内保持一致:


  • 环境类:构建节点不可用、磁盘或内存不足、网络中断。
  • 依赖类:制品仓库不可达、依赖版本解析失败、第三方服务超时。
  • 代码类:编译错误、单元测试未通过、静态检查拦截。
  • 配置类:流水线脚本错误、凭据失效、参数缺失。
  • 用例类:自动化测试本身不稳定导致的间歇性失败。

统计对象范围需要同时固定四个维度:流水线(哪些流水线纳入统计)、分支(是否只统计主干或包含特性分支)、触发方式(提交触发、定时触发、手动触发是否都计入)、时间窗(按自然周、按迭代还是按发布周期)。跨流水线或跨分支合并统计时,各对象的构建频次差异会扭曲结果,建议先分对象计算再汇总。



数据口径与证据:从构建记录取哪些字段


重跑率无法直接从流水线工具的标准报表中读出,需要从构建记录中提取字段后加工。取数前应确认每条构建记录至少包含以下字段:


字段 用途 缺失时的处理
构建ID 唯一标识一次构建,用于去重和关联 缺失则该记录不可用,需从流水线工具重新导出
提交标识(commit) 识别同一提交的重复构建 缺失时改用“同一流水线+同一分支+相近时间窗”近似判断,并在口径说明中注明
触发方式 区分提交触发、定时触发、手动触发 缺失时归入“未知”,单独列出占比
触发人 辅助识别手动重试 可空,不影响主指标计算
开始时间 划定统计时间窗 缺失则该记录无法归入周期,剔除并记录剔除数量
执行结果 计算失败率、识别失败后重跑 缺失时不计入分母,单独统计缺失率
失败原因 归入失败类型 缺失时归入“未分类”,该类别占比过高说明日志采集需要改进
重跑标记 直接识别重跑 无此字段时按下方规则推导

重跑识别通常依赖三类信号,取数时应明确采用哪一类或哪几类,并写入口径说明:


  • 同一提交重复构建:同一 commit 在同一流水线上出现两次及以上构建记录,第二次及以后计为重跑。
  • 手动重试:触发方式为手动且关联到已有构建记录的重试操作。
  • 失败后自动重试:流水线配置了失败自动重试,由系统产生的第二次执行。

三类信号覆盖的范围不同。只统计手动重试会低估重跑规模,把自动重试全部计入又可能高估团队的实际返工动作。建议在口径说明中写明采用范围,并在报告中同时给出“含自动重试”和“不含自动重试”两个口径,便于横向比较。


数据可比性依赖三个前提:同一流水线、同一时间窗、同一分类标准。更换流水线工具、调整分支策略或修改失败分类后,新旧数据不宜直接对比,应在报告中标注口径变更点。分母为零(该周期内没有构建)或样本过少时,指标不具解释力,应标注“样本不足”,不据此判定异常。


当构建数据分散在多个流水线工具中时,可以先完成工具集成,把执行状态和日志汇总到统一视图,再按上述字段口径加工。ONES 可集成 Jenkins、GitLab CI 等第三方流水线工具,集成后自动同步编排的流水线数据并更新执行状态和日志,并将流水线与项目关联,便于在项目、迭代、需求中查看代码提交与流水线构建过程。这样重跑识别所需的提交标识、触发方式和执行结果可以在同一处取数,减少跨工具手工拼接带来的口径偏差。具体可用字段以实际集成配置为准。



计算与评估步骤


以下流程可按周期重复执行,每一步都产出可复核的中间结果。


步骤一:确定统计周期与对象。选定时间窗(例如一个自然周),明确纳入统计的流水线清单和分支范围,记录触发方式是否全部计入。产出物是一份统计范围说明,后续周期沿用同一范围。


步骤二:清洗构建记录并标记重跑。导出时间窗内的全部构建记录,剔除开始时间缺失或结果缺失的记录并记录剔除数量;按选定的重跑识别规则逐条打标,产出带重跑标记的构建明细表。


步骤三:计算重跑率与构建失败率。重跑率=重跑构建次数÷构建总次数×100%;构建失败率=首次执行失败次数÷构建总次数×100%。两个指标使用同一分母,确保可比。


步骤四:按失败类型统计分布。对失败构建逐条归类,计算各类占比。占比明显集中的类别是后续治理的优先对象;“未分类”占比过高时,先补日志采集再谈治理。


步骤五:与基线对比判断是否异常。取过去若干周期的同口径数据作为基线,观察本期重跑率、失败率是否超出基线波动范围,失败类型结构是否发生变化。超出范围且集中在可治理类别时,进入专项治理评估;未超出范围则继续观察。


分母为零时直接标注“本期无构建”,不计算比率;构建总次数低于团队设定的最小样本量(例如少于20次)时,比率仅作参考,结论以多周期累计数据为准。



例子:一周构建数据的完整计算


以下为演示数据,用于说明计算过程,不代表任何团队的实际水平。


项目 数值
本周构建总次数 200
其中重跑构建次数 30
其中首次执行失败次数 40
失败类型:环境类 18
失败类型:依赖类 10
失败类型:代码类 8
失败类型:配置类 3
失败类型:用例类 1

计算过程:


  • 重跑率=30÷200×100%=15%。
  • 构建失败率=40÷200×100%=20%。
  • 失败类型分布:环境类18÷40=45%,依赖类10÷40=25%,代码类8÷40=20%,配置类3÷40=7.5%,用例类1÷40=2.5%。

结果解读:重跑率15%意味着每100次构建中有15次是重来一遍。失败类型中环境类与依赖类合计占70%,这两类通常与构建基础设施和制品仓库稳定性相关,属于可通过专项治理改善的方向;代码类失败占20%,属于开发过程中的正常反馈,不宜与基础设施问题混在一起治理。若该团队过去四周重跑率基线在8%至10%之间,本周15%已明显超出波动范围,且增量主要来自环境类失败,可以判定为需要专项排查的异常。若基线本身就在14%至16%之间,则本周数据属于正常波动,继续观察即可。



解读与限制:如何判断是否需要专项治理


重跑率的高低要结合失败类型和业务影响来判断。同样是15%的重跑率,如果集中在环境类失败且发生在发布分支上,对交付节奏的影响远大于分散在特性分支的偶发用例失败。评估时可以先回答三个问题:失败是否集中在少数类别、是否反复出现在同一流水线或同一时段、是否已经影响到合并或发布动作。三个问题中有两个为“是”,专项治理就有明确的价值。


阈值应基于自身历史基线设定,不套用通用达标线。可行做法是取过去若干周期的同口径数据,计算均值与波动区间,把明显超出区间且持续出现的水平作为触发条件。基线本身也需要随流水线规模、分支策略变化而更新。


单指标不能作为全部绩效依据。重跑率受构建频次、分支策略、自动重试配置影响,把它直接与团队绩效挂钩,容易引导出与目标相反的行为:例如减少重跑次数但延长单次修复时间,或者把失败构建改为不重跑而直接人工介入,指标下降但实际返工并未减少。合理的做法是把重跑率作为诊断工具,与失败类型分布、平均修复时长一起看,治理动作落在具体失败类别上。


指标还存在其他局限:重跑识别依赖提交标识和触发方式字段的完整性,字段缺失时结果偏保守;跨流水线汇总会掩盖单条流水线的问题;分类标准调整后历史数据不可直接比较。报告时应同时给出统计范围、识别规则和样本量,让读者能够判断结论的适用边界。ONES 支持多种数据报表,可追溯团队在 DevOps 工具链中的操作并集中度量分析研发绩效,适合把上述指标按固定口径周期性产出;报表的具体指标与口径以实际配置为准。



常见问题


重跑率统计时,定时触发的构建要不要计入分母?


是否计入取决于统计目的,关键是口径固定并在报告中写明。若关注团队为获得可信结果付出的返工成本,定时触发的夜间构建同样占用流水线资源,建议计入分母;若只关注提交触发的反馈效率,可以单独统计提交触发口径。两种口径不宜混用,切换口径后新旧数据不可直接对比,应在报告中标注变更点。


流水线配置了失败自动重试,重跑次数怎么算才合理?


建议同时产出两个口径:含自动重试的口径反映流水线实际执行的总次数与资源占用,不含自动重试的口径反映团队主动发起的返工动作。只统计手动重试会低估重跑规模,把自动重试全部计入又可能高估团队的实际返工。两个口径并列呈现,横向比较时说明采用哪一个。


构建记录里缺少提交标识或失败原因字段,还能算重跑率吗?


可以算,但需要降级处理并注明。缺少提交标识时,改用“同一流水线+同一分支+相近时间窗”近似判断重跑,结果偏保守;缺少失败原因时归入“未分类”,该类别占比过高说明日志采集需要改进,应先补数据再谈治理。缺少开始时间或执行结果的记录无法归入周期,剔除并记录剔除数量。


重跑率连续几周上升,是不是就该立项治理?


先看上升是否超出自身历史基线的波动区间,再看失败类型结构。若增量集中在环境类、依赖类等可治理原因上,且反复出现在同一流水线或影响到合并、发布动作,专项治理有明确价值;若失败分散在大量偶发原因上,优先做的是提升可观测性,例如补齐失败原因字段和日志,而不是立即立项。


把重跑率纳入团队考核会有什么问题?


重跑率受构建频次、分支策略、自动重试配置影响,直接挂钩绩效容易引导出与目标相反的行为,例如减少重跑次数但延长单次修复时间,或改为人工介入而不重跑,指标下降但实际返工并未减少。更稳妥的做法是把它作为诊断工具,与失败类型分布、平均修复时长一起看,治理动作落在具体失败类别上。

animation hi
animation dot left
animation dot right
animation dot right bottom
avatar circle
WeChat QR Code
长按将二维码保存为图片

售前电话

400-188-1518

文章配图预览