名词解释教学工作区 · 课程 0008 · 形态 对比组 · 约 6 分钟 · 前置:0006 · 巡检器 · 相关:0004 · Node.js / npm / pnpm · 2026-10-01

CI 与 CD:自动化跑到哪一步,最后一下谁按

你能做到:听到「等 CI 绿了再合并」「CD 还没配」,能立刻说出它停在哪一层; 再被问「你们算持续交付还是持续部署」,你能指出这两个词只差一件事 —— 上线前有没有人按一下。

1 | 定义

持续集成(Continuous Integration,CI): 每个人把改动频繁合进同一条主线,每一次合并都由自动化在一台干净机器上跑一遍构建与测试,结果立刻反馈给提交的人。 每做完一道菜先尝一口:咸了淡了当场就知道,不用等整桌菜上齐,才发现有一道没法吃。

持续交付(Continuous Delivery,CD): 在持续集成之上再往前一步:检查通过后自动把这一版打包成随时可发布的状态,真正送上生产那一下由人决定。 菜装好盘、盖好盖,随时都能端上桌;至于端不端、什么时候端,你说了算。

持续部署(Continuous Deployment): 检查通过后不再有人工确认,自动化直接把新版本送上生产环境,用户当场用到它。 做好了直接上桌,中间没有人再问一句「现在上吗」。

三个词共用同一条流水线,只在两个地方分岔:自动化停在哪一步、最后一下谁按。

2 | 它们解决什么麻烦

三个词面对的是同一件事:改动越来越多、越来越碎,而把它们合到一起、送上线上这一步仍然靠人。

3 | 特征矩阵

三行之间真正变的只有两列:自动化跑到哪一步、最后一下谁按;其余几列问的是同一件事被放到了什么位置。

名词什么时候跑谁按最后一下自动化到哪一步出问题谁先知道需要什么前提
持续集成(CI)每次提交、每个合并请求没人按 —— 它不碰生产构建 + 测试 + 各类检查提交的人,几分钟内测试本身可信、跑得够快
持续交付同上,一路跑到「可发布」人:上线前确认一次到「随时可发布」,外加一键发布提交的人 + 发布负责人上面全要,还要能一键回滚
持续部署同上,一直跑到生产没人按到「自动进生产」为止监控与告警,而不是人回滚、监控、开关都得先到位

往上走一层不是换一套工具,而是把上一步的前提再加一层:CI 只要求测试可信;到持续交付得有回滚;到持续部署,回滚、监控、开关、数据迁移缺一条都不行。

4 | 各自怎么做

不管做到哪一层,跑的都是同一条流水线(pipeline),顺序固定:

触发推送到主线、开合并请求、打标签、定时 -> 构建干净机器上装依赖、编译、打包 -> 测试单元测试、集成测试、静态检查 -> 产物带版本号、能整块搬走的那一份东西 -> 发布人按一下,或者直接上生产

三个词的差别只落在最后一段:持续交付在「发布」前面挂一个「必须人工批准」,不挂,它就成了持续部署。平台可选 GitHub Actions、GitLab CI、Jenkins,配置写法不同,流水线这几段是一样的。

5 | 各自的代价

6 | 区分使用场景

先看现在能做到哪一层,再看值不值得往下走:

一句话:自动化到哪一层,由你能不能接住它的出错决定,而不是由工具决定。

7 | 常见误解

8 | 练习

三个场景,每题只落在四个答案之一;选完立刻看到它停在哪一步。

1. 每次推送到主线,云端机器自动重跑构建与测试,结果发回给提交的人;这一趟跑完,没有任何动作碰生产环境。

对。自动化停在「检查」这一步、不碰生产环境,就是持续集成;它换来的是每次合并当场知道坏没坏,而不是发布那天一起爆。也别忘了它还有另一半:大家得真的频繁合进同一条主线。

2. 检查通过后自动打好包、放到待发布的位置,随时都能上;真正上线由发布负责人点一下确认。

对。自动化跑到「随时可发布」、最后那一下留给人,就是持续交付;它比 CI 多出来的前提是能一键回滚 —— 发得出去,也要收得回来。

3. 检查通过几分钟后,线上自己换成了新版本,全程没有人点过按钮;出没出问题由监控告警说话。

对。人工确认那一步也被去掉、自动化一直跑到生产,就是持续部署;它的前提是回滚、监控、特性开关都到位 —— 缺一条,自动上线就变成自动出事。