4. 持续交付与持续部署

在持续集成(CI)之后,软件交付进入更关键的阶段——持续交付(Continuous Delivery)与持续部署(Continuous Deployment),二者常被统称为 CD。它们共享同一条自动化发布流水线,但在“是否自动进入生产”这一决策点上存在本质差异。理解这一差异,是设计可靠发布体系的前提。

一、核心原理:持续交付与持续部署的边界

持续交付强调:每一次通过质量门禁的变更,都具备随时可发布到生产的能力,但最终是否发布由人工决策触发。它交付的是“可发布状态”,保留业务与合规上的审批控制。持续部署则更进一步:只要变更通过全部自动化验证,就自动发布到生产环境,无需人工干预。二者的关系可以概括为:持续部署是持续交付的严格子集,前者要求后者全部能力,并额外要求极高的自动化测试覆盖与快速回滚机制。

判断标准:如果发布到生产需要有人点击“确认”按钮,那是持续交付;如果代码合并后自动上线,那是持续部署。

在 SDV(软件定义汽车)场景中,车载软件受功能安全与法规约束,通常采用持续交付而非持续部署,即制品可自动构建、测试、签名,但上车发布需经过审批与灰度策略控制。

持续交付 vs 持续部署:发布流水线决策边界 代码提交 构建 / 单元测试 制品库 版本化 / 签名 测试环境 集成 / 验收测试 人工审批 是否发布? 持续交付 人工触发 → 生产发布 持续部署 自动发布生产 关键差异: • 持续交付:制品始终可发布,生产发布由人工审批控制,适合安全/合规敏感场景(如车载软件)。 • 持续部署:通过全部自动化门禁后自动上线,要求高覆盖测试、快速回滚与完善监控。 • 两者共享同一流水线,差异仅在“生产发布”这一决策节点是否自动化。

二、发布流水线设计:从提交到上线的自动化链路

一条完整的发布流水线通常包含以下阶段:代码提交触发构建 → 单元测试与静态检查 → 制品打包与版本标记 → 制品入库 → 部署到测试环境 → 集成/验收测试 → 安全与合规扫描 → 部署到预生产环境 → 生产发布(人工或自动)。每个阶段都应设置质量门禁,失败即阻断并通知责任人。

# 典型发布流水线阶段(GitLab CI 风格)
stages:
  - build        # 编译、单元测试
  - package      # 生成制品、版本号、签名
  - publish      # 推送至制品库
  - deploy-test  # 部署测试环境
  - verify       # 集成/验收测试
  - deploy-prod  # 生产发布(manual 或 auto)

设计要点:阶段之间保持幂等与可重入;制品一次构建、多处部署,避免“构建一次、部署多次”带来的环境漂移;生产发布阶段应支持蓝绿或金丝雀策略。

三、环境管理与制品库管理

环境管理要求开发、测试、预生产、生产环境在配置上保持一致性,差异仅通过环境变量或配置中心注入。常见做法是使用基础设施即代码(IaC)描述环境,确保可重复创建与销毁。制品库则负责存储构建产物(如二进制、容器镜像、OTA 包),并保证版本唯一、可追溯、可签名。制品库应支持不可变存储,禁止覆盖已有版本。

管理对象 核心要求 常见工具/实践
环境 配置一致、可重复创建、隔离 IaC、配置中心、命名空间隔离
制品库 版本唯一、不可变、可追溯、签名 Nexus、Harbor、Artifactory
发布策略 可灰度、可回滚、可观测 蓝绿部署、金丝雀发布

四、蓝绿部署与金丝雀发布:降低发布风险的两类策略

蓝绿部署维护两套完全相同的生产环境(蓝与绿),当前流量指向蓝,新版本部署到绿并验证通过后,通过负载均衡一次性切换流量到绿。优点是切换快、回滚简单(切回蓝即可);缺点是资源成本翻倍。金丝雀发布则先将新版本发布给一小部分用户或节点(如 5% 流量),观察指标正常后逐步扩大比例,直至全量。优点是风险可控、资源占用低;缺点是需要精细的流量治理与监控能力。

在 SDV 场景中,金丝雀发布常用于 OTA 升级:先向少量车辆推送,验证功能与安全指标后,再分批扩大至全量车队。

五、案例与误区复盘

某车企 OTA 平台最初采用“全量直接发布”,一次版本缺陷导致大量车辆功能异常,回滚耗时数小时。复盘后引入制品库版本锁定、预生产环境验证与金丝雀发布策略,将发布风险显著降低。常见误区包括:把持续交付等同于持续部署、制品库允许覆盖旧版本、环境配置靠手工维护、发布后缺乏可观测指标。避免这些误区,才能让 CD 真正成为稳定交付的基石。

无论采用哪种发布策略,都必须保证:制品可追溯、发布可回滚、指标可观测。缺少任一项,自动化发布都可能放大故障影响。