4. 构建阶段 SLI:构建成功率、构建时长、构建频率、构建资源利用率、构建缓存命中率
构建阶段是 CI/CD 流水线的核心环节,将源代码转换为可部署的制品。该阶段的 SLI 直接反映代码编译、打包、静态检查等过程的健康度与效率。本章详细定义五个关键 SLI 的口径、计算方式及选型对比。
4.1 构建成功率(Build Success Rate)
定义:在给定时间窗口内,构建任务成功完成的比率。这是衡量流水线稳定性的首要指标。
| 口径维度 | 推荐口径 | 说明 |
|---|---|---|
| 分子 | 成功构建次数 | 构建任务以退出码 0 结束,且生成预期制品 |
| 分母 | 总触发构建次数 | 包含手动触发、代码提交触发、定时触发 |
| 时间窗口 | 最近 7 天 / 30 天 | 滚动窗口,避免单日波动干扰 |
| 排除项 | 基础设施故障导致的失败 | 如构建节点宕机、网络超时,应单独归因 |
实践建议:构建成功率低于 95% 时应触发告警。建议按分支维度拆分(主分支 vs 特性分支),主分支成功率目标应 ≥ 99%。
4.2 构建时长(Build Duration)
定义:从构建任务开始到结束所消耗的时钟时间。该 SLI 影响开发者反馈循环速度。
- P50 构建时长:反映典型构建体验,用于日常监控。
- P95 构建时长:反映长尾构建问题,用于识别异常慢的构建。
- 构建时长趋势:按周/月对比,判断是否因代码膨胀或依赖增加而退化。
注意:构建时长应区分“全量构建”与“增量构建”。增量构建通常利用缓存,时长应显著低于全量构建。建议分别设定 SLI 阈值。
4.3 构建频率(Build Frequency)
定义:单位时间内构建任务的触发次数。反映团队交付节奏和流水线自动化程度。
| 频率等级 | 典型值 | 适用场景 |
|---|---|---|
| 低 | 每日 < 5 次 | 手动触发、低频发布项目 |
| 中 | 每日 10-50 次 | 常规 CI 流程,按代码提交触发 |
| 高 | 每日 > 100 次 | 微服务架构、频繁合并、多分支并行 |
构建频率应与团队规模匹配。过高的构建频率可能导致资源竞争,过低则反映交付瓶颈。
4.4 构建资源利用率(Build Resource Utilization)
定义:构建任务对计算资源(CPU、内存、磁盘 I/O)的消耗程度。用于容量规划和成本优化。
- CPU 利用率:构建过程中 CPU 的平均使用率。编译密集型任务通常较高。
- 内存峰值:构建任务的最大内存占用。用于确定构建节点的规格。
- 磁盘 I/O 等待:反映依赖下载、缓存读写等操作的瓶颈。
常见陷阱:仅看平均利用率可能掩盖峰值问题。建议同时监控 P95 资源利用率,并设置资源配额上限,防止单个构建任务耗尽节点资源。
4.5 构建缓存命中率(Build Cache Hit Rate)
定义:构建过程中缓存被成功命中的比例。高缓存命中率可显著缩短构建时长。
| 缓存类型 | 命中率计算 | 优化方向 |
|---|---|---|
| 依赖缓存 | 缓存命中的依赖项数 / 总依赖项数 | 锁定版本、使用共享缓存层 |
| 编译缓存 | 增量编译命中的文件数 / 总编译文件数 | 合理划分模块、避免全量重编译 |
| Docker 层缓存 | 命中的镜像层数 / 总层数 | 优化 Dockerfile 指令顺序 |
目标值:依赖缓存命中率应 ≥ 90%,编译缓存命中率应 ≥ 70%。若命中率持续低于 50%,需检查缓存键设计或清理策略。
4.6 构建阶段 SLI 架构关系图
下图展示了五个 SLI 在构建阶段中的关联关系及数据流向:
4.7 SLI 选型对比矩阵
不同团队对构建阶段 SLI 的优先级不同。下表对比各 SLI 的适用场景与权衡:
| SLI | 核心关注点 | 推荐阈值 | 优先选型场景 | 次要场景 |
|---|---|---|---|---|
| 构建成功率 | 稳定性 | ≥ 95% | 所有 CI/CD 流水线 | — |
| 构建时长 | 反馈速度 | P50 < 10min | 高频提交团队 | 低频发布项目 |
| 构建频率 | 交付节奏 | 每日 ≥ 10 次 | 微服务/持续部署 | 单体应用 |
| 资源利用率 | 成本与容量 | CPU < 80% | 共享构建集群 | 专用构建节点 |
| 缓存命中率 | 效率优化 | ≥ 70% | 大型项目/多分支 | 小型项目 |
4.8 构建缓存命中率优化流程
缓存命中率是构建效率的关键杠杆。以下流程图展示优化决策路径:
4.9 构建阶段 SLI 实施检查清单
在流水线中落地构建阶段 SLI 时,建议按以下步骤执行:
- 定义基线:收集过去 30 天的构建数据,计算各 SLI 的当前值。
- 设定目标:根据团队交付要求,为每个 SLI 设定 SLO(服务等级目标)。
- 埋点采集:在构建工具(如 Jenkins、GitLab CI、GitHub Actions)中输出结构化日志。
- 可视化:使用 Grafana 或类似工具构建构建阶段 SLI 仪表盘。
- 告警配置:当 SLI 偏离 SLO 时触发告警,并关联到构建日志。
- 持续优化:定期回顾 SLI 趋势,调整缓存策略或构建资源配置。
工具集成示例:在 Jenkins Pipeline 中,可通过
buildDiscarder 记录构建时长,通过 cache 插件统计缓存命中率。在 GitLab CI 中,CI_JOB_DURATION 和 CI_CACHE_HIT 变量可直接用于 SLI 计算。
# 示例:GitLab CI 中输出构建 SLI 指标
build_job:
script:
- echo "BUILD_START=$(date +%s)" >> build.env
- ./compile.sh
- echo "BUILD_END=$(date +%s)" >> build.env
- echo "BUILD_STATUS=$?" >> build.env
- echo "CACHE_HIT=$CI_CACHE_HIT" >> build.env
artifacts:
reports:
dotenv: build.env
通过上述 SLI 口径与实施方法,团队可以量化构建阶段的表现,识别瓶颈,并持续提升流水线的可靠性与效率。