5.2 KiB
5.2 KiB
生产部署验证与迁移门禁:实施计划
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_URLhost/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.jsbash -n检查新增/修改的部署 shell(含production-preflight-remote.sh)- 聚焦 deployment safety tests
python3 ./.trellis/scripts/task.py validate 08-08-production-deployment-validationnode scripts/qa/check-process-contract.mjs --baseline --jsonnode scripts/qa/audit-docs.mjs --check-registry(0 errors;保留仓库既有 1 条 unregistered docs warning)node scripts/qa/check-trellis-governance.mjs --jsonnode scripts/qa/check-sensitive-content.mjsgit diff --check
4. 生产执行(需明确批准)
- 先运行 target gate 和
check-existing-deployment.sh;只保存脱敏 PASS/FAIL。(待单独生产批准) - 先运行 candidate migration pre-status,确认运行时
DATABASE_URL身份后在受控现场人工阅读原始输出,并核对脱敏副本、pending allowlist、异常集合和terminatedcount;任一不满足即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、相关部署 shellbash -n、node deploy/trialrun/validate-env-contract.js均 PASS。 - 聚焦 Vitest:
server/tests/unit/scripts/deployment-safety-contract.test.js13 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 或真机验证;因此不得据此告知用户“可以测试”。