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

62 行
5.2 KiB
Markdown
原始文件 Blame 文件历史

此文件含有模棱两可的 Unicode 字符
此文件含有可能会与其他字符混淆的 Unicode 字符。 如果您是想特意这样的,可以安全地忽略该警告。 使用 Escape 按钮显示他们。
# 生产部署验证与迁移门禁:实施计划
## 1. 规划与激活
- [x] 用户已批准本最终规划摘要,已执行 `task.py start`;未连接生产或执行生产 migration。
- [ ] 确认候选 commit、上游包含关系和工作区 clean;记录本次发布候选。
- [ ] 确认执行时的 `EXPECTED_PRODUCTION_ORIGIN`、`EXPECTED_PRODUCTION_DB_NAME`、`EXPECTED_PENDING_MIGRATIONS` 来自受控渠道,值不写入任务文件。
## 2. 部署 tooling 加固(仅必要时)
- [x] 新增只读 production target/migration preflight,由 `deploy-existing.sh` 在 `deploy.sh` 前调用。
- [x] preflight 验证生产 origin/DB identity(含运行时 `DATABASE_URL` host/DB)、candidate migration manifest、`_prisma_migrations` 集合和可解释的 `prisma migrate status` 输出;13 项既有部署体检仍由 wrapper 先执行。
- [x] 明确保证 pre-status 在 `migrate deploy`、seed、应用切换和业务写入之前;未知 pending、failed、rolled-back、diverged 或目标不明均停止。
- [x] 增加部署安全静态/fixture 测试,证明 target gate 不接受回环/本地目标,status 空/未知文案、日志失败和未知 pending fail-closed,报告不落原始 datasource,且 preflight 顺序早于 `deploy.sh`。
- [x] 更新 deployment spec/runbook 记录生产目标判据与首条 `terminated` 回滚窗口语义;不记录真实环境值。
- [x] 在应用部署成功、备份合同 refresh 之前,以空 pending allowlist 复用只读 preflight,生成独立 post-status evidence。
- [x] 严格 wrapper 调用既有 `deploy.sh` 时启用 `DEPLOY_STATUS_OUTPUT_MODE=quiet`,避免历史 status 检查把 datasource 原文回显;详情由受控 pre/post helper evidence 提供。
## 3. 本地门禁
- [x] `node deploy/trialrun/validate-env-contract.js`
- [x] `bash -n` 检查新增/修改的部署 shell(含 `production-preflight-remote.sh`)
- [x] 聚焦 deployment safety tests
- [x] `python3 ./.trellis/scripts/task.py validate 08-08-production-deployment-validation`
- [x] `node scripts/qa/check-process-contract.mjs --baseline --json`
- [x] `node scripts/qa/audit-docs.mjs --check-registry`(0 errors;保留仓库既有 1 条 unregistered docs warning)
- [x] `node scripts/qa/check-trellis-governance.mjs --json`
- [x] `node scripts/qa/check-sensitive-content.mjs`
- [x] `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 或真机验证;因此不得据此告知用户“可以测试”。