CI/CD、发布策略、数据库迁移与回滚

一次发布可能同时包含应用代码和数据库结构变化。应用回滚了,数据库却未必能直接退回去。下面把构建、验证、发布与迁移按顺序安排,重点讨论出问题后怎样减少影响,而不只展示成功路径。

可靠交付把同一受验证制品从构建推进到环境,通过自动门禁、渐进流量和可执行回滚降低变更风险。

1. 本文覆盖范围

  • CI 验证与制品
  • CD 环境晋级
  • rolling/blue-green/canary
  • 数据库兼容迁移与回滚

2. 核心知识详解

1. CI 与制品

每次提交执行格式、静态检查、单元/集成/安全测试,构建一次不可变制品并附 SBOM、签名和 commit。

  • 缓存只加速且不改变依赖结果。
  • 分支保护和评审按风险设置。
  • 失败日志脱敏并保留足够定位信息。

这里容易混淆的是: 在每个环境重新构建会导致测试制品与生产制品不一致。

2. 环境晋级

CD 按相同 digest 从测试、预发推进生产,配置差异来自受控环境声明。批准可以自动基于策略或人工处理高风险变更。

  • 部署前检查容量、依赖和迁移兼容。
  • 部署后执行 smoke/关键 SLI 验证。
  • 发布记录关联变更、责任人和运行指标。

这里容易混淆的是: 环境完全相同不现实,关键是差异显式、版本化并可测试。

3. 渐进发布

rolling 逐批替换;blue-green 切换整套环境;canary 逐步扩大真实流量。选择取决于容量、状态、成本和路由能力。

  • 按错误率、延迟和业务指标自动停止。
  • canary 样本量和用户分群避免误判。
  • 回滚包括应用、配置、路由和消费者版本。

这里容易混淆的是: 流量切回旧版本不自动撤销新版本写入的数据或外部副作用。

4. 数据迁移

expand/contract 先添加兼容结构和双读/双写或回填,再切换读取,最后在旧版本退出后删除旧结构。

  • 迁移锁和耗时在生产规模副本上测试。
  • 回填可暂停、重入、限速和校验。
  • 删除列/事件字段经过消费者兼容窗口。

这里容易混淆的是: 破坏性 DDL 常缺少即时回滚;应设计前向修复和数据备份验证。

3. 工程链路

flowchart LR A["Commit"] --> B["Test/Scan"] B --> C["Build once + Sign"] C --> D["Test Env"] D --> E["Canary"] E --> F{"SLI/业务门禁"} F -->|通过| G["全量"] F -->|失败| H["停流/回滚/前向修复"]

4. 教学示例(结合本章运行前提)

这是一次新增字段和索引的迁移示意。执行前要按数据库与表规模评估锁和耗时,并确认旧应用仍能使用新结构。回滚应用不等于自动撤销数据库变更,因此迁移顺序需要提前设计。

sql
-- V3__add_order_version.sql ALTER TABLE orders ADD COLUMN version BIGINT NOT NULL DEFAULT 0; CREATE INDEX idx_orders_status_created ON orders(status, created_at DESC);

5. 实践与验证

  1. 设计可兼容两个应用版本的字段迁移。
  2. 为 canary 设置错误率、p99 和业务转化门禁。
  3. 演练应用回滚但数据已由新版本写入的处理。

6. 掌握检查

  • 能实现 build once。
  • 能选择发布策略。
  • 能设自动停止条件。
  • 能设计 expand/contract。

参考资料