验证、发布与维护记录

在未来更新完成后验证业务、安排发布、处理失败,并区分公开更新说明与内部维护记录。

本篇用于已经完成目标评估与必要合并之后。暂时没有更新需求时,保留现有项目即可,不需要执行发布、打标签或数据库操作。

一、先明确验收范围

验证应围绕本次变化及其实际影响展开,不能只看首页,也不必在无关文案修改后机械测试所有第三方功能。

本次变化需要验证的代表场景
登录、会话或邮箱验证新旧账号、正常与失效会话、错误验证码、必要的二次验证
权限和产品规则普通账号与已购买账号、历史授权、过期或撤销后的行为
支付和 Webhook测试购买、重复投递、延迟或乱序事件、旧套餐关联
数据结构旧数据读取、写入、约束、空库初始化和已有库升级
Queue 或 Reaction正常执行、可重试失败、重复消息、升级前保存的执行记录
内容与语言导航、正文、搜索、已启用语言及缺失文案
资源与域名绑定目标、Cookie、回调、Cron 与运行日志

开发模式下邮件是终端预览,不能把预览成功当作真实投递验证。使用 Stripe 测试模式时也要确认连接、Price 和 Webhook 属于同一测试环境。

二、完成本地检查

代码变更完成后运行:

npm run verify

模板会依次执行 ESLint、TypeScript 类型检查、应用与脚本等测试,以及生产构建。检查过程中生成的内容或类型错误也需要处理,不能只留下最后一次构建成功的截图。

如需本地检查打包后的页面,可以使用:

npm run preview

本地预览不能证明生产资源、邮件服务或第三方回调可用。需要线上集成验证时,先准备隔离资源与明确的测试配置,当前模板并没有自动提供一套完整的 staging 环境。

三、发布前核对实际运行目标

记录准备发布的提交、站点地址、Worker、资源 ID、迁移文件及配置变化。确认恢复所需的原始主密钥和其他凭据仍保存在安全位置,记录里只写保存位置或更新状态。

涉及生产数据变化时,确认备份或恢复点可用,并评估发布期间是否需要限制相关写操作。只创建 Git 标签不能保护数据库和外部服务状态。

正常更新使用:

npm run deploy:update

该命令发布的是当前工作目录,不会下载或合并模板。执行顺序包括生产检查、生成类型、完整验证、远程迁移、发布 Worker、同步 KV 和页面健康检查。

由于它已包含 verify,发布前不需要为了凑流程立刻再重复一遍相同检查。但早先验证之后若又修改了代码,不能把旧验证结果当作当前版本的证明。

发布步骤详见首次部署与后续更新。

四、失败后先确认发生了什么

停止位置当前状态可能是什么恢复方向
配置检查或 verify尚未执行本次更新的远程迁移与发布修复失败项,再继续更新
数据库迁移部分前序迁移或另一个库已完成核对迁移记录与结构,确定修复 SQL
Worker 发布迁移可能已完成,旧代码可能仍在线保证旧代码与当前结构兼容,修复发布
KV 同步新 Worker 已上线,但内容尚未完整同步使用正确版本恢复同步
健康检查前面的步骤可能全部已完成检查实际页面和日志,定位业务或入口问题

不要看到命令失败就删除资源、清空数据库或重复首次部署。更详细的排查见部署、资源与域名。

代码回退不等于系统恢复

如果仅修改了应用代码,且没有改变数据格式、配置语义和外部状态,可以评估重新发布已验证的旧代码。如果迁移已经删除旧字段,或者新版本已经写入旧版本无法识别的数据,就不能直接套用这条办法。

数据库恢复可能撤销恢复点之后的合法数据。Stripe 已付款、邮件已发送、Queue 已处理的效果也不会随 Git 回退一起消失,需要单独对账。

项目没有自动回滚整个系统的命令。恢复方案应根据这次变更制定,写清恢复对象、依据、执行顺序与恢复后需要补处理的业务。

五、上线后验证真正受影响的功能

页面健康检查通过后,用发布前准备的代表案例验证。核对旧账号和历史数据,不要只创建一个新账号得到正常结果。

涉及后台工作时,继续检查 Event、Command 和消费者结果。涉及支付时,核对交易与权益是否一致。首次观察到正常结果后,还应结合真实业务周期留意延迟回调或定时任务,不把短时间没有报错理解为所有路径已经验证。

确认稳定后,清理本次确实不再需要的临时逻辑、测试配置和旧引用。没有用到的资源不要仅凭名称相似就删除,先确认没有读写者和恢复用途。

六、保留一份内部维护记录

内部记录解释如何实施和恢复,公开更新页解释用户得到了什么,两者用途不同。

下面是以后有实际更新时可以复制的记录模板,其中占位内容需要据实填写,不是本次已经发生的升级:

# 更新记录:<本次变更名称>

- 状态:评估中 / 待发布 / 已发布 / 已恢复
- 更新原因:
- 应用原提交与版本:
- 模板原来源与目标来源:
- 本次采用的修改:
- 保留或未采用的模板变化及原因:
- 数据库迁移文件与验证结果:
- 配置、变量和资源变化:
- 第三方平台人工操作:
- 自动检查与业务验收结果:
- 实际发布提交、时间和目标 Worker:
- 失败时的恢复条件、对象与步骤:
- 发布后的观察结果:
- 尚未解决的问题:

不要在记录里保存 Secret、Cookie、令牌、完整生产数据或邮件验证码。数据库备份也应单独安全保存,不应随文档提交到仓库。

即使决定暂缓更新,也可以记录目标版本和暂缓原因。下次评估时就不必从头猜测。

七、维护公开的更新说明

当前模板的更新页读取 src/components/server/Changelog/entries.ts 中的静态数组,不会自动把 Git 提交或 package.json 版本转换成公告。

当前条目使用以下字段:

字段用途
commit关联提交的文字标识
date、displayDate日期与展示日期
type、title、description更新分类、标题和说明
icon当前组件支持的图标名称
items由 kind 和 copy 组成的变化列表

条目正文当前直接使用数组中的英文字符串,页面框架文案才通过 pages.changelog 等语言键读取。只修改语言 JSON 不会自动翻译 entries.ts 的标题和条目。如果未来需要多语言更新正文,应按项目既有国际化机制接入对应资源。

初始化后的产品不应把模板历史记录自动当成自己的产品发布历史。有实际发布时,再记录自己已经提供给用户的变化。没有变化时,不需要为了填充页面虚构新版本。

文案应描述具体结果,例如“修复修改邮箱后旧地址仍收到后续通知的问题”,比“优化邮箱模块”更有意义。内部资源 ID、恢复点、敏感数据和具体安全控制细节保留在受控的维护记录中。

八、标签、源码包与部署各自独立

npm run release:tag 会创建并向 origin 推送标签,不是本地只读操作,也不会部署 Worker。release:archive 从指定 Git Tree 生成源码包,不会包含未提交的改动。

模板维护者的 commit script 在发布源码包中被移除,不能假定初始化项目提供相同的一键提交方式。

是否使用这些发布命令,应由自己的版本管理流程决定。现在没有发布需求时,不需要先创建标签或归档,只需保留能够追溯项目状态的记录。