CI/CD 是什么?先聊聊我的理解

经常有人问我:“CI/CD 不就是跑个自动化脚本吗?” 说实话,我第一次接触时也这么想。

直到我参与了一个传统瀑布式开发的项目。那时候,开发团队写了三个月代码,最后花了两周手工合并——结果呢?编译不过、测试全挂、部署更是噩梦。那次经历让我彻底明白,没有 CI/CD,所谓的“敏捷”只是口号。

CI/CD 全称是 持续集成(Continuous Integration)、持续交付(Continuous Delivery) 和 持续部署(Continuous Deployment)。它们不是三个独立工具,而是一套自动化的软件交付理念。核心目标只有一个:让每一次代码变更都能快速、安全地到达用户手中。

持续集成:每天合并几十次,你敢吗?

持续集成要求开发者频繁地将代码合并到主干,至少每天一次。合并后自动触发编译和自动化测试,即时反馈结果。

我个人习惯是每次提交前先本地跑一遍单元测试和 lint,确保“绿了”再 push。但即使这样,集成时照样可能出问题。为什么?因为别人的代码改了公共接口。这也是为什么 CI 服务器要自动跑测试,而不是靠人的自觉。

💡 我的个人经验:团队刚推行 CI 时,大家嫌麻烦,经常几天才合并一次。结果集成窗口变成“灾难日”。后来我建议改成“每提交一次就触发 CI”,虽然跑的次数多了,但每次改动很小,发现问题立刻回滚。两周后,集成失败率从 40% 降到了 5%。

持续交付 & 持续部署:一键发布不是梦

持续交付是在 CI 的基础上,保证代码 随时可以部署到生产环境。区别在于,部署操作需要人工点击确认。

持续部署则更激进——所有通过自动化测试的变更会自动发布到生产。我曾在电商项目中用过持续部署,双十一前的紧急修复,从提交到上线平均只需要 12 分钟。你想想看,手工操作根本做不到这个速度。

维度 传统开发 CI/CD
集成频率 每周/每月 每天多次
反馈周期 数天甚至数周 分钟级
部署风险 高(大版本一次性发布) 低(小步快跑,易回滚)
自动化程度 手工为主 全流程自动化
团队协作 各自为战 共享责任、快速对齐

CI/CD 的核心价值——用数据说话

别光听我吹。我记得某次技术分享会上,一个团队展示了他们的 CI/CD 收益:

  • 发布周期从 2 周缩短到 2 小时——但不是所有项目都需要这么激进,关键是缩短等待时间。
  • 缺陷逃逸率降低 70%——因为每一次提交都跑全量自动化测试,很多低级 bug 在集成阶段就拦住了。
  • 新功能上线风险可控——灰度发布 + 自动回滚,即使用户反馈不好,也能立刻切回去。

重要发现:CI/CD 最大的价值不是“自动化”,而是降低“人类决策的摩擦”。当你不用纠结“要不要合并”、“会不会冲突”、“部署后会不会挂”时,开发人员才能真正聚焦在业务逻辑上。

CI/CD 流程长什么样?

下面这张图是我平时画给团队看的。它展示了从代码提交到生产部署的典型流水线。注意,每经过一个环节,制品都会变得更“可靠”。

CI/CD 典型流水线 代码提交 自动构建 & 单元测试 静态分析 / Lint 集成测试 / Mock 回放 安全扫描 制品打包 & 版本标记 部署 & 监控 & 回滚 关键原则 1. 快速反馈(≤10分钟) 2. 每次提交都触发全流程 失败即阻塞,不允许跳过 (我见过跳过测试的后果……) ⚠️ 自动回滚 检测到错误立刻切回上一个版本

一次真实的“溜号”教训

我曾经在一个早期项目中过于自信,认为“小改动不用跑 CI”,直接合并到 master 之后才发现破坏了另一个模块的 API 兼容性。修复花了半天,连带影响三个子团队。打那以后,我定了一条铁规:任何改动,哪怕只改了一行注释,也必须经过 CI 验证。你可能会觉得夸张,但你想想看,注释里的字符串变了,也可能导致文档生成工具报错。

⚠️ 避坑指南:CI/CD 不是银弹。如果项目没有自动化测试,CI 流水线就只是个“编译机器”。我曾经见到有人把 CI 配成了“只编译不测试”,美其名曰“快速通过”——这完全是自欺欺人。记住:没有测试的 CI 等于没有锁的自行车。

总结一下

CI/CD 不仅仅是一堆 yaml 文件和 Jenkins 任务。它背后代表的是一种“信任模型”:你信任自动化流程能尽早发现问题,因此你可以更放心地提交代码。反过来,自动化也约束了你——不能偷懒、不能跳过、不能“先试试看”。

这本教程会从 Mock 回放的角度切入,带你亲手搭建一条具备“回放测试”能力的 CI 流水线。但不管你用哪种工具,理解今天说的这些核心价值,才是后续所有实践的前提。