跳到主要内容

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. 发布前检查

发布前必须完成:

  1. 工作区干净
  2. 目标 commit 已推送到远端
  3. npm run build 通过
  4. 执行 scope check
  5. 显式检查高风险路径
  6. 把 release commit hash 写进发布记录

可用命令:

npm run deploy:preflight
npm run deploy:scope-check

3. 标准发布流程

默认入口:

pnpm release:prod

它不是黑盒,而是会按顺序做:

  • preflight
  • scope-check
  • 输出 VM 手工部署步骤
  • 必要时执行 live verification

标准路径:

  1. 完成本地改动
  2. npm run deploy:preflight
  3. npm run deploy:scope-check
  4. commit + push 到 origin/main
  5. gcloud compute ssh 进入 VM
  6. 在 VM 上拉取指定 commit
  7. 安装依赖、生成、构建
  8. 重启 PM2
  9. 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.ts
  • app/sitemap.ts
  • prisma/
  • auth.ts
  • lib/auth-config.ts
  • lib/apple-client-secret.ts
  • app/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 不是预期版本