本文以资深 DevOps 工程师的视角重写,重点不是背定义,而是讲清 DevOps 的底层逻辑、交付链路、度量方式、安全与可靠性,以及企业落地时真正会遇到的取舍。参考 DORA、Google SRE、OpenGitOps、SLSA 等公开资料。
最后更新:2026-10-23
- DevOps 到底是什么
- DevOps、SRE、平台工程的区别
- 价值流与交付效能
- 持续集成
- 持续交付与持续部署
- 基础设施即代码
- 测试与质量
- DevSecOps 与供应链安全
- 可观测性与 SRE
- 平台工程
- 文化与组织
- 度量与成熟度
- 企业落地路线
- 工具链地图
- 常见反模式
- 深入流动与排队
- 深入CI架构
- 深入发布工程
- 深入IaC与GitOps
- 深入测试与质量
- 深入供应链安全
- 深入平台工程
- 深入度量体系
- 深入组织与变更
- 端到端参考架构
- 深度评估清单
- 附录
DevOps 到底是什么
DevOps 不是一款工具,也不是一个“把运维合并进开发”的组织调整。它是一组让软件从提交到生产、再到反馈的整条链路更快、更稳、更可持续的实践和文化。
比较通用的框架是 CALMS:
- Culture:共同目标、共同责任、无指责沟通
- Automation:把重复、易错、可标准化的环节自动化
- Lean:小批量、减少 WIP、缩短前置时间
- Measurement:用数据判断改进是否有效
- Sharing:知识、工具、责任共担
另一个常用来解释 DevOps 的模型是“三条流”:
- 流动:从开发到运维、从需求到用户,减少交接、排队和返工
- 反馈:生产问题、监控、用户反馈快速回到开发
- 持续学习:复盘、实验、共享,避免同一个坑反复踩
常见误解
- “DevOps 就是 CI/CD”:CI/CD 是交付链路的一部分,DevOps 还包括组织、文化、可靠性、安全和平台。
- “DevOps 就是开发兼运维”:让开发轮流值班可以增加同理心,但不等于 DevOps;关键是责任边界和反馈闭环。
- “买了平台就是 DevOps”:工具能降低门槛,但流程、权限、度量和文化不变,工具只会把旧问题自动化。
- “DevOps 不需要运维”:需要,只是运维从“手工操作”转为“平台能力、可靠性工程和自动化”。
- “发布越快越好”:速度必须和稳定性、风险、业务价值一起看;没有可观测性和回滚能力的快,是事故放大器。
DevOps 的目标
不是“让开发更爽”,而是缩短从想法到用户价值的时间,同时保持甚至提升可靠性:
- 更小的变更批量
- 更短的反馈周期
- 更少的交接和等待
- 更可重复的环境和发布
- 更快的故障恢复
- 更低的变更失败率
- 更好的开发者体验和认知负荷
DevOps、SRE、平台工程的区别
| 维度 | DevOps | SRE | 平台工程 |
|---|---|---|---|
| 核心 | 文化、流程、交付链路 | 用工程方法保障可靠性 | 把基础设施和交付能力产品化 |
| 关注点 | 流动、反馈、协作 | SLO、错误预算、toil、事故 | 自助服务、黄金路径、开发者体验 |
| 典型产出 | CI/CD、IaC、发布流程 | SLO、监控、值班、复盘 | IDP、平台 API、模板、门户 |
| 度量 | 交付周期、部署频率、失败率 | SLI/SLO、错误预算、MTTR | 采用率、上手时间、认知负荷 |
| 与业务关系 | 支撑交付 | 平衡可靠性与创新 | 降低平台使用成本 |
三者不是互相替代:
- DevOps 是组织级的方向
- SRE 是可靠性工程的专业化
- 平台工程是把 DevOps/SRE 能力做成可复用产品
一个常见组合是:平台团队提供黄金路径和 IDP,SRE 定义可靠性和 SLO,业务团队按平台路径交付并承担服务责任。
与敏捷、ITIL 的关系
- 敏捷解决“怎么组织需求和开发”,DevOps 解决“怎么把变更安全地交付到生产”
- ITIL 强调服务管理和流程控制,DevOps 强调流动和自动化;两者可以结合,但不能把审批链原样搬进 CI/CD
- 合规场景不是“不要 DevOps”,而是把控制点自动化、可审计化,例如策略即代码、审计日志、变更记录
价值流与交付效能
价值流
价值流是从需求进入系统到用户获得价值的一整条路径。DevOps 优化的不是某个团队的动作,而是整条路径的等待、交接、返工和批量。
需要区分:
- Lead time:从提出需求到交付给用户的时间
- Cycle time:从开始处理到完成的时间
- Queue time:等待时间,通常比处理时间更长
- Flow efficiency:有效工作时间 / 总前置时间
大多数交付问题不在“写得慢”,而在排队、等待审批、环境不足、测试阻塞、发布窗口。
DORA 交付效能指标

图 1:DORA 官方交付效能指标示意
DORA 早期提出“四个关键指标”,后来演进为五个指标,分为吞吐和稳定性两类:
吞吐(Throughput)
- Change lead time:从代码提交到生产部署的时间
- Deployment frequency:单位时间内部署次数,或两次部署间隔
- Failed deployment recovery time:部署失败后恢复到正常的时间
稳定性(Instability)
- Change fail rate:需要立即干预的部署比例(回滚、热修复等)
- Deployment rework rate:因生产事故而发生的非计划部署比例
关键结论:
- 速度和稳定性不是天然对立;高效团队通常在所有指标上都更好
- 指标适合按应用/服务看,不适合直接把不同团队混在一起排名
- 指标是改进工具,不是绩效考核武器
度量陷阱
- 只看部署频率,不看失败率和恢复时间,会鼓励“莽发布”
- 只看 lead time,不看批量大小,会忽略等待和返工
- 用指标排名团队,会引发数据造假和局部优化
- 只测交付,不测业务结果和开发者体验,会优化错方向
- 指标没有基线、没有趋势、没有上下文,结论不可信
好的做法:先建立基线,按季度看趋势,结合业务指标、SLO、开发者体验和事故复盘一起判断。
持续集成
核心原则
- 小批量:每次变更尽量小,降低集成风险
- 频繁集成:至少每天合入主干,避免长期分支
- 主干开发:trunk-based development,短分支 + feature flag
- 构建一次,多处部署:同一 artifact 从测试到生产逐级晋升
- 快速反馈:CI 失败要能在几分钟内定位
- 可重复构建:同样的输入产生同样的输出
一条实用的 CI 流水线
提交 → lint/格式 → 单元测试 → 构建 → 制品 → 集成测试 → 安全扫描 → 发布候选 |
分层建议:
- 快速层(1–5 分钟):lint、类型检查、单元测试、依赖缓存
- 中速层(5–20 分钟):构建、集成测试、契约测试、镜像扫描
- 慢速层:e2e、性能、混沌,按需或定时执行
不要把所有测试塞进每次提交,否则反馈变慢,团队会开始绕过 CI。
制品管理
- 制品要不可变,用 digest 固定,不要用浮动 tag
- 构建产物包含版本、commit、构建时间、依赖清单
- 制品仓库要有保留策略、权限、扫描和签名
- 生产部署只部署已经验证过的制品,不要在生产现场重新构建
测试策略
- 单元测试覆盖核心逻辑,快且稳定
- 集成测试覆盖数据库、消息、外部依赖边界
- 契约测试覆盖服务间接口,减少 e2e 依赖
- e2e 只覆盖关键用户路径,避免又慢又脆
- 对 flaky test 零容忍,否则 CI 会失去可信度
CI 反模式
- CI 跑 1 小时,开发者提交后去干别的
- 共享 runner 被大任务占满
- 构建环境不稳定,靠“重跑一次”
- 测试依赖生产数据或人工环境
- 只在合并前跑 CI,分支长期不同步
- 用
latest镜像,构建不可复现
持续交付与持续部署
交付 vs 部署
- 持续交付(Continuous Delivery):代码始终处于可部署状态,但是否上线由业务决定
- 持续部署(Continuous Deployment):通过自动化验证后自动上线,不需要人工批准
大多数企业先做到持续交付,再对低风险服务尝试持续部署。不要为了“DevOps 成熟度”强行全自动。
发布与部署分离
- 部署:把制品放到环境里
- 发布:让用户真正看到新功能
两者分离后,可以用 feature flag、流量切分、灰度来控制暴露面。
发布策略
| 策略 | 特点 | 适用 |
|---|---|---|
| Rolling | 逐步替换实例,资源占用低 | 大多数无状态服务 |
| Blue-Green | 两套环境切换,回滚快 | 关键服务、需要快速回滚 |
| Canary | 小流量验证,逐步放量 | 高风险变更、核心链路 |
| Feature Flag | 部署与发布解耦 | 需要按用户/租户控制 |
| Shadow | 复制流量到新版本,不影响主链路 | 验证新逻辑、性能 |
无论哪种,都要有:
- 健康检查和就绪探针
- 自动回滚或快速回滚
- 可观测性对比(错误率、延迟、饱和度)
- 数据库迁移的向前/向后兼容
数据库变更
数据库是发布中最容易出事的部分:
- 先加字段、双写、回填、切读、再删旧字段
- 迁移脚本要幂等、可重入、可回滚或可前滚
- 大表变更要评估锁和复制延迟
- 应用发布和数据库迁移解耦,避免“代码先上、库没改”
基础设施即代码
两类 IaC
- Provisioning:创建网络、计算、存储、集群,例如 Terraform、CloudFormation、Pulumi
- Configuration management:配置操作系统和软件,例如 Ansible、Puppet、Chef
两者解决不同问题,不能互相替代。
声明式与命令式
- 命令式:告诉系统“怎么做”,容易产生漂移
- 声明式:告诉系统“要什么”,由工具负责收敛
生产优先声明式,配合状态文件和 plan/diff。
不可变基础设施
不可变基础设施的核心是:服务器/容器一旦部署,不原地修改;变更通过替换新实例完成。
优点:
- 环境一致,减少配置漂移
- 回滚简单,直接切回旧版本
- 构建、测试、生产使用同一制品
代价:
- 启动和替换成本更高
- 有状态服务需要额外设计
- 需要成熟的镜像、编排和销毁流程
GitOps
OpenGitOps 定义的四条原则:
- Declarative:期望状态用声明式描述
- Versioned and Immutable:状态存储在不可变、可版本化的地方
- Pulled Automatically:agent 自动拉取期望状态
- Continuously Reconciled:agent 持续观察实际状态并收敛
GitOps 不是“把 YAML 放 Git”这么简单:
- 必须有 reconcile loop
- 必须有漂移检测和纠正
- 必须有权限边界和审计
- 密钥不能明文进 Git
- 环境差异用 overlay/values,不要复制多份
IaC 的工程化
- IaC 代码要 review、测试、版本化
- 用 plan/diff 做变更预览
- 状态文件要加密、锁定、备份
- 用策略即代码限制高危资源
- 定期检测漂移
- 销毁和重建要演练
测试与质量
测试金字塔
- 大量单元测试
- 适量集成/契约测试
- 少量 e2e
- 按需性能、混沌、安全测试
测试不是越多越好,而是分层合理、反馈快、可信。
质量门禁
- 代码评审
- 静态检查、类型检查
- 单元/集成测试
- 安全扫描
- 许可证检查
- 制品签名/来源校验
门禁要自动化、可解释、可绕过但有记录;不要用人工审批拖慢所有变更。
混沌工程
混沌工程不是随机搞破坏,而是:
- 定义稳态指标
- 提出假设
- 在受控环境注入故障
- 观察系统行为
- 修复并复盘
从非生产环境开始,逐步到生产的小范围实验。
DevSecOps 与供应链安全
Shift Left 不是把安全全推给开发
安全需要左移,但也需要平台化:
- 开发阶段:IDE 插件、pre-commit、依赖扫描
- CI 阶段:SAST、SCA、secret scanning、容器扫描
- 制品阶段:SBOM、签名、来源证明
- 部署阶段:准入策略、镜像签名校验
- 运行阶段:运行时安全、审计、漏洞响应
SBOM
SBOM(Software Bill of Materials)是软件物料清单,记录组件、版本、依赖关系。用途:
- 漏洞爆发时快速定位受影响服务
- 许可证合规
- 供应链审计
- 制品准入
SBOM 不是“生成一个文件就完了”,要能查询、关联和持续更新。
SLSA
SLSA 用等级描述供应链安全保证。v1.0 的 Build track:
| 等级 | 要求 | 防护目标 |
|---|---|---|
| L0 | 无保证 | 无 |
| L1 | 存在 provenance,描述构建过程和输入 | 防误操作、便于审计 |
| L2 | 由托管构建平台生成并签名 provenance | 防构建后被篡改 |
| L3 | 加固的构建平台 | 防构建过程被篡改 |
落地顺序:先有可重复构建和 provenance,再谈签名和加固平台。不要一开始追求 L3。
签名与准入
- 用 cosign/Sigstore 对镜像和制品签名
- 用策略引擎在准入层校验签名、SBOM、漏洞等级
- 密钥和签名身份要独立管理
- 保留审计记录,支持追溯
漏洞管理
- 资产清单:镜像、依赖、基础镜像、运行时
- 优先级:可利用性、暴露面、业务影响,而不是只看 CVSS
- 修复 SLA:按严重程度和暴露面分级
- 例外要有期限和审批,不能永久忽略
可观测性与 SRE
可观测性三支柱
- Metrics:趋势、告警、容量
- Logs:细节、审计、排障
- Traces:跨服务调用链、延迟分解
再加上 Profiling、Events 和 持续剖析,才能覆盖“为什么慢/为什么错”。
SLI、SLO、错误预算
- SLI:可测量的服务质量指标,例如成功率、P95 延迟
- SLO:对 SLI 的目标,例如 99.9% 成功率
- SLA:对外的合同承诺,通常比 SLO 宽松
- Error budget:1 - SLO,允许的失败额度
错误预算的作用是把“可靠性 vs 发布速度”变成可讨论的机制:
- 预算充足:可以更激进地发布
- 预算耗尽:暂停高风险变更,优先修复可靠性
Toil
Toil 是重复、手动、可自动化、随规模线性增长、没有长期价值的工作。
治理方式:
- 识别和量化 toil
- 优先自动化高频、易错、耗时任务
- 把 toil 纳入团队容量规划
- 不要用“加班”掩盖 toil
On-call 与事故管理
- 值班要有轮换、升级路径、runbook 和补偿
- 告警要可行动,避免告警疲劳
- 事故要有 incident commander、沟通渠道和时间线
- 先止血,再定位,再复盘
- 复盘对事不对人,重点是可改进的系统因素
复盘
好的复盘包含:
- 时间线
- 影响范围
- 根因和促成因素
- 哪些措施有效/无效
- 改进项、负责人、期限
- 可复用的经验
不要把复盘写成“某人不小心”,否则下次只会隐藏问题。
平台工程
平台工程是把 DevOps/SRE 能力做成“内部产品”:
- 自助式环境、部署、数据库、可观测性
- 黄金路径:新服务从创建到上线的标准路径
- 平台 API、CLI、门户、模板
- 策略即代码、权限、成本可视化
- 文档、支持、反馈闭环
平台即产品
- 把开发者当用户,度量上手时间、采用率、满意度
- 不要做“强制门户”,要做“更好用的路径”
- 平台团队要有产品经理思维,而不是只做工具堆叠
- 先解决高频痛点,再做“大而全”
Team Topologies
常见团队类型:
- Stream-aligned:按业务流端到端负责
- Platform:提供自助平台
- Enabling:帮助团队采用新能力
- Complicated-subsystem:维护复杂子系统
平台团队的目标是降低 stream-aligned 团队的认知负荷,而不是把所有事情都收归平台。
文化与组织
无指责文化
无指责不是“不追责”,而是:
- 关注系统、流程、工具和决策
- 鼓励主动报告问题和近失事件
- 区分“错误”和“隐瞒”
- 复盘输出可执行改进
所有权
- 团队对自己构建和运行的服务负责
- “你 build,你 run”不是让开发替运维值班,而是让反馈闭环
- 服务要有 owner、SLO、runbook、升级路径
- 交接要有文档和过渡期
认知负荷
- 一个团队不能同时负责太多系统
- 平台要减少重复认知,不是增加新工具
- 用模板、默认值、自动化把最佳实践固化
- 避免“每个团队都造一套轮子”
变更管理
- 变更要小、可回滚、可观测
- 高风险变更要评审和演练
- 审批要自动化、基于风险,而不是所有变更都开会
- 变更记录要可追溯
度量与成熟度
度量体系
建议分三层:
- 交付效能:DORA 五项、流动效率、批量大小
- 可靠性:SLI/SLO、错误预算、MTTR、事故数
- 业务与体验:转化率、可用性感知、开发者满意度、上手时间
成熟度模型
不要用“等级”自嗨,成熟度应该回答:
- 能否稳定、频繁、小批量交付?
- 出问题能否快速发现、恢复、学习?
- 平台是否降低认知负荷?
- 安全/合规是否内建?
- 团队是否可持续,不被 toil 和告警拖垮?
度量反模式
- 用部署频率排名团队
- 用代码行数/提交数衡量产出
- 用告警数量衡量监控水平
- 用“DevOps 成熟度等级”做考核
- 只看工具覆盖率,不看实际流动
企业落地路线
阶段一:建立基线和共识
- 访谈开发和运维,找出等待、返工、事故最多的环节
- 建立 DORA、SLO、事故和 toil 基线
- 选 1–2 个试点服务,不要全公司铺开
- 明确目标:缩短 lead time、降低失败率、减少 toil
阶段二:打通最小交付链路
- 版本控制、代码评审、CI
- 制品仓库、不可变镜像
- 测试环境自助化
- 基础监控和日志
- 一条可重复的部署路径
阶段三:平台化
- 黄金路径模板
- 自助环境、部署、数据库
- 策略即代码、权限、成本
- 可观测性默认开启
- 平台团队和产品化运营
阶段四:规模化与持续改进
- 推广到更多团队
- 度量采用率和效果
- 建立 SRE/值班/复盘体系
- 供应链安全和合规内建
- 定期评估平台和流程
落地原则
- 先解决痛点,再追求“完整平台”
- 先做减法,再做加法
- 自动化的前提是流程稳定
- 不要复制大厂的组织结构,复制他们的原则
- 变更要小步快跑,但要有回滚和观测
工具链地图
| 环节 | 典型工具 | 关注点 |
|---|---|---|
| 代码与评审 | GitLab/GitHub/Gitea | 分支策略、权限、审计 |
| CI | Jenkins/GitLab CI/GitHub Actions/Argo Workflows | 速度、缓存、隔离、可重复 |
| 制品 | Harbor/Nexus/Artifactory | 不可变、扫描、签名 |
| CD/GitOps | Argo CD/Flux | 声明式、漂移检测、回滚 |
| IaC | Terraform/Pulumi/Crossplane | 状态、plan、策略 |
| 配置管理 | Ansible/Puppet/Chef | 幂等、模板、合规 |
| 容器与编排 | Kubernetes/containerd | 调度、发布、弹性 |
| 可观测性 | Prometheus/Grafana/Loki/Tempo/OTel | 指标、日志、追踪、成本 |
| 安全 | Trivy/Grype/Semgrep/cosign/Vault | 扫描、签名、密钥 |
| 平台 | Backstage/Port/自研 IDP | 自助、黄金路径、认知负荷 |
工具不是越多越好。每引入一个工具,都要问:
- 解决什么具体问题?
- 谁维护?
- 如何度量效果?
- 是否增加认知负荷?
- 能否被平台封装?
常见反模式
- 成立“DevOps 团队”把开发和运维隔开:又造了一个孤岛
- CI 只是“能跑”,没人看结果:CI theater
- GitOps 只同步 YAML,没有 reconcile 和漂移检测:只是 Git 存 YAML
- IaC 只是把手工步骤翻译成脚本:没有声明式和幂等
- 微服务化但没有平台:每个团队重复造轮子
- 度量用来排名:数据失真、团队对立
- 安全只做上线前扫描:漏洞和供应链风险仍在
- 没有回滚和可观测性就追求高频发布:事故放大器
- 告警越多越安心:告警疲劳,真正的问题被淹没
- 平台做大而全,没人用:没有产品思维和采用率度量
深入流动与排队
Lead Time、Cycle Time 与 Flow Efficiency
三个最容易被混用的指标:
| 指标 | 起点 | 终点 | 用途 |
|---|---|---|---|
| Lead time | 需求/提交进入系统 | 用户可用 | 端到端交付体验 |
| Cycle time | 团队开始处理 | 完成 | 团队执行效率 |
| Process time | 实际动手时间 | 完成 | 有效工作量 |
| Queue time | 等待开始/等待下一步 | 结束 | 排队与瓶颈 |
| Flow efficiency | Process time / Lead time | - | 流动健康度 |
大多数团队的 flow efficiency 只有 10%-30%:需求在等评审、等环境、等测试、等发布窗口。优化“写代码更快”往往不如减少等待。
Little’s Law
稳定系统中:
WIP = Throughput × Cycle Time |
推导:
Cycle Time = WIP / Throughput |
例子:
- 团队同时有 30 个进行中的需求(WIP)。
- 每周完成 6 个(Throughput)。
- 平均 Cycle Time = 30 / 6 = 5 周。
如果 WIP 翻倍但吞吐不变,周期会翻倍。限制 WIP 是缩短交付周期最直接的手段之一。
利用率与排队
排队时间不是线性的:
等待时间 ∝ 利用率 / (1 - 利用率) × 变异性 |
| 利用率 | 直觉 |
|---|---|
| 50% | 大量空闲,响应快,但资源浪费 |
| 70%-80% | 大多数团队的健康区间 |
| 90% | 小波动就会造成长队列 |
| 100% | 任何变化都会导致雪崩 |
把团队/环境/测试资源跑到 100% 利用率,看似“高效”,实际上会把等待和事故成本转嫁给整条链路。
批量大小
批量越大:
- 反馈越晚,返工成本越高。
- 变更失败影响面越大,回滚越难。
- 测试/评审/发布排队越久。
- 风险越集中。
小批量不是“每次只改一行”,而是:
- 一个可独立验证、可独立回滚的变更。
- 一个 PR 只做一件事。
- 一个发布只包含少量相关变更。
- 数据库迁移拆成 expand/contract 多步。
价值流图
示例:
| 阶段 | 处理时间 | 等待时间 | 备注 |
|---|---|---|---|
| 需求评审 | 2h | 2d | 等排期 |
| 开发 | 2d | 1d | 等依赖 |
| 代码评审 | 2h | 1d | 等 reviewer |
| CI | 20m | 30m | 等 runner |
| 测试 | 4h | 2d | 等环境 |
| 发布 | 30m | 3d | 等窗口 |
| 合计 | 约 3d | 约 9d | flow efficiency ≈ 25% |
优化顺序应该是:先砍等待(环境、窗口、审批、runner),再提升处理速度。
用 CFD 看瓶颈
累计流图(Cumulative Flow Diagram)能看出:
- 哪一列越来越宽:WIP 堆积。
- 哪一列长期平稳:瓶颈。
- 到达和离开的斜率:吞吐是否提升。
- 带宽变化:批量是否过大。
只看平均值会掩盖长尾;看分布(p50/p85/p95)和趋势更可靠。
深入CI架构
流水线是 DAG,不是一条线
成熟 CI 不是“一串命令”,而是有依赖关系的 DAG:
┌─ unit ──────┐ |
设计原则:
- 快速检查先跑,失败尽早返回。
- 独立任务并行,缩短关键路径。
- 重任务(e2e、性能、混沌)放到合并后/定时。
- 构建一次,后续阶段复用同一个 artifact。
- 每个阶段都有明确输入、输出、超时和重试策略。
构建缓存
缓存是 CI 提速的核心,但也是安全风险:
- 依赖缓存(Maven/Gradle/npm/pip/go mod)。
- 构建缓存(Bazel、BuildKit、Turbo、Nx)。
- 远程缓存(团队共享,跨 runner)。
- 缓存 key 要包含依赖文件 hash、工具版本、平台。
- 不要缓存 secrets、构建产物中的敏感文件。
- 跨 fork PR 的缓存要隔离,防止缓存投毒。
Hermetic Build
Hermetic build 指构建过程只依赖显式声明的输入:
- 固定基础镜像 digest。
- 锁定依赖版本(lockfile)。
- 固定工具链版本。
- 构建期间禁止任意网络访问。
- 使用内部镜像/依赖代理。
- 输出可复现(reproducible build)。
可复现构建需要控制:
- 时间戳(
SOURCE_DATE_EPOCH)。 - 文件顺序、路径、权限。
- 编译器和链接器版本。
- 随机数、UUID、构建主机信息。
Merge Queue
主干开发 + 高频合并时,PR 之间的交互会导致“各自通过、合并后失败”。Merge queue 解决:
- PR 进入队列。
- 系统把 PR 与当前主干组合成临时分支。
- 跑 CI。
- 通过后按顺序合并。
- 失败则退回,不阻塞整条队列。
适合高并发合并的团队;小团队可以从“合并前 rebase + 必要检查”开始。
测试选择与 Flaky 治理
- Test impact analysis:根据变更文件选择相关测试,缩短反馈。
- Test selection:按风险/历史失败率选择测试。
- Flaky quarantine:不稳定测试移出主门禁,单独跟踪修复。
- 禁止“重跑到绿”作为常态;重跑只能用于确认基础设施抖动。
- 记录 flake rate、平均修复时间、隔离数量。
制品晋升
build → test → staging → prod |
- 制品不可变,用 digest 固定。
- 环境差异通过配置/Secret 注入,不重新打包。
- 制品仓库保留策略、签名、SBOM、provenance。
- 生产只部署已晋级、已验证的制品。
CI 安全
- 使用 OIDC 短期凭据,不把长期云密钥放 CI。
- 最小权限:每个 job 只拿需要的权限。
- fork PR 不执行不受信任代码,或使用隔离 runner。
- 自托管 runner 要隔离、打补丁、限制网络。
- 缓存、制品、日志都可能泄露 secrets。
- 构建环境本身要可复现、可审计。
CI 性能预算
| 阶段 | 目标 |
|---|---|
| pre-commit | < 2 分钟 |
| PR 快速检查 | < 10 分钟 |
| 主干构建 | < 30 分钟 |
| 发布候选 | < 60 分钟 |
| 夜间全量 | 数小时可接受 |
超过预算时,先优化关键路径、并行化、缓存、测试分层,而不是单纯加机器。
深入发布工程
部署与发布分离
- 部署:制品进入环境。
- 发布:用户开始看到新行为。
分离后可以:
- 先部署、后开流量。
- 按用户/租户/地域灰度。
- 出问题一键关闭 feature flag。
- 数据库迁移与应用发布解耦。
渐进式交付
| 策略 | 核心 | 风险 |
|---|---|---|
| Rolling | 逐步替换实例 | 新旧版本共存 |
| Blue-Green | 两套环境切换 | 资源翻倍、数据库兼容 |
| Canary | 小流量验证 | 需要可靠指标和自动分析 |
| Feature Flag | 代码先上、功能后开 | flag 债务、组合爆炸 |
| Shadow | 复制流量到新版本 | 双倍资源、副作用隔离 |
Canary 分析
Canary 不是“放 5% 流量看看”,而是有假设、有指标、有判定:
- 选 baseline(当前稳定版)和 canary(新版本)。
- 定义 guardrail:错误率、p99 延迟、饱和度、业务指标。
- 小流量、短时间观察。
- 与 baseline 对比,考虑样本量和波动。
- 达标则扩大,不达标自动回滚。
- 记录决策和证据。
注意:
- 低流量服务的统计功效不足,不能只看 5 分钟。
- 业务指标延迟高,不能等太久;需要代理指标。
- Canary 环境和真实流量要一致。
- 自动回滚要有幂等和幂等清理。
Feature Flag 生命周期
创建 → 默认关闭 → 内部用户 → 小流量 → 全量 → 清理 |
治理:
- 每个 flag 有 owner、创建时间、过期时间。
- 区分 release flag、experiment flag、ops flag、permission flag。
- 定期清理长期 flag,避免“flag 债”。
- flag 评估要快、可缓存、可观测。
- 不要在 flag 里写复杂业务分支。
数据库变更:Expand / Contract
安全迁移模式:
- Expand:加新字段/新表,应用双写或兼容读。
- Backfill:回填历史数据,幂等、可重入。
- Migrate:切换读路径到新结构。
- Contract:确认旧路径无流量后删除旧字段/旧代码。
原则:
- 应用代码先兼容新旧 schema,再迁移。
- 迁移脚本幂等、可重入、可观测。
- 大表变更评估锁、复制延迟、磁盘。
- 回滚方案要考虑数据已写入新结构的情况。
- 不要在同一发布里“改 schema + 改代码 + 删旧字段”。
回滚 vs 前滚
- 回滚:切回旧版本,快,但数据库/消息格式可能不兼容。
- 前滚:修复后发布新版本,适合数据库已迁移、回滚成本高的场景。
发布前要明确:
- 回滚触发条件。
- 回滚由谁执行、多久完成。
- 数据是否需要补偿。
- 回滚后如何验证。
发布验证
- 部署后 smoke test。
- 关键业务 synthetic 检查。
- SLO/错误预算 guardrail。
- 日志/追踪抽样。
- 对比 baseline 指标。
- 观察窗口内不允许自动扩大流量。
深入IaC与GitOps
Terraform 深水区
- State:远程 backend、加密、版本化、锁定。
- Workspace:按环境/区域隔离,但不要滥用 workspace 代替目录结构。
- Module:版本固定、输入输出清晰、避免隐式全局状态。
- Plan:所有变更先 plan,review diff,禁止直接 apply 未审计划。
- Import:存量资源先 import,再纳入管理。
- Moved blocks:重构资源地址时避免 destroy/recreate。
- Drift:定期 plan 检测漂移,禁止手工改生产资源。
- Policy:OPA/Conftest/Sentinel 限制高危资源、区域、标签、加密。
- Blast radius:按环境/账号/订阅拆分 state,避免一次 apply 影响全公司。
GitOps 深水区
GitOps 的核心不是“Git 里放 YAML”,而是:
Git(期望状态) → Agent 拉取 → 对比实际状态 → 收敛 → 报告 |
需要:
- 声明式描述。
- 版本化、不可变。
- 自动拉取。
- 持续 reconcile。
- 漂移检测和告警。
- 权限边界和审计。
常见坑:
- 只在部署时同步一次,没有持续 reconcile。
- 手工 kubectl 改生产,Git 不知道。
- 密钥明文进 Git。
- 环境配置复制多份,长期漂移。
- 没有 sync wave/health check,顺序错误。
- 没有回滚策略,Git revert 后等待下一次同步。
环境晋升
推荐:
build once → image digest → dev values → staging values → prod values |
- 同一镜像 digest 贯穿环境。
- 环境差异用 values/overlay/Kustomize。
- 配置和 secret 分离。
- 晋升由 PR/流水线触发,有审计。
- 生产部署前有策略校验和人工/自动 gate。
IaC 测试
fmt/validate/plan。- 策略测试:OPA/Conftest。
- 单元测试:Terratest、Pulumi tests。
- 临时环境:PR 创建、验证、销毁。
- 漂移检测:定时 plan。
- 成本估算:Infracost。
- 安全扫描:tfsec/Checkov/Trivy config。
反模式
- 状态文件提交到 Git。
- 共享 state 无锁。
- 手工改生产后不回写代码。
- 所有环境共用一个 state。
- 模块没有版本约束。
- 用 IaC 包装一次性脚本,但不幂等。
- 没有 plan review 直接 apply。
深入测试与质量
测试金字塔 vs 蜂巢
传统金字塔:
e2e 少 |
微服务/前端复杂系统更接近蜂巢:
- 单元测试覆盖核心逻辑。
- 契约测试覆盖服务边界。
- 组件测试覆盖单个服务。
- e2e 只覆盖关键用户旅程。
- 生产验证(canary、synthetic)补充。
契约测试
消费者驱动契约(Pact 等):
- 消费者定义期望的请求/响应。
- 提供者验证契约。
- CI 中独立运行,减少对完整环境的依赖。
- 契约变更要版本化、兼容性检查。
适合:
- 微服务 API。
- 前后端接口。
- 消息格式。
- 第三方集成。
测试质量
- 覆盖率是滞后指标,不是质量本身。
- 变异测试(mutation testing)能发现“测试无效”。
- 断言质量比测试数量重要。
- flaky test 要有 owner、隔离、修复 SLA。
- 测试数据要可重复、可清理、无 PII。
- 临时环境要能按 PR 创建/销毁。
- 生产测试用 canary/shadow,不要直接打真实用户。
质量门禁
按风险分层:
| 变更类型 | 门禁 |
|---|---|
| 文档/配置 | lint、链接检查 |
| 普通代码 | 单测、静态检查、review |
| 核心链路 | 契约、集成、canary |
| 高风险 | 安全评审、混沌/演练、人工 gate |
| 数据库 | 迁移评审、回滚/前滚方案 |
门禁要快、可解释、可审计;不要所有变更都走同一条重流程。
深入供应链安全
威胁模型
- 依赖混淆/抢注。
- 恶意包/维护者被攻破。
- 构建环境被篡改。
- 制品在仓库/传输中被替换。
- CI 凭据泄露。
- 缓存投毒。
- 基础镜像漏洞。
- 构建脚本执行任意代码。
SLSA
SLSA 关注构建来源和完整性:
- Provenance:谁、用什么源码、什么构建系统、什么参数构建。
- Build track:L1 有 provenance,L2 托管构建+签名,L3 加固构建平台。
- Source track:源码评审、分支保护、双人控制。
- 不要一开始追求最高等级,先把“可追溯 + 可重复 + 签名”做起来。
供应链控制链
源码 → 依赖锁定 → 隔离构建 → 生成 SBOM/provenance |
关键控制:
- 依赖锁定和私有代理。
- 构建使用短期凭据/OIDC。
- 制品签名(cosign/Sigstore)。
- SBOM(SPDX/CycloneDX)+ VEX。
- 准入控制(Kyverno/OPA/Gatekeeper)校验签名、来源、漏洞等级。
- 禁止未签名/未知来源镜像进生产。
- 保留审计和追溯链路。
漏洞管理
- 资产清单是前提:镜像、依赖、基础镜像、运行时。
- 优先级看可利用性、暴露面、业务影响,不只看 CVSS。
- 修复 SLA 按严重级别和暴露面分级。
- 例外要有期限、补偿控制、审批。
- 漏洞爆发时用 SBOM 快速定位影响范围。
深入平台工程
IDP 架构
内部开发者平台通常包含:
| 能力 | 说明 |
|---|---|
| Catalog | 服务、API、Owner、依赖、文档 |
| Templates | 新服务脚手架、黄金路径 |
| Self-service | 环境、数据库、队列、证书 |
| Orchestration | 创建/变更/销毁流程 |
| Deployment | GitOps/CI 集成、回滚 |
| Observability | 默认 Dashboard、告警、SLO |
| Policy | 策略即代码、准入、合规 |
| Cost | 成本可见、预算、分摊 |
| Docs | runbook、API 文档、Onboarding |
平台即产品
- 开发者是用户,不是“被管理者”。
- 度量采用率、上手时间、任务完成率、满意度。
- 黄金路径要“最好用”,而不是“唯一路径”。
- 平台团队要有产品经理、SRE、开发者体验角色。
- 先解决高频痛点,再做“大而全”。
平台 SLO
平台本身也要有 SLO:
- 环境创建成功率/耗时。
- 部署成功率/耗时。
- CI 排队时间。
- 平台 API 可用性。
- 支持响应时间。
平台不稳定会直接放大业务团队的 toil。
Team Topologies
| 团队类型 | 职责 |
|---|---|
| Stream-aligned | 端到端负责业务流 |
| Platform | 提供自助平台 |
| Enabling | 帮助团队采用新能力 |
| Complicated-subsystem | 维护复杂子系统 |
交互模式:
- Collaboration:短期深度合作。
- X-as-a-Service:平台以服务形式提供。
- Facilitating:赋能团队帮助采用。
平台团队的目标是降低认知负荷,而不是把所有工作收归平台。
平台反模式
- 平台团队变成工单队列。
- 门户大而全,没人用。
- 强制所有团队使用,忽视场景差异。
- 没有产品经理和采用率度量。
- 平台团队不值班、不懂生产。
- 只做工具,不做文档/支持/迁移。
深入度量体系
DORA 指标的定义与数据源
| 指标 | 定义 | 数据源 |
|---|---|---|
| Deployment frequency | 成功部署到生产的频率 | 部署系统/流水线事件 |
| Change lead time | 提交到生产的时间 | Git + CI/CD 事件 |
| Change fail rate | 需要立即修复/回滚的部署比例 | 事故/回滚/热修复记录 |
| Failed deployment recovery time | 失败部署恢复到正常的时间 | 事故时间线 |
| Deployment rework rate | 因生产问题导致的非计划部署比例 | 部署 + 事故关联 |
注意:
- 按服务/应用统计,不要跨团队混合排名。
- 用事件数据,不要靠人工填报。
- 明确“失败部署”的定义,避免口径漂移。
- 关注趋势和分布,不只看平均数。
流动指标
- WIP:进行中的工作项。
- Throughput:单位时间完成数。
- Cycle time:开始到完成。
- Lead time:进入到交付。
- Flow efficiency:有效时间/总时间。
- Queue time:等待时间。
- CFD:累计流图。
- Little’s Law:WIP = Throughput × Cycle Time。
统计过程控制
- 用控制图区分“正常波动”和“异常变化”。
- 看 p50/p85/p95,不只看平均。
- 小样本不要下结论。
- 变更前后对比要有基线。
- 指标异常时先查数据质量,再查流程。
DevEx 指标
- Feedback loop:从提交到反馈的时间。
- Cognitive load:完成任务需要掌握多少系统/工具。
- Flow state:开发者有多少不被打断的时间。
- Friction:环境、构建、测试、发布中的痛点。
- 采用率/满意度:平台和工具是否真的被使用。
度量反模式
- 用指标排名个人/团队。
- 用代码行数、提交数、故事点衡量产出。
- 只看部署频率,不看失败率。
- 只看 lead time,不看批量。
- 指标口径频繁变化。
- 数据靠人工填报,失真。
- 用“成熟度等级”做考核。
深入组织与变更
Conway’s Law
系统架构会反映组织沟通结构。反过来,想改变架构,往往要先调整团队边界(Inverse Conway Maneuver)。
实践:
- 按业务能力/价值流划分团队。
- 平台团队服务多个 stream-aligned 团队。
- 减少跨团队依赖和交接。
- 用团队 API/契约降低耦合。
资金与所有权
- 项目制 funding 容易导致“交付即结束”,没有长期 owner。
- 产品制 funding 更适合持续运营的平台/服务。
- 平台要有稳定预算,而不是“项目做完就撤”。
- 成本可见(showback/chargeback),但不惩罚合理使用。
变更管理
- 按风险分级,不是所有变更都走 CAB。
- 低风险变更自动化审批/事后审计。
- 高风险变更要求演练、回滚方案、观察窗口。
- 变更记录自动化,和 Git/流水线/部署事件关联。
- 合规要求用策略即代码内建,而不是额外人工步骤。
文化与激励
- 无指责不等于无责任;关注系统改进和行动项闭环。
- 奖励“发现并修复问题”,而不只是奖励救火。
- 鼓励近失事件报告。
- 管理者示范学习行为。
- 避免“英雄文化”和长期加班。
转型路线
- 找痛点:用价值流图和事故数据。
- 建基线:DORA、SLO、toil、开发者体验。
- 选试点:1-2 个服务,端到端打通。
- 做平台:把试点中的重复能力产品化。
- 扩规模:采用率、培训、支持、迁移。
- 持续改进:季度复盘指标和平台路线图。
不要直接复制大厂组织;复制原则,按自己的约束设计。
端到端参考架构
Developer |
| 阶段 | 关键控制 | 产出 | 度量 |
|---|---|---|---|
| 代码 | review、分支保护、签名提交 | commit | lead time 起点 |
| CI | 缓存、隔离、可重复 | artifact + SBOM + provenance | 构建时长、成功率 |
| 制品 | 不可变、扫描、签名 | image digest | 漏洞、签名覆盖率 |
| CD | 策略、审批、晋升 | 部署事件 | 部署频率、失败率 |
| 发布 | canary、flag、回滚 | 发布记录 | 恢复时间、错误预算 |
| 运行 | SLO、告警、值班 | 事故/复盘 | MTTA/MTTR、toil |
| 反馈 | 复盘、平台改进 | 行动项 | 关闭率、复发率 |
一次变更的理想路径:
- 小 PR,自动检查快速反馈。
- 合并队列验证组合。
- 构建一次,生成 SBOM/provenance,签名。
- 自动晋升到 staging,跑契约/集成。
- GitOps 部署到 prod,先 1% canary。
- guardrail 通过后逐步放量。
- 观察 SLO,异常自动回滚/关 flag。
- 复盘数据进入平台改进。
深度评估清单
流动
- 能量化 lead time、cycle time、queue time、flow efficiency
- 有 WIP 限制,而不是无限并行
- 批量小,PR/发布可独立回滚
- 用 CFD/控制图识别瓶颈
- 关键路径的等待时间有明确改进项
CI
- 流水线是 DAG,关键路径有预算
- 构建可重复、依赖锁定、缓存安全
- 合并队列/主干开发,分支短命
- 测试分层,flaky test 有治理
- 制品不可变,构建一次多处部署
- CI 使用短期凭据和最小权限
CD/发布
- 部署与发布分离
- 有 canary/flag/回滚能力
- 数据库迁移 expand/contract
- 发布后有自动验证和观察窗口
- 回滚/前滚方案经过演练
IaC/GitOps
- 基础设施声明式、版本化
- state 加密、锁定、备份
- 有 plan review 和漂移检测
- GitOps 有持续 reconcile
- 密钥不进 Git
- IaC 有策略/安全/成本检查
测试与质量
- 单测/契约/集成/e2e 分层合理
- 契约测试覆盖服务边界
- 测试数据可重复、无 PII
- 质量门禁按风险分级
- 生产验证用 canary/shadow
供应链安全
- 依赖锁定、私有代理、漏洞扫描
- 构建有 provenance/SBOM
- 制品签名,准入校验
- 短期凭据,无长期密钥
- 漏洞有优先级和修复 SLA
- 例外有期限和补偿控制
平台工程
- 有黄金路径和自助服务
- 平台有 SLO 和采用率指标
- 平台团队有产品经理/SRE
- 降低认知负荷,而不是增加工具
- 平台变更也有回滚和灰度
度量与组织
- DORA/flow/DevEx 指标有明确定义
- 指标用于改进,不用于排名
- 有季度复盘和行动项闭环
- 团队边界与架构一致
- 变更管理按风险分级
- 无指责文化和学习机制落地
附录
术语
- CI:持续集成
- CD:持续交付/持续部署
- IaC:基础设施即代码
- GitOps:以 Git 为期望状态源、自动拉取并持续收敛
- SLI/SLO/SLA:服务质量指标/目标/合同
- Error budget:错误预算
- Toil:重复、手动、可自动化、低价值工作
- SBOM:软件物料清单
- SLSA:供应链安全等级
- IDP:内部开发者平台
- DORA:DevOps Research and Assessment