编写迁移检查清单与回滚脚本
目标
亲手制作割接(上线)作业所需的计划书、检查清单,以及备份/发布/冒烟测试/回滚脚本, 并实际运行它们,最终写出结果报告。
为什么重要
割接是 SI 项目中风险最集中的阶段。在凌晨、在疲惫的状态下, 多个团队要按既定顺序行动,而能留给回退的时间很短。 此时支撑判断的,是事先用数字定好的回滚标准, 以及即使双手发抖也能得出同样答案的自动化验证脚本。靠人点击画面的冒烟 测试,人越疲惫就越不准确。所以割接准备的本质 不是“编写文档”,而是“把判断自动化”。
步骤
- 创建
/root/deploy目录并编写/root/deploy/plan.md。 必须包含## 이행 일시、## 대상、## 롤백 기준、## 담당자这四个 h2 标题(韩文,依次意为“割接时间”“对象”“回滚标准”“负责人”), 正文中要出现롤백 판단 시한(韩文,意为“回滚判断时限”)这一表述和具体时刻。 - 创建
/root/deploy/checklist.csv。首行为seq,phase,task,owner,expected,rollback。 数据至少 8 行,phase的值中必须同时出现사전、이행、검증(韩文,依次意为“事前”“割接”“验证”)。seq是从 1 开始、每次加 1 的整数,expected(预期结果)不能为空。 - 将
/opt/lab/fixtures/si-process/app/config.properties复制为/root/deploy/app/config.properties。 然后创建/root/deploy/backup.sh。运行时会按/root/deploy/backup/config.properties.YYYYMMDDHHMM的格式留下备份。 编写完成后,请实际运行一次。 - 创建
/root/deploy/release.sh。运行时会把/root/deploy/app/config.properties中app.version的值改为2.0.0, 并向/root/deploy/deploy.log追加一行包含RELEASE 2.0.0字符串的内容。 编写完成后,请实际运行一次。 - 创建
/root/deploy/smoke.sh。接收一个参数(配置文件路径), 如果app.version的值不为空,且app.db.url的值以jdbc:开头, 则以退出码 0 结束,否则以非 0 的值结束。 - 创建
/root/deploy/rollback.sh。接收两个参数(백업파일 대상파일,占位符依次为备份文件与目标文件), 把备份文件还原到目标文件。如果备份文件不存在,则不要动目标文件, 并以非 0 的退出码结束。 - 创建
/root/deploy/rollback-criteria.csv。首行为metric,threshold,window,action。数据至少 3 行,action为롤백、관찰、유지(韩文,依次意为“回滚”“观察”“维持”)之一,且至少有一行为롤백。threshold中必须是数字,window(观测区间)不能为空。 - 编写
/root/deploy/result.md。必须包含## 수행 결과、## 이슈、## 백업 위치、## 확인 사항这四个 h2 标题(韩文,依次意为“执行结果”“问题”“备份位置”“确认事项”), 正文中要写入第 3 步生成的实际备份文件名和已部署的版本2.0.0。
参考
- 可以用
date +%Y%m%d%H%M生成 12 位时间戳。 - 读取配置值:
grep '^app.version=' 파일 | cut -d= -f2(占位符为文件名) - 常见错误 1:回滚脚本没有检查备份文件是否存在就执行
cp。 - 常见错误 2:写好脚本却没有运行,导致没有产出物(备份文件、deploy.log)。
- 常见错误 3:把
checklist.csv的expected列留空。没有预期结果,就不是检查清单。
编写割接计划书
创建 /root/deploy 目录并编写 /root/deploy/plan.md。
必须包含 ## 이행 일시、## 대상、## 롤백 기준、## 담당자 这四个 h2 标题(韩文,依次意为“割接时间”“对象”“回滚标准”“负责人”),
正文中要出现 롤백 판단 시한(韩文,意为“回滚判断时限”)这一表述和具体时刻。
割接计划书的最低要求是“何时/做什么/谁来做/何时回退”。回滚标准要用数字而不是感觉来写,凌晨时判断才不会动摇。
分阶段检查清单
创建 /root/deploy/checklist.csv。首行为
seq,phase,task,owner,expected,rollback。
数据至少 8 行,phase 的值中必须同时出现 사전、이행、검증(韩文,依次意为“事前”“割接”“验证”)。
seq 是从 1 开始、每次加 1 的整数,expected(预期结果)不能为空。
每个条目如果没有“预期结果”,就无法判定是否成功。事前/割接/验证三个阶段都必须有,序号要与实际执行顺序一致。
编写并运行配置备份脚本
将 /opt/lab/fixtures/si-process/app/config.properties 复制为
/root/deploy/app/config.properties。
然后创建 /root/deploy/backup.sh。运行时会按
/root/deploy/backup/config.properties.YYYYMMDDHHMM 的格式留下备份。
编写完成后,请实际运行一次。
在备份文件名中加入时间戳,运行多次也不会相互覆盖。请使用 date 命令的格式说明符。备份之后,也要养成确认其内容与原件一致的习惯。
编写并运行发布脚本
创建 /root/deploy/release.sh。运行时会把
/root/deploy/app/config.properties 中 app.version 的值改为 2.0.0,
并向 /root/deploy/deploy.log 追加一行包含 RELEASE 2.0.0 字符串的内容。
编写完成后,请实际运行一次。
修改配置值时如果使用 sed -i,一旦失败原件就会丢失。这就是要在前一步先做备份的原因。部署记录请用 append(追加)的方式留下。
冒烟测试脚本
创建 /root/deploy/smoke.sh。接收一个参数(配置文件路径),
如果 app.version 的值不为空,且 app.db.url 的值以 jdbc: 开头,
则以退出码 0 结束,否则以非 0 的值结束。
冒烟测试要以参数接收检查对象,才能复用。正常时退出码为 0,异常时为非 0,才能用于自动化。
回滚脚本
创建 /root/deploy/rollback.sh。接收两个参数(백업파일 대상파일,占位符依次为备份文件与目标文件),
把备份文件还原到目标文件。如果备份文件不存在,则不要动目标文件,
并以非 0 的退出码结束。
回滚脚本接收参数后再动作才安全。目标备份文件不存在时,什么都不要做,立即失败——凌晨用空文件覆盖原件的事故是真实发生过的。
回滚判断标准表
创建 /root/deploy/rollback-criteria.csv。首行为
metric,threshold,window,action。数据至少 3 行,
action 为 롤백、관찰、유지(韩文,依次意为“回滚”“观察”“维持”)之一,且至少有一行为 롤백。
threshold 中必须是数字,window(观测区间)不能为空。
指标、阈值、观测区间、措施这四项是一套。不能写“错误多的话”,而要写成“错误率超过 5% 并持续 10 分钟”。
割接结果报告
编写 /root/deploy/result.md。必须包含 ## 수행 결과、## 이슈、
## 백업 위치、## 확인 사항 这四个 h2 标题(韩文,依次意为“执行结果”“问题”“备份位置”“确认事项”),
正文中要写入第 3 步生成的实际备份文件名和已部署的版本 2.0.0。
结果报告的价值会在稳定期体现出来。请原样记下备份文件名和已部署的版本。这是日后能回答“上线时改了什么”的唯一文档。