2. CI/CD 流水线核心阶段:SLI 切入点
CI/CD 流水线通常由代码提交、构建、测试、部署、发布、监控六个核心阶段串联而成。每个阶段都有其独特的质量与效率关注点,SLI(Service Level Indicator)的植入必须与阶段特征对齐,才能准确反映流水线健康度。以下逐一拆解各阶段的 SLI 切入点。
2.1 阶段总览与 SLI 映射
下表列出六个阶段的核心产出、典型故障模式以及对应的 SLI 类别,便于后续逐节展开时建立全局视角。
| 阶段 | 核心产出 | 典型故障模式 | SLI 切入点 |
|---|---|---|---|
| 代码提交 | 代码变更入库 | 提交阻塞、合并冲突、门禁超时 | 提交延迟、门禁通过率 |
| 构建 | 制品/镜像 | 编译失败、依赖下载慢、构建超时 | 构建成功率、构建时长 |
| 测试 | 测试报告 | 用例失败、覆盖率不足、环境不稳定 | 测试通过率、测试覆盖率 |
| 部署 | 运行实例 | 部署失败、回滚、配置错误 | 部署成功率、部署时长 |
| 发布 | 流量切换 | 灰度异常、发布中断、版本回退 | 发布成功率、发布耗时 |
| 监控 | 可观测数据 | 指标缺失、告警延迟、数据断点 | 数据完整性、告警延迟 |
2.2 代码提交阶段
代码提交是流水线的起点,SLI 应聚焦于提交效率与门禁质量。
- 提交延迟(Commit Latency):从开发者执行
git push到流水线触发预检查(如 lint、静态扫描)完成的时间。高延迟会打断开发心流。 - 门禁通过率(Gate Pass Rate):通过代码门禁检查的提交占比。低于 90% 说明门禁规则过严或代码质量下滑。
- 合并冲突率(Merge Conflict Rate):因冲突导致合并失败的 PR 占比,反映分支管理健康度。
实践建议:提交阶段 SLI 的采集点应放在 Git 仓库的 webhook 接收端与门禁服务之间,避免将网络传输抖动计入指标。
2.3 构建阶段
构建阶段将源代码转换为可部署的制品,SLI 应覆盖稳定性与时效性。
- 构建成功率(Build Success Rate):成功构建次数 / 总构建次数。低于 95% 需排查依赖缓存、编译环境或基础镜像问题。
- 构建时长(Build Duration):从构建任务开始到制品产出的耗时。P95 构建时长超过 10 分钟时应考虑并行构建或缓存优化。
- 制品大小变化率(Artifact Size Delta):构建产物大小与基线版本的偏差,用于发现无意识依赖引入。
# 构建成功率计算示例(PromQL 风格)
build_success_rate = (
sum(rate(build_result{status="success"}[5m]))
/
sum(rate(build_result{status=~"success|failure"}[5m]))
) * 100
2.4 测试阶段
测试阶段是质量保障的核心环节,SLI 需区分功能正确性与测试充分性。
- 测试通过率(Test Pass Rate):通过用例数 / 总执行用例数。单元测试通过率应 ≥ 98%,集成测试 ≥ 95%。
- 测试覆盖率(Test Coverage):代码行/分支/函数的覆盖比例。行覆盖率低于 60% 时应触发告警。
- 测试执行时长(Test Execution Duration):全量测试套件的执行时间。超过 30 分钟应考虑分层测试策略。
注意:测试 SLI 必须区分测试层级(单元/集成/E2E),混在一起计算会掩盖真实质量瓶颈。建议按测试类型分别定义 SLI 阈值。
2.5 部署阶段
部署阶段将制品安装到目标环境,SLI 应关注成功率与速度。
- 部署成功率(Deploy Success Rate):部署成功次数 / 总部署次数。生产环境部署成功率应 ≥ 99.5%。
- 部署时长(Deploy Duration):从部署任务启动到实例就绪的时间。P95 部署时长超过 15 分钟需优化部署流程。
- 回滚率(Rollback Rate):触发回滚的部署次数占比。高于 5% 说明发布质量或灰度策略存在问题。
2.6 发布阶段
发布阶段涉及流量切换与版本生效,SLI 需体现可控性与稳定性。
- 发布成功率(Release Success Rate):完成全量流量切换且无异常回滚的发布占比。
- 灰度验证通过率(Canary Pass Rate):灰度期间关键业务指标(如错误率、延迟)未恶化的比例。
- 发布耗时(Release Duration):从开始灰度到全量生效的总时间。超过 60 分钟应考虑自动化灰度策略。
2.7 监控阶段
监控阶段是流水线的闭环,SLI 应衡量数据质量与告警时效。
- 数据完整性(Data Completeness):实际采集的指标点数 / 预期采集点数。低于 99% 说明采集链路存在断点。
- 告警延迟(Alert Latency):从故障发生到告警触发的延迟。P99 告警延迟应 ≤ 5 分钟。
- 监控覆盖率(Monitoring Coverage):被监控的服务实例数 / 总服务实例数。覆盖率应 ≥ 99.9%。
2.8 阶段间 SLI 依赖关系
下图展示六个阶段之间的 SLI 数据流与依赖关系,帮助理解 SLI 的级联影响。
2.9 阶段 SLI 口径设计原则
在定义每个阶段的 SLI 时,需遵循以下三条原则,确保口径可移植、可对比。
- 阶段边界清晰:SLI 的起止时间点必须与阶段的实际执行范围对齐,避免将排队等待时间或下游阶段耗时计入当前阶段。
- 指标原子化:每个 SLI 只衡量一个维度(如成功率、时长、覆盖率),不要将多个维度混合成一个复合指标。
- 阈值可调:不同团队、不同环境(开发/测试/生产)的 SLI 阈值应支持独立配置,但口径计算逻辑保持一致。
关键结论:六个阶段的 SLI 并非孤立存在,它们通过制品流和数据流形成级联依赖。在移植适配时,必须同时考虑阶段内口径和阶段间依赖关系,才能构建出真正可用的流水线 SLI 体系。