CI 流水线结果桑基图:从触发到失败原因

跟踪流水线运行:从触发方式到结果,再到每次失败的原因:不稳定测试、真实回归、配置与环境。

CI 流水线桑基图按触发方式显示构建如何结束,以及为什么失败。它把有意义的失败(回归)和没有意义的失败(不稳定测试)区分开来。

示例有 900 次流水线运行,来自三种触发方式:推送到主分支、拉取请求和夜间构建。760 次通过所有阶段,140 次失败,分别失败于构建(37)、测试(96)或部署(7)。最后一列给出原因:不稳定测试、真实回归、代码错误、依赖或配置,以及测试环境。

通过率掩盖了其中的构成。示例中,96 次测试失败有 35 次是不稳定测试,这是测试套件的信任问题;45 次是真实回归,说明流水线在正常发挥作用。计数是运行次数而不是提交数,所以一次重试就是一次运行。关于之前的评审阶段,请看 /zh/sankey/pull-request-review-flow,更完整的流程请看 /zh/guides/查找软件发布流程瓶颈。

如何阅读此图表

  • 900 次运行中有 760 次(84%)通过所有阶段;140 次(16%)失败。
  • 测试是最常见的失败点:140 次失败中有 96 次(69%)。
  • 35 次失败是不稳定测试,占全部失败的 25%;45 次是真实回归。
  • 拉取请求的运行通过率为 82%(500 次中的 410 次),主分支为 90%(300 次中的 270 次)。

图表背后的数据

数字为虚构,仅作说明,并非任何真实机构、团队或系统的数据。单位为流水线运行次数。

CI 流水线结果桑基图:从触发到失败原因 (次流水线运行)
来源目标数量(次流水线运行)
推送到主分支通过所有阶段270
推送到主分支构建失败8
推送到主分支测试失败17
推送到主分支部署失败5
拉取请求通过所有阶段410
拉取请求构建失败25
拉取请求测试失败65
夜间构建通过所有阶段80
夜间构建构建失败4
夜间构建测试失败14
夜间构建部署失败2
构建失败代码错误15
构建失败依赖或配置22
测试失败不稳定测试35
测试失败真实回归45
测试失败环境16
部署失败依赖或配置3
部署失败环境4

同样的数据(CSV)

source,target,value
推送到主分支,通过所有阶段,270
推送到主分支,构建失败,8
推送到主分支,测试失败,17
推送到主分支,部署失败,5
拉取请求,通过所有阶段,410
拉取请求,构建失败,25
拉取请求,测试失败,65
夜间构建,通过所有阶段,80
夜间构建,构建失败,4
夜间构建,测试失败,14
夜间构建,部署失败,2
构建失败,代码错误,15
构建失败,依赖或配置,22
测试失败,不稳定测试,35
测试失败,真实回归,45
测试失败,环境,16
部署失败,依赖或配置,3
部署失败,环境,4

运作方式

  1. 导出一个周期的流水线运行

    包含触发方式、首个失败的阶段和结果。重新运行算作单独的运行。

  2. 标注每次失败的原因

    使用一份简短的列表:不稳定、回归、代码错误、配置、环境。没有原因的失败归入“未知”,这值得显示出来。

  3. 统计触发、结果与原因

    每次运行只算一次,按其首个失败的阶段计。

  4. 检查平衡

    每个失败阶段流出的运行数必须等于流入的。通过在第二列结束。

常见问题

如何区分不稳定测试和回归?

常见的规则是:没有代码改动,重试后由失败变为通过的测试就是不稳定的。使用你团队已有的规则,并在每个周期保持一致。

为什么按运行次数而不是提交数计?

运行次数是 CI 系统记录的内容。如果想按提交计,就让每个提交按最终结果只算一次,并在数据说明里写明。

编辑这张 CI 流水线桑基图

把示例作为你自己的图表打开,填入你的流水线计数。

编辑这张 CI 流水线桑基图

桑基图中的更多内容