CI/CD 基础:流水线阶段与灰度发布流程

微服务的价值要落到“快速、安全地发布”。CI/CD(持续集成/持续交付)把从代码提交到上线的过程自动化,让发布从“每周手动操作”变成“每次提交都可验证、可发布”。本章讲流水线怎么搭,以及灰度发布如何在流水线里闭环。

CI 与 CD 的区别

  • CI(持续集成):代码合并后自动构建、测试,尽早发现集成问题。原则是“小步提交、频繁集成、快速反馈”。
  • CD(持续交付/部署):把通过验证的制品自动部署到环境。持续交付到预发为止、生产人工确认;持续部署连生产也自动发布(多数团队折中为“自动到预发、一键上生产”)。

流水线的典型阶段

一条服务流水线通常包含以下阶段(可按团队情况裁剪):

# 以 GitLab CI 语法为例的流水线骨架(其他 CI 平台概念相同)
stages:
  - build      # 编译:mvn -B clean package
  - test       # 单元/集成测试:mvn verify,生成覆盖率报告
  - image      # 构建镜像并推送制品仓库
  - deploy-dev # 部署到开发环境,跑冒烟测试
  - deploy-test  # 部署到测试环境,验收测试
  - deploy-gray  # 灰度发布:生产小流量
  - deploy-prod  # 全量发布生产

每个阶段要点:

  1. 静态检查与单元测试:Checkstyle/SpotBugs、JUnit + 覆盖率门禁,失败即阻断。
  2. 制品管理:每次构建产出唯一版本(如 1.0.0-${commit}),镜像与 jar 都打版本标签,可追溯。
  3. 环境部署:配置外置(Nacos/K8s ConfigMap),同一镜像在不同环境只换配置。
  4. 自动化验证:部署后跑冒烟/契约测试,而非“能启动就算成功”。
  5. 质量门禁:测试覆盖率、安全扫描(依赖漏洞)、镜像扫描不达标不放行。

灰度发布流程

生产发布高风险,普遍做法是灰度三段式:先小流量验证 → 逐步放量 → 全量收尾。

全量灰度发布流程:
1. 流水线构建新版本镜像,部署 1~2 个金丝雀实例(带 version=canary 标识)
2. 网关/负载均衡把 5%~10% 流量切到新版本(见灰度发布章节)
3. 观察核心指标:错误率、RT、业务成功率,与基线版本对比
4. 指标正常 → 权重加到 50% 再观察;异常 → 一键切回旧版本
5. 全量后保留旧实例短时间,确认稳定再下线旧版本

灰度成功的关键不在“切流量”,而在“可观测 + 可回滚”:

  • 流量按版本打标,日志/指标能按版本聚合对比(见日志聚合章节);
  • 发布与回滚都是配置变更(改权重/改镜像 tag),操作路径要提前演练;
  • 设置发布窗口与告警:异常指标触发自动暂停放量甚至自动回滚。

多服务发布顺序

微服务发布顺序也有讲究:改动不兼容(接口字段变更)时,先发服务提供方并保证兼容旧调用方,再发消费方;依赖升级(注册中心/配置变更)先发基础设施。必要时用“接口兼容期 + 双版本并存”平滑过渡,避免上下游同时发布的“原子发布”幻觉。

最小可用起步

不要一上来追求全自动生产发布。建议起步顺序:

  1. 先自动化“构建 + 单元测试 + 镜像”,保证每次提交的制品可靠;
  2. 再加“自动部署测试环境 + 冒烟”;
  3. 最后加“生产灰度”与质量门禁。

每一步都先手工能跑、再自动化,CI/CD 平台本身(Jenkins/GitLab CI/GitHub Actions 等)只是载体,阶段划分与质量门禁才是灵魂。

小结

CI/CD 的本质是“把发布流程沉淀为可重复、可验证、可回滚的流水线”。标准阶段是 构建→测试→镜像→各环境部署→灰度→全量;灰度发布要闭环“小流量验证、指标对比、一键回滚”,这才是微服务发布安全感的来源。

笔记加载中…