文件
hyb-oa/.trellis/tasks/08-08-production-deployment-execution/implement.md
T
wangsli a87cd4ce4e
ci-e2e / e2e (push) Canceled after 0s
ci-minimal / check-minimal (push) Canceled after 0s
修正(08-08-production-deployment-execution): 校准生产输入证据
2026-08-08 12:08:03 +08:00

74 行
6.3 KiB
Markdown
原始文件 Blame 文件历史

此文件含有模棱两可的 Unicode 字符
此文件含有可能会与其他字符混淆的 Unicode 字符。 如果您是想特意这样的,可以安全地忽略该警告。 使用 Escape 按钮显示他们。
# 生产部署执行与验收:实施清单
## 0. 规划与启动门禁
- [x] 已向用户呈现本 task 的最终规划摘要,并取得对该摘要的最新明确批准。
- [x] 已解决候选发布是否可进入上游的外部授权;未获授权不得使用 unpublished override。
- [x] 任务从 `planning` 切换到 `in_progress` 前,确认本清单、PRD、design 与 Open Questions 已收敛。
## 1. 候选与本地证据
- [x] 提交本 task 的规划 artifacts,确认工作区 clean。
- [x] 记录候选完整 commit、短 SHA、分支和上游包含关系;不把连接串、SSH target 或环境值写入文档。
- [x] 运行 `node deploy/trialrun/check-source-provenance.mjs`,要求 `published=true`、`remoteVerified=true`。
- [x] 运行既有本地合同门禁:
- [x] `node deploy/trialrun/validate-env-contract.js`
- [x] 相关部署 shell `bash -n`
- [x] `node --check deploy/trialrun/production-preflight.mjs`
- [x] 聚焦 `deployment-safety-contract.test.js`(既有提交证据为 13/13,本轮未重复触发生产动作)
## 2. 生产 preflight(全部只读)
- [ ] 从受控渠道取得 `EXPECTED_PRODUCTION_ORIGIN`、`EXPECTED_PRODUCTION_DB_NAME`、`EXPECTED_PENDING_MIGRATIONS`、`DEPLOY_SERVER`、`DEPLOY_REFRESH_SERVER`;仅存在于进程环境或受控 secret store。——**PAUSED:本次执行环境中均未注入;未猜测或回显值。**
- [ ] 先运行 `check-existing-deployment.sh`,记录 13 项真实 PASS/FAIL 数字;任何 FAIL 停止。——**PAUSED:生产输入缺失,未连接生产。**
- [ ] 运行 `deploy-existing.sh` 内置的 source/target/preflight,或按同一 wrapper 的只读阶段执行;人工阅读 target gate 原始输出和 Prisma status marker 原文。
- [ ] 核对 candidate migration manifest、`_prisma_migrations` applied/异常/pending 集合和批准 allowlist;未知 pending、failed、rolled-back、unfinished、diverged 或目标身份不确定均 `PAUSED`。
- [ ] 同一只读窗口查询 `terminated` 行数,记录 `rollbackWindow=OPEN|CLOSED`、实际 count 和读取时间;确认这是部署前快照。
- [ ] 确认 preflight 到 deploy 之间有配置/数据库变更冻结;无法保证则停止。
## 3. 获批发布(唯一写入阶段)
- [ ] 再次确认 preflight 所有门禁仍为 PASS,且没有新的远端配置/候选变化。
- [ ] 仅调用 `deploy/trialrun/deploy-existing.sh`,固定 `SYNC_ENV=0`、`DEPLOY_DATA_MODE=existing`、`DEPLOY_STATUS_OUTPUT_MODE=quiet`。
- [ ] 允许的 schema 写入仅为候选 migration;不得执行 `migrate dev`、`reset`、`db push`、`resolve`、手工 DDL、seed 或业务 API 写入。
- [ ] 若 deploy/migrate/init 中途失败,保留远端现场并停止;不自行重试、回滚或清理。
## 4. 发布后只读验收
- [ ] 保存 post-status 原始输出(仅受控现场)及脱敏副本;确认全部候选 migration applied / schema up to date。
- [ ] 核对 `/ready`、完整 build SHA、公开短 SHA 与候选 commit。
- [ ] 运行基础 smoke、external deps smoke、runtime smoke 和公开 bundle 扫描,记录真实数字和输出摘要。
- [ ] 在任何真实终止写入前完成未登录、无权限、详情不存在/无权等权限负向路径及合同详情只读检查;缺凭据项标 `PAUSED/SKIP`。
- [ ] 检查备份合同 refresh;失败记 `DEPLOYED_BUT_CONTRACT_REFRESH_FAILED`,不重复发布应用。
## 5. 失败分流、review 与收口
- [ ] 将每个失败归入 target/migration、应用健康、refresh、public/live/permission 之一;不得把迁移失败与产品回归混为一类。
- [ ] 记录真实业务写入计数为 0(本 task 不主动写入 `terminated` 或其他业务数据)。
- [ ] 对照部署前窗口快照决定兼容回退或 roll-forward;`CLOSED` 时不得回退到不识别 `terminated` 的旧应用,不 drop 三列。
- [ ] 启动只读 reviewer,确认门禁顺序、原始证据可追溯、脱敏副本无敏感信息、失败后没有继续推进。
- [ ] 运行最终 Trellis/process/docs/governance/sensitive/diff 门禁;通过后提交中文 commit 并引用 `08-08-production-deployment-execution`。
- [ ] 只有生产、公网和必要真机全部获批并通过时才可告知用户可以测试;否则保留 `PAUSED`。
- [ ] 归档 task 并记录会话日志,报告中保留 pre/post status、target gate、窗口判定和所有 `PAUSED/SKIP` 原因。
## Rollback Points
1. 来源或 preflight 失败:尚未写入,停止并修正授权/输入后重新检查。
2. `migrate deploy`/init 失败:保留现场,禁止 reset/resolve/drop,等待明确处置。
3. `/ready`/smoke 失败:窗口 OPEN 可按既有合同回退兼容应用;窗口 CLOSED 只 roll-forward。
4. refresh 失败:应用已部署但合同刷新失败,不重复发布应用,只走合同修复流程。
## Evidence Notes
- 原始 target gate 和 Prisma status stdout/stderr 不进 Git;只在受控执行现场留存。
- 任务 artifacts 只保存脱敏副本、commit、状态码、migration ID、计数、窗口状态和证据引用。
- 不保存生产 origin、数据库名、SSH target、用户名、绝对远端路径、连接串、凭据、业务正文或原始 payload。
## Execution Evidence (2026-08-08)
- 规划提交:`4596ed0`;暂停证据提交:`73f1467`;当前候选已推送到配置的 `origin/main`,`check-source-provenance.mjs` 返回 `published=true`、`remoteVerified=true`。
- 本地门禁:env contract、shell/Node syntax、task validate、process contract、docs audit(0 errors,保留仓库既有 warning)、Trellis governance(0 errors/0 warnings)、sensitive scan(0 findings)均通过。
- 生产输入存在性检查:`EXPECTED_PRODUCTION_ORIGIN`、`EXPECTED_PRODUCTION_DB_NAME`、`EXPECTED_PENDING_MIGRATIONS`、`DEPLOY_SERVER`、`DEPLOY_REFRESH_SERVER` 五个进程输入均未注入;受控 contract 路径按设计应在连接目标后由 systemd unit 读取,未把它们误当作本地输入缺失。
- 生产动作:未执行 SSH、target gate、`prisma migrate status`、`migrate deploy`、数据库写入、refresh、公网 smoke 或真机验证;AC1 的生产体检及 AC2–AC7 保持未验收并标记 PAUSED。
- 失败分流:停止在生产输入门禁,未出现“门禁失败但继续推进”。后续必须在同一受控执行环境注入输入后,从 target gate 重新开始。