Level 39 / 阅读练习
CI/CD、发布和回滚
理解 CI 检查、CD 部署、固定制品、冒烟测试、发布观察和回滚流程。
Progress
阅读中
0/2 步完成 / 阅读后完成练习才算通关
Practice
本关怎么过
- 读完正文后确认完成阅读
- 完成 1 道选择题练习
- 答错时看解释,再回到正文补理解
一句话:CI/CD 就是让代码从提交、检查、构建、部署到回滚都有固定流程,减少“我电脑能跑,线上坏了”的情况。
本篇学完你会什么:知道一次上线应该经过哪些检查,为什么要区分构建和部署,发布失败怎么回滚,以及小团队可以先做哪些自动化。
1. CI/CD 解决什么问题
没有 CI/CD 时,上线常常靠手工:
拉代码
装依赖
改配置
手动 build
手动复制文件
重启服务
发现不对再临时处理这会有几个问题:
| 问题 | 后果 |
|---|---|
| 每个人操作不一样 | 今天能发,明天不一定能发 |
| 忘记跑测试 | 小问题进线上 |
| 配置靠手改 | 测试和生产不一致 |
| 没有回滚流程 | 出问题时越修越乱 |
CI/CD 的核心不是炫技,而是把上线变成一条稳定流水线。
2. 一次发布应该走哪些步骤
一个简单但靠谱的流程:
提交代码
-> 自动安装依赖
-> 代码格式检查
-> 类型检查
-> 单元测试/接口测试
-> 构建镜像或静态文件
-> 部署到测试环境
-> 冒烟测试
-> 部署到生产环境
-> 观察监控
-> 必要时回滚大白话:
CI 负责问:这份代码能不能过检查?
CD 负责问:这份代码怎么安全发出去?3. CI 里应该检查什么
不要一开始就追求复杂。先让 CI 卡住最容易犯的错。
后端项目可以先检查:
ruff / eslint 这类格式和基础规范
类型检查
单元测试
接口测试
数据库迁移是否能执行前端项目可以先检查:
lint
typecheck
build
公开文案扫描
关键页面生成以这个仓库的公开网站为例,类似检查可以是:
pnpm --filter zero-one-website check:public-copy
pnpm --filter zero-one-website typecheck
pnpm --filter zero-one-website build:test命令不重要,重要的是把“发版前必须过什么”写清楚。
4. CD 里应该做什么
CD 不只是“把代码传到服务器”。
它至少要处理:
| 步骤 | 说明 |
|---|---|
| 取制品 | 使用 CI 构建出来的镜像或静态文件 |
| 注入配置 | 使用目标环境的环境变量和密钥 |
| 部署服务 | 更新容器、进程或静态资源 |
| 健康检查 | 确认服务真的能访问 |
| 冒烟测试 | 跑最关键的几个接口或页面 |
| 观察窗口 | 发布后观察错误率、响应时间 |
制品要尽量固定。不要生产环境临时再拉依赖、临时再 build。
更稳的思路:
CI 构建一次 -> 测试环境用这份 -> 生产环境也用这份这样测试过的东西和发出去的东西才是同一个。
5. 回滚为什么必须提前设计
回滚不是上线失败后才想办法。
上线前就要知道:
上一版在哪里?
怎么切回上一版?
数据库能不能回?
配置有没有改?
回滚后要检查什么?常见回滚方式:
| 方式 | 适合 | 注意 |
|---|---|---|
| 回到上一版镜像 | 后端容器服务 | 镜像 tag 要保存 |
| 切回上一版静态文件 | 官网/前端静态站 | CDN 缓存要处理 |
| 关闭功能开关 | 新功能灰度 | 提前设计 feature flag |
| 数据修复脚本 | 数据写坏 | 先备份、先演练、再修 |
不要把“重新发一个修复版本”当成唯一回滚方案。严重故障时,先止血比继续改代码更重要。
6. 数据库迁移怎么配合发布
数据库迁移是发布里最容易翻车的地方。
危险操作:
直接删除字段
直接改字段类型
给大表加没有评估的索引
上线代码还没兼容,先改了表结构更安全的做法是分阶段:
加字段
第 1 次发布:加新字段,代码同时兼容新旧字段
第 2 次发布:代码开始写新字段
第 3 次发布:确认旧字段不用后再清理改字段含义
先新增新字段
写双份数据
迁移历史数据
读新字段
最后删除旧字段回滚时
如果发布包含数据库变更,要提前判断:
| 变更 | 能不能只靠回滚代码解决 |
|---|---|
| 只加字段 | 通常可以 |
| 删除字段 | 很危险 |
| 改字段类型 | 很危险 |
| 新增索引 | 代码通常可回滚,但索引本身还在,必要时单独删除 |
| 数据迁移 | 需要单独回滚或修复方案 |
7. 常见错误
| 错误 | 后果 | 修正 |
|---|---|---|
| CI 只 build 不测试 | 构建能过但功能坏 | 加接口测试和冒烟测试 |
| 生产环境临时 build | 环境不一致 | CI 产出固定制品 |
| 没有版本号 | 不知道线上跑哪版 | 镜像 tag / commit sha |
| 发布后不看监控 | 出问题发现晚 | 设观察窗口 |
| 回滚方案只写“重新发布” | 故障时太慢 | 保留上一版和切换步骤 |
| 迁移脚本不可逆 | 回滚困难 | 危险迁移分阶段做 |
8. 检查清单
[ ] CI 会安装依赖并使用锁文件
[ ] CI 会跑 lint/typecheck/test/build
[ ] 发布制品有版本号
[ ] 测试和生产使用同一份制品
[ ] 部署后有健康检查
[ ] 部署后有冒烟测试
[ ] 回滚步骤写在文档里
[ ] 数据库迁移已评估是否可回滚
[ ] 发布后有人观察监控和日志9. 小结
| 名词 | 大白话 |
|---|---|
| CI | 自动检查代码能不能合格 |
| CD | 自动或半自动把合格代码发出去 |
| 制品 | 构建出来、准备部署的东西 |
| 冒烟测试 | 上线后先试最关键功能 |
| 回滚 | 快速回到上一版可用状态 |
| 灰度 | 先给一小部分用户用 |
上一篇建议:先看《生产环境日志、监控和告警》。
下一篇建议:继续看《后端安全加固实战》,把上线后的安全底线补上。
Checkpoint
读完后做题闯关
先读正文,再用下面的选择题检查自己是否真的理解。答错会出现解释,可以回到正文补一眼再重选。
先完成阅读
读完正文后点击“我已读完,进入练习”,题目会变成可答状态。