AOVIS 生产发布 SOP
这份文档是 aovis.app 的正式发布基线。
它的作用是防止同一类发布事故反复出现:
- 本地代码、Git、VM 代码和线上 HTML 不一致
- 用 tar / scp 绕过 Git 作为发布源
- AI 工具把无关改动一起带上去
- 本地 build 成功,但线上还是旧页面
- SEO、metadata、schema、canonical、内容改动没有做真值验证
1. 唯一真源
生产发布唯一合法的来源,是一个已经推到远端仓库的 Git commit。
规则:
- 不要从未提交的本地改动直接发版
- 不要把本地目录当成发布源
- 不要把
scp、tar 或手工同步当成主发布路径 - 如果必须在 VM 上热修,稳定后必须立刻回写到 Git
发布身份必须明确记录:
- 仓库
- 分支
- commit hash
每次发布都要明确写出:
- 分支名
- 完整 commit hash
- 目标 VM 路径
- build 结果
- PM2 重启结果
- 线上验证结果
2. 发布前检查
发布前必须完成:
- 工作区干净
- 目标 commit 已推送到远端
npm run build通过- 执行 scope check
- 显式检查高风险路径
- 把 release commit hash 写进发布记录
可用命令:
npm run deploy:preflight
npm run deploy:scope-check
3. 标准发布流程
默认入口:
pnpm release:prod
它不是黑盒,而是会按顺序做:
- preflight
- scope-check
- 输出 VM 手工部署步骤
- 必要时执行 live verification
标准路径:
- 完成本地改动
- 跑
npm run deploy:preflight - 跑
npm run deploy:scope-check - commit + push 到
origin/main - 用
gcloud compute ssh进入 VM - 在 VM 上拉取指定 commit
- 安装依赖、生成、构建
- 重启 PM2
- 对
https://aovis.app做真值验证
4. 禁止行为
禁止的行为包括:
- 用未提交的本地改动发版
- 把 tar/scp 当主发布路径
- 不看 scope 就
git add . - 工作区脏了还继续发版
- 在窄任务里偷偷带上 admin / DB / auth / SEO 改动
- 以为
npm run build通过就等于线上已经更新 - 覆盖
/opt/aovis/aovis-store-staging/.env.production
5. Scope 控制
每次发布都必须回答:
- 这次在发什么
- 哪些路径预计会变
- 是否触碰高风险路径
高风险路径包括:
app/robots.tsapp/sitemap.tsprisma/auth.tslib/auth-config.tslib/apple-client-secret.tsapp/admin/- 支付 / checkout / webhook 路由
- 部署 / infra / PM2 / docs-vm 文件
6. 发布后真值验证
build 通过还不够。
发布后必须用真实线上 HTML 验证:
/返回 200/robots.txt返回 200/sitemap.xml返回 200- 关键公开页返回 200
- canonical 指向
https://aovis.app - title 和 description 存在
- 预期内容存在
- 旧内容片段已经消失
- FAQ schema 仍存在
- Product JSON-LD 仍然不出现在 product page
- 首页仍保留 Organization / WebSite schema
可直接用:
npm run deploy:verify
7. 回滚原则
如果出现以下情况,优先回滚:
- 线上真的坏了
- 这次发布变更范围比预期更大
- 核心页面验证失败
- PM2 还在,但线上 HTML 不是预期版本