抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

本文以资深 DevOps 工程师的视角重写,重点不是背定义,而是讲清 DevOps 的底层逻辑、交付链路、度量方式、安全与可靠性,以及企业落地时真正会遇到的取舍。参考 DORA、Google SRE、OpenGitOps、SLSA 等公开资料。

最后更新:2026-10-23

DevOps 到底是什么

DevOps 不是一款工具,也不是一个“把运维合并进开发”的组织调整。它是一组让软件从提交到生产、再到反馈的整条链路更快、更稳、更可持续的实践和文化。

比较通用的框架是 CALMS:

  • Culture:共同目标、共同责任、无指责沟通
  • Automation:把重复、易错、可标准化的环节自动化
  • Lean:小批量、减少 WIP、缩短前置时间
  • Measurement:用数据判断改进是否有效
  • Sharing:知识、工具、责任共担

另一个常用来解释 DevOps 的模型是“三条流”:

  1. 流动:从开发到运维、从需求到用户,减少交接、排队和返工
  2. 反馈:生产问题、监控、用户反馈快速回到开发
  3. 持续学习:复盘、实验、共享,避免同一个坑反复踩

常见误解

  • “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 交付效能指标

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 定义的四条原则:

  1. Declarative:期望状态用声明式描述
  2. Versioned and Immutable:状态存储在不可变、可版本化的地方
  3. Pulled Automatically:agent 自动拉取期望状态
  4. Continuously Reconciled:agent 持续观察实际状态并收敛

GitOps 不是“把 YAML 放 Git”这么简单:

  • 必须有 reconcile loop
  • 必须有漂移检测和纠正
  • 必须有权限边界和审计
  • 密钥不能明文进 Git
  • 环境差异用 overlay/values,不要复制多份

IaC 的工程化

  • IaC 代码要 review、测试、版本化
  • 用 plan/diff 做变更预览
  • 状态文件要加密、锁定、备份
  • 用策略即代码限制高危资源
  • 定期检测漂移
  • 销毁和重建要演练

测试与质量

测试金字塔

  • 大量单元测试
  • 适量集成/契约测试
  • 少量 e2e
  • 按需性能、混沌、安全测试

测试不是越多越好,而是分层合理、反馈快、可信。

质量门禁

  • 代码评审
  • 静态检查、类型检查
  • 单元/集成测试
  • 安全扫描
  • 许可证检查
  • 制品签名/来源校验

门禁要自动化、可解释、可绕过但有记录;不要用人工审批拖慢所有变更。

混沌工程

混沌工程不是随机搞破坏,而是:

  1. 定义稳态指标
  2. 提出假设
  3. 在受控环境注入故障
  4. 观察系统行为
  5. 修复并复盘

从非生产环境开始,逐步到生产的小范围实验。

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、升级路径
  • 交接要有文档和过渡期

认知负荷

  • 一个团队不能同时负责太多系统
  • 平台要减少重复认知,不是增加新工具
  • 用模板、默认值、自动化把最佳实践固化
  • 避免“每个团队都造一套轮子”

变更管理

  • 变更要小、可回滚、可观测
  • 高风险变更要评审和演练
  • 审批要自动化、基于风险,而不是所有变更都开会
  • 变更记录要可追溯

度量与成熟度

度量体系

建议分三层:

  1. 交付效能:DORA 五项、流动效率、批量大小
  2. 可靠性:SLI/SLO、错误预算、MTTR、事故数
  3. 业务与体验:转化率、可用性感知、开发者满意度、上手时间

成熟度模型

不要用“等级”自嗨,成熟度应该回答:

  • 能否稳定、频繁、小批量交付?
  • 出问题能否快速发现、恢复、学习?
  • 平台是否降低认知负荷?
  • 安全/合规是否内建?
  • 团队是否可持续,不被 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 ──────┐
checkout ─┼─ lint ──────┼─ build ─┬─ image ─┬─ sign ─┐
└─ typecheck ─┘ │ └─ sbom ─┼─ promote
└─ integration ────┘

设计原则:

  • 快速检查先跑,失败尽早返回。
  • 独立任务并行,缩短关键路径。
  • 重任务(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 解决:

  1. PR 进入队列。
  2. 系统把 PR 与当前主干组合成临时分支。
  3. 跑 CI。
  4. 通过后按顺序合并。
  5. 失败则退回,不阻塞整条队列。

适合高并发合并的团队;小团队可以从“合并前 rebase + 必要检查”开始。

测试选择与 Flaky 治理

  • Test impact analysis:根据变更文件选择相关测试,缩短反馈。
  • Test selection:按风险/历史失败率选择测试。
  • Flaky quarantine:不稳定测试移出主门禁,单独跟踪修复。
  • 禁止“重跑到绿”作为常态;重跑只能用于确认基础设施抖动。
  • 记录 flake rate、平均修复时间、隔离数量。

制品晋升

build → test → staging → prod
同一 digest,不重新构建
  • 制品不可变,用 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% 流量看看”,而是有假设、有指标、有判定:

  1. 选 baseline(当前稳定版)和 canary(新版本)。
  2. 定义 guardrail:错误率、p99 延迟、饱和度、业务指标。
  3. 小流量、短时间观察。
  4. 与 baseline 对比,考虑样本量和波动。
  5. 达标则扩大,不达标自动回滚。
  6. 记录决策和证据。

注意:

  • 低流量服务的统计功效不足,不能只看 5 分钟。
  • 业务指标延迟高,不能等太久;需要代理指标。
  • Canary 环境和真实流量要一致。
  • 自动回滚要有幂等和幂等清理。

Feature Flag 生命周期

创建 → 默认关闭 → 内部用户 → 小流量 → 全量 → 清理

治理:

  • 每个 flag 有 owner、创建时间、过期时间。
  • 区分 release flag、experiment flag、ops flag、permission flag。
  • 定期清理长期 flag,避免“flag 债”。
  • flag 评估要快、可缓存、可观测。
  • 不要在 flag 里写复杂业务分支。

数据库变更:Expand / Contract

安全迁移模式:

  1. Expand:加新字段/新表,应用双写或兼容读。
  2. Backfill:回填历史数据,幂等、可重入。
  3. Migrate:切换读路径到新结构。
  4. 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        少
integration 中
unit 多

微服务/前端复杂系统更接近蜂巢:

  • 单元测试覆盖核心逻辑。
  • 契约测试覆盖服务边界。
  • 组件测试覆盖单个服务。
  • 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/流水线/部署事件关联。
  • 合规要求用策略即代码内建,而不是额外人工步骤。

文化与激励

  • 无指责不等于无责任;关注系统改进和行动项闭环。
  • 奖励“发现并修复问题”,而不只是奖励救火。
  • 鼓励近失事件报告。
  • 管理者示范学习行为。
  • 避免“英雄文化”和长期加班。

转型路线

  1. 找痛点:用价值流图和事故数据。
  2. 建基线:DORA、SLO、toil、开发者体验。
  3. 选试点:1-2 个服务,端到端打通。
  4. 做平台:把试点中的重复能力产品化。
  5. 扩规模:采用率、培训、支持、迁移。
  6. 持续改进:季度复盘指标和平台路线图。

不要直接复制大厂组织;复制原则,按自己的约束设计。

端到端参考架构

Developer
│ git push / PR
▼
Git + Code Review + Merge Queue
│
▼
CI(DAG)
├─ lint/typecheck/unit
├─ build(hermetic、cache)
├─ integration/contract
├─ SBOM + provenance + sign
└─ policy/security scan
│
▼
Artifact Registry(immutable digest)
│
▼
GitOps Repo / CD
├─ dev values
├─ staging values
└─ prod values
│
▼
Progressive Delivery(canary/flag)
│
▼
Kubernetes / Runtime
│
▼
Observability(metrics/logs/traces/SLO)
│
└── feedback → Developer / Platform / SRE
阶段 关键控制 产出 度量
代码 review、分支保护、签名提交 commit lead time 起点
CI 缓存、隔离、可重复 artifact + SBOM + provenance 构建时长、成功率
制品 不可变、扫描、签名 image digest 漏洞、签名覆盖率
CD 策略、审批、晋升 部署事件 部署频率、失败率
发布 canary、flag、回滚 发布记录 恢复时间、错误预算
运行 SLO、告警、值班 事故/复盘 MTTA/MTTR、toil
反馈 复盘、平台改进 行动项 关闭率、复发率

一次变更的理想路径:

  1. 小 PR,自动检查快速反馈。
  2. 合并队列验证组合。
  3. 构建一次,生成 SBOM/provenance,签名。
  4. 自动晋升到 staging,跑契约/集成。
  5. GitOps 部署到 prod,先 1% canary。
  6. guardrail 通过后逐步放量。
  7. 观察 SLO,异常自动回滚/关 flag。
  8. 复盘数据进入平台改进。

深度评估清单

流动

  • 能量化 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

参考资料