文件
hyb-oa/.trellis/tasks/archive/2026-08/08-08-production-deployment-validation/implement.md
T

5.2 KiB
原始文件 Blame 文件历史

生产部署验证与迁移门禁:实施计划

1. 规划与激活

  • 用户已批准本最终规划摘要,已执行 task.py start;未连接生产或执行生产 migration。
  • 确认候选 commit、上游包含关系和工作区 clean;记录本次发布候选。
  • 确认执行时的 EXPECTED_PRODUCTION_ORIGIN、EXPECTED_PRODUCTION_DB_NAME、EXPECTED_PENDING_MIGRATIONS 来自受控渠道,值不写入任务文件。

2. 部署 tooling 加固(仅必要时)

  • 新增只读 production target/migration preflight,由 deploy-existing.sh 在 deploy.sh 前调用。
  • preflight 验证生产 origin/DB identity(含运行时 DATABASE_URL host/DB)、candidate migration manifest、_prisma_migrations 集合和可解释的 prisma migrate status 输出;13 项既有部署体检仍由 wrapper 先执行。
  • 明确保证 pre-status 在 migrate deploy、seed、应用切换和业务写入之前;未知 pending、failed、rolled-back、diverged 或目标不明均停止。
  • 增加部署安全静态/fixture 测试,证明 target gate 不接受回环/本地目标,status 空/未知文案、日志失败和未知 pending fail-closed,报告不落原始 datasource,且 preflight 顺序早于 deploy.sh。
  • 更新 deployment spec/runbook 记录生产目标判据与首条 terminated 回滚窗口语义;不记录真实环境值。
  • 在应用部署成功、备份合同 refresh 之前,以空 pending allowlist 复用只读 preflight,生成独立 post-status evidence。
  • 严格 wrapper 调用既有 deploy.sh 时启用 DEPLOY_STATUS_OUTPUT_MODE=quiet,避免历史 status 检查把 datasource 原文回显;详情由受控 pre/post helper evidence 提供。

3. 本地门禁

  • node deploy/trialrun/validate-env-contract.js
  • bash -n 检查新增/修改的部署 shell(含 production-preflight-remote.sh)
  • 聚焦 deployment safety tests
  • python3 ./.trellis/scripts/task.py validate 08-08-production-deployment-validation
  • node scripts/qa/check-process-contract.mjs --baseline --json
  • node scripts/qa/audit-docs.mjs --check-registry(0 errors;保留仓库既有 1 条 unregistered docs warning)
  • node scripts/qa/check-trellis-governance.mjs --json
  • node scripts/qa/check-sensitive-content.mjs
  • git diff --check

4. 生产执行(需明确批准)

  • 先运行 target gate 和 check-existing-deployment.sh;只保存脱敏 PASS/FAIL。(待单独生产批准)
  • 先运行 candidate migration pre-status,确认运行时 DATABASE_URL 身份后在受控现场人工阅读原始输出,并核对脱敏副本、pending allowlist、异常集合和 terminated count;任一不满足即 PAUSED。
  • 只有第 4.2 全部 PASS 后,才调用 DEPLOY_SERVER=<...> DEPLOY_REFRESH_SERVER=<...> bash deploy/trialrun/deploy-existing.sh,保持 SYNC_ENV=0/existing 数据合同。(待单独生产批准)
  • 在受控现场保留 post-status 原始输出并保存脱敏副本,确认全部 migration applied/schema up to date;不能只看退出码。
  • 验证 /ready、build SHA、公开 bundle、基础 smoke、external/runtime smoke 和权限负向路径;这些全部排在任何真实终止写入之前。
  • 本任务不执行真实 terminated 写入、合同编辑/归档/恢复或任何付款/审批/企微写入。

5. 回滚与收口

  • 记录 rollbackWindow=OPEN|CLOSED 及判据;第一条已提交 terminated 产生即关闭窗口。
  • 应用/迁移失败按 design 分流,禁止 reset、resolve、drop;窗口 CLOSED 时只 roll-forward。
  • 记录发布 commit、pre/post status、target gate、/ready、smoke、权限负向、PAUSED/SKIP 和业务写入计数。
  • 只有部署、公网和获批真机检查全部通过时,才允许在最终答复中告知用户可以测试;否则明确 PAUSED。
  • 归档任务并记录会话日志;生产部署不与本任务之外的功能开发混做。

Rollback Points

  • target/preflight/status 失败:尚未同步/写库,修正输入后重新预检。
  • migrate deploy/init 中途失败:保留现场,禁止就地 reset/resolve/drop,等待确认。
  • /ready 或 smoke 失败:窗口 OPEN 时按既有发布合同回退兼容应用;窗口 CLOSED 时 roll-forward。
  • backup refresh 失败:标记已部署但合同刷新失败,不重复发布应用。

Evidence Notes

  • 规划阶段未执行生产 SSH、migration、部署、真实业务写入或 live smoke。
  • 本地验证:node --check deploy/trialrun/production-preflight.mjs、相关部署 shell bash -n、node deploy/trialrun/validate-env-contract.js 均 PASS。
  • 聚焦 Vitest:server/tests/unit/scripts/deployment-safety-contract.test.js 13 tests passed;包含受控 SSH 脱敏证据 fixture 和 synthetic Docker remote gate happy path。
  • 任务/process/docs/governance/sensitive/diff 门禁均已执行并通过;audit-docs 仅报告仓库既有 unregistered docs warning,不属于本任务新增。
  • 生产执行段全部保持未勾选:没有生产 SSH、migrate deploy、真实 terminated 写入、业务数据写入、公网 smoke 或真机验证;因此不得据此告知用户“可以测试”。