4. CI/CD 概述:持续集成、持续交付、持续部署的基本概念与工具链

很多刚接触兼容测试的同学问我:“为什么非要把测试塞到 CI/CD 里?手工测测不也挺好?”

我的回答通常是:你想想看,等回归测试跑完一轮,黄花菜都凉了。CI/CD 说白了就是一套自动化流水线,让代码从提交到上线变得又快又稳。而兼容测试恰恰是这条线上最容易被卡脖子的一环。

这一节,我们先把这个概念基础打牢。

4.1 三个核心概念:CI、CD、CD

这三个缩写经常放在一起说,但背后的含义和阶段完全不同。我习惯把它们看作一条流水线上的三个工位:

缩写 中文 核心动作 交付物
CI 持续集成 频繁合并代码 & 自动构建 & 自动测试 可验证的构建产物
CD 持续交付 自动部署到类生产环境 & 人工确认上线 随时可发布的制品
CD 持续部署 自动部署到生产环境 已上线的最新版本
我的经验: 很多团队把后两个 CD 混为一谈。持续交付是“按个钮就上线”,持续部署是“连按钮都省了”。我个人建议,如果你刚开始搞流水线,先做到持续交付就行——留个手动闸门,心里踏实。

4.2 持续集成(CI)—— 堵住“集成地狱”

我在项目中遇到过最典型的场景:5 个开发各改各的模块,到周五合并时发现冲突遍地、测试全红。这就是典型的“集成地狱”。

持续集成的做法正好相反:每人每天至少往主干合并一次代码。合并后立即触发构建和测试。这样一来,每次冲突都是小冲突,几分钟就能搞定。

CI 的关键实践我整理成了一份清单:

  • 主干开发:所有工作基于主干,分支存活时间不超过一个工作日
  • 自动构建:代码提交后自动编译,失败立刻通知全员
  • 自动单元测试:跑完构建立刻跑单测,覆盖率不低于 80%
  • 快速反馈:整个流程控制在 10 分钟以内——超过这个时间,开发者就会去看微信而不是看流水线

嗯,这里要注意:CI 的“快”比“全”更重要。优先跑关键路径的测试,而不是把全量回归放进去。我曾经见过一个团队在 CI 阶段跑完整的 UI 自动化,一次提交要等 40 分钟——后来没人愿意频繁提交了。

4.3 持续交付(CD)—— 让“发布”变成日常

持续交付在 CI 的基础上往前走了一步。CI 保证了代码能集成,持续交付保证了代码能随时发布。

具体来说,持续交付流水线会自动把构建产物部署到一个类生产环境(比如预发布环境),然后运行集成测试、性能测试、甚至兼容性测试。全部通过后,流水线准备好一个可发布的制品包,等待业务方或运维按一下“上线”按钮。

你可能会问:这和部署到底有什么区别?

区别其实就一个字:“权”。持续交付把“能不能上线”的决策权交给了人,把“上线的准备工作”交给了机器。这样既保证了效率,又保留了风控。

我在做兼容测试时特别喜欢持续交付的节奏。因为预发布环境和生产环境高度一致,很多兼容问题在预发布阶段就能暴露出来。有一次就是因为持续交付流水线跑了一轮 web 兼容性扫描,发现了某个特定浏览器下 CSS 渲染异常——要是直接进生产,估计要等用户投诉才知道。

4.4 持续部署(CD)—— 全自动上线

持续部署是 CI/CD 的终极形态,完全自动化上线,没有人工介入。听起来很爽,但门槛也最高。

要做到这一步,你至少需要:

  • 极高的自动化测试覆盖率
  • 完善的灰度发布和回滚机制
  • 强大的监控和告警系统
  • 团队对“自动化”有足够信任

不过说实话,我很少见到普通业务团队真正做到全量持续部署。更多的做法是“灰度持续部署”:先让新版在 1% 的流量上跑,确认没问题再逐步放量。这也算一种持续部署的变种。

对了,如果你要把兼容测试放进持续部署流水线,千万注意测试环境的流量隔离。我曾经因为测试环境和生产环境共用了一批浏览器实例,结果兼容测试把生产会话全部挤掉了……那次教训相当深刻。

4.5 CI/CD 工具链全景

工具本身不是重点,怎么组合才是。我习惯把工具链分成五个层次:

层次 代表工具 负责什么
代码托管 & 触发 GitHub / GitLab / Bitbucket 监听 Push / MR 事件,触发流水线
驱动引擎 Jenkins / GitLab CI / GitHub Actions / CircleCI 编排流水线阶段、分发任务
编译与构建 Maven / Gradle / Webpack / Docker Build 生成编译产物或容器镜像
测试执行 Selenium / Appium / Playwright / Robot Framework 运行各层次自动化测试
部署与发布 Ansible / Kubernetes / Spinnaker / ArgoCD 部署到目标环境、管理发布策略
避坑提醒: 工具不在多,在于能串起来。以前我见一个团队,用了 Jenkins 做 CI,用 GitLab CI 做 CD,再用 ArgoCD 做 K8s 部署——三套工具互相不认。最后出了问题,谁都不知道该看哪个日志。建议一套工具能搞定就尽量别拆分。

4.6 一张图看懂 CI/CD 流程

下面这张图是我当年画给团队做培训用的。箭头方向就是代码从提交到上线的完整路径。你仔细看,每一个回流箭头都代表“发现问题—修复—重新进入流水线”。

CI/CD 流水线全貌 代码提交 Git Push / MR 自动构建 编译 + 单元测试 集成测试 API + 兼容测试 预发布部署 类生产环境 生产部署 灰度 / 全量 人工决策 审批/一键发布 💡 持续交付路径:走人工决策 💡 持续部署路径:跳过人工,直接上线 CI 阶段 CD 测试阶段 预发布 生产部署
从图中你能看出什么?
① CI 阶段只在左边三个节点(提交→构建→集成测试)。
② 从预发布开始就进入了 CD 范围。
③ 红色虚线是失败回流——测试不过,代码打回重来。
④ 持续部署就是砍掉“人工决策”那个分支,直接从预发布走向生产。

4.7 选择工具链时我最看重的三点

工具多如牛毛,选起来容易眼花。我给自己定了三条原则,分享给你:

  1. 和现有技术栈匹配:Java 团队别硬上 Go 生态的 Drone,前端团队可以优先考虑 GitHub Actions。
  2. 插件/扩展生态够用:尤其是测试相关的插件。Jenkins 虽然老,但它的兼容测试插件比很多新工具都全。
  3. 团队能接手:工具再好,没人会用也是白搭。选一个团队现有能力范围内能玩转的。

我记得有一次帮一家创业公司搭流水线,他们硬选了 Spinnaker 做 CD 引擎——结果团队没有 K8s 基础,折腾一个月都没上线。后来换成 GitLab CI + 简单脚本,两周就跑通了。工具是拿来解决问题的,不是拿来炫技的。