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

读完后做题闯关

先读正文,再用下面的选择题检查自己是否真的理解。答错会出现解释,可以回到正文补一眼再重选。

0/1
先完成阅读

读完正文后点击“我已读完,进入练习”,题目会变成可答状态。

第 1 题

读完这一篇后,最适合怎么确认自己真的理解了?