# 26 domainCheck 发布前运行验证与交付模板 ## 一、这份模板怎么用 这份文档不是设计说明,而是正式发布前最后一轮执行模板。 适用场景: - 海外单脑控制面已经搭好 - 大陆节点已经接入或正在收口 - 代码已经更新到待发布版本 - 现在要做最后一轮运行验证、证据留存、交付确认 这份模板分成 3 段: 1. 发布前运行验证 2. 上线证据导出 3. 最终交付结论模板 --- ## 二、发布前运行验证 ### 1. 先跑统一收口摘要 ```bash cd /www/wwwroot/getDomain bash domain-api/deploy/multi-region/drive_ops_center.sh go-live-check http://127.0.0.1:8100 http://127.0.0.1:8100 summary ``` 记录结果: - `go_live_status` - `publish_status` - `blocking_reasons` - `warnings` - `next_step_action_code` - `operator_title` - `launchpad_recommended_target_node_code` - `launchpad_recommended_recovery_label` - `launchpad_recommended_recovery_summary` - `launchpad_onboarding_bootstrap_pending_nodes` - `launchpad_onboarding_acceptance_ready_nodes` 通过标准: - `go_live_status != blocked` - `publish_status != blocked` ### 1.5 先看环境差异是否已收口 ```bash bash domain-api/deploy/multi-region/drive_ops_center.sh env-audit bash domain-api/deploy/multi-region/drive_ops_center.sh runtime-refresh-recover bash domain-api/deploy/multi-region/drive_ops_center.sh go-live-recover ``` 重点只看: - `status` - `headline` - `python.pytest_installed / fastapi_installed / uvicorn_installed` - `python.runtimes` - `services` - `runtime.preflight_ok` - `runtime.readiness_status` - `runtime.route_surface_complete` - `missing_items` - `tooling_items` 通过标准建议: - `status != blocked` - `runtime.preflight_ok=true` - `route_surface_complete=true` - 如果 `missing_items` 里仍有关键基础项,先补环境,再继续业务复核 - 如果只有 `tooling_items`,可以继续上线复核,但建议后补本机工具链 - 如果 `runtime.runtime_may_need_restart=true` - 不要直接继续接管或发布链 - 先按 `runtime-refresh-recover` 给出的固定顺序完成 API 重启与复检 - 如果你希望把这一轮“重启 + 总检 + 默认下一步 + 上线摘要”压成一次复核 - 直接执行 `go-live-recover` ### 1.6 先看托管节点接入面是否清楚 ```bash bash domain-api/deploy/multi-region/drive_ops_center.sh nodes http://127.0.0.1:8100 ``` 重点只看: - `summary.agent_ready` - `summary.ssh_ready` - `summary.remote_access_ready` - `summary.remote_access_state_counts` - 每台节点的 `agent_state` - 每台节点的 `remote_access_state` - 每台节点的 `ssh_access_label` - 每台节点的 `ssh_entry` 通过标准建议: - 如果某台节点还是 `agent_pending` - 先确认是否已经保存 SSH 入口 - 如果节点尚未保存 SSH 入口,但你已经决定由海外控制面统一接管 - 先补录: ```bash bash domain-api/deploy/multi-region/drive_ops_center.sh node-bind-ssh http://127.0.0.1:8100 mainland-worker-01 121.204.244.248 root 22 ``` - 补录后立即复查: ```bash bash domain-api/deploy/multi-region/drive_ops_center.sh nodes http://127.0.0.1:8100 bash domain-api/deploy/multi-region/drive_ops_center.sh node-handover http://127.0.0.1:8100 mainland-worker-01 ``` - 如果已经 `agent_ready` - 说明该节点已进入标准远端执行器接管面 - 如果还不是 `agent_ready`,但 `ssh_ready` 已经成立 - 说明至少已经具备海外主控经 SSH 进入节点完成 bootstrap / 验收的前置条件 ### 2. 再看总检详情 ```bash bash domain-api/deploy/multi-region/drive_ops_center.sh stack-diagnosis ``` 记录结果: - `stack_status` - `issues` - `next_step` - `quick_commands` 通过标准: - `stack_status != blocked` - `issues` 里没有未处理的关键阻断项 ### 3. 再看驾驶主线 ```bash bash domain-api/deploy/multi-region/drive_ops_center.sh driver-feed bash domain-api/deploy/multi-region/drive_ops_center.sh codex-brief ``` 记录结果: - `top_recommendation` - `automation_coverage` - `recommended_behavior` - `focus` - `summary.launchpad_recommended_target_node_code` - `summary.launchpad_recommended_recovery_label` - `summary.launchpad_onboarding_bootstrap_pending_nodes` - `summary.launchpad_onboarding_acceptance_ready_nodes` 通过标准: - `automation_coverage.launch_status != blocked` - 默认下一步已经明确 - 如果 `summary.launchpad_recommended_target_node_code` 非空 - 值班同事应能直接知道当前卡在哪台节点 - 不需要再回 launchpad 明细手工翻 gap rows ### 4. 若涉及发布,再看 Release Hub ```bash bash domain-api/deploy/multi-region/drive_ops_center.sh release-launchpad ``` 记录结果: - `launchpad_status` - `recommended_action_code` - `default_rollout_gate_status` - `recommended_target_node_code` - `recommended_recovery_label` - `recommended_recovery_summary` - `onboarding_bootstrap_pending_nodes` - `onboarding_acceptance_ready_nodes` 通过标准: - `launchpad_status != blocked` - `default_rollout_gate_status != blocked` 特殊判读: - 如果 `recommended_action_code=api-restart` - 不要误判成“节点没接好” - 这更像是运行中的控制面 API 还没刷新到当前仓库的最新运维能力 - 应先执行: ```bash bash domain-api/deploy/multi-region/drive_ops_center.sh runtime-refresh-recover ``` - 然后重新跑: ```bash bash domain-api/deploy/multi-region/drive_ops_center.sh stack-diagnosis bash domain-api/deploy/multi-region/drive_ops_center.sh release-launchpad ``` 补充说明: - 从 `latest_release.json` 直接创建 Release,或执行“基于最新包的一键智能 Rollout”之前 - 现在不仅要求 `smoke_test_ok=true` - 还要求当前 `final_release_report.json` 与最新包完全匹配,且 `final_release_ok=true` - 如果页面按钮被禁用,或 API 返回“最新发布包尚未完成最终签收” - 优先检查 `final_release_report_stale_reason` - 再检查 `final_release_gate_decision / final_release_gate_blocked_reasons` ### 5. 若涉及节点接管,补跑节点验收 如果这次发布包含: - 新增大陆节点 - 重新接管旧节点 - 切换到 Node Agent 主接管模式 则不能只看总检摘要,还要对目标节点逐台完成验收。 先看验收计划: ```bash bash domain-api/deploy/multi-region/drive_ops_center.sh node-acceptance-plan http://127.0.0.1:8100 mainland-worker-01 ``` 确认无误后执行: ```bash bash domain-api/deploy/multi-region/drive_ops_center.sh node-acceptance-run http://127.0.0.1:8100 mainland-worker-01 cli/acceptance ``` 记录结果: - `node_code` - `status` - `checks` - `blocking_issues` - `warnings` - `recommended_next_step` 通过标准: - `status != blocked` - 没有未处理的 `blocking_issues` - 目标节点已经不再停留在“bootstrap pending / acceptance pending” ### 6. 若涉及远端执行,补跑日志回传验证 如果当前版本准备进入: - 多机值班 - 海外单脑统一接管 - 远端动作回执与现场日志复核 则需要确认日志回传链已经可用,而不是只看节点在线。 先检查: ```bash bash domain-api/deploy/multi-region/drive_ops_center.sh log-sync-check ``` 如果存在缺口,再执行恢复: ```bash bash domain-api/deploy/multi-region/drive_ops_center.sh log-sync-recover http://127.0.0.1:8100 key confirm cli/log-sync ``` 必要时抓一份节点现场日志: ```bash bash domain-api/deploy/multi-region/drive_ops_center.sh scene-node-log http://127.0.0.1:8100 mainland-worker-01 120 full ``` 记录结果: - `log_sync_enabled` - `line_count` - `source_nodes` - `missing_nodes` - `scene_log.status` 通过标准: - 关键节点已出现在 `source_nodes` - `missing_nodes` 不包含当前发布主车道节点 - 如需人工复核现场,`scene-node-log` 能取到有效日志 ### 7. 若涉及 Node Agent 交付,补看队列健康 如果这轮发布已经进入“控制面发动作、节点拉任务、节点回执结果”的模式,就必须确认 delivery queue 没有假健康。 先看队列摘要: ```bash bash domain-api/deploy/multi-region/drive_ops_center.sh queue-status http://127.0.0.1:8100 mainland-worker-01 ``` 如果怀疑有堆积或死信,再看明细: ```bash bash domain-api/deploy/multi-region/drive_ops_center.sh queue-records http://127.0.0.1:8100 mainland-worker-01 dead_letter ``` 如需重放: ```bash bash domain-api/deploy/multi-region/drive_ops_center.sh queue-replay http://127.0.0.1:8100 mainland-worker-01 20 cli/queue-replay ``` 记录结果: - `delivery_queue.summary` - `dead_letter` - `retrying` - `pending` - `replayed_count` 通过标准: - `dead_letter=0` - 没有持续增长的 `retrying` - 队列不处于异常堆积状态 注意: - `dead_letter > 0` 时,不应宣称“可正式发布” - 这种情况至少按 `publish_status = blocked` 处理 ### 8. 最后跑一次 doctor 结论 前面的检查是分面复核,最后还要再收成一句话,让交班、值班、Codex 驾驶员看到同一结论。 ```bash bash domain-api/deploy/multi-region/drive_ops_center.sh doctor-decision ``` 记录结果: - `status` - `decision` - `recommended_commands` - `recommended_reading_order` - `launchpad_alignment` 通过标准: - `status != blocked` - `decision` 与前面的 `go-live-check / stack-diagnosis / release-launchpad` 不冲突 - `recommended_commands` 已经指向明确的下一跳,而不是泛化排查 ### 9. 若希望直接生成“可否签字上线”的最终摘要 如果你不想手工再拼: - bundle review - doctor 结论 - 发布门禁 可以直接执行: ```bash bash domain-api/deploy/multi-region/drive_ops_center.sh go-live-signoff ``` 如果已经有现成证据包,也可以直接基于 manifest 输出: ```bash bash domain-api/deploy/multi-region/drive_ops_center.sh go-live-signoff /path/to/go-live-bundle ``` 这一步现在不是“另一套单独判断”,而是固定复用: - `go-live-review` - `doctor-decision` - `go-live-summary / 发布门禁 / launchpad 摘要` 也就是说,页面首屏、CLI 和海外 Codex 看到的最终签收结论,已经开始共享同一份签字口径。 重点只看: - `signoff_status` - `headline` - `release_gate` - `blocked_reasons` - `attention_reasons` - `decision` - `recommended_commands` 通过标准: - `signoff_status=ready` - 可进入最终人工签字或正式发布 - `signoff_status=attention` - 说明现场已经接近完成,但仍应先清 attention 项 - `signoff_status=blocked` - 本轮不应宣称收口完成 --- ## 三、上线证据导出 ### 1. 导出 bundle ```bash bash domain-api/deploy/multi-region/drive_ops_center.sh go-live-export ``` 这会生成一整包上线前证据。 建议至少保留: - `00_env_audit.txt` - `01_go_live_check_summary.txt` - `02_go_live_summary.json` - `03_stack_diagnosis.json` - `04_driver_feed.json` - `05_codex_brief.json` - `06_release_launchpad.json` - `manifest.json` 如果当前轮次涉及节点接管,建议额外保留: - `agent_gap_export.json` - `node_bootstrap_plan.txt` - `node_acceptance_plan.json` 如果当前轮次涉及远端执行与日志回传,建议额外保留: - `scene_log_*.txt` - `doctor_decision.json` ### 2. 直接复核 bundle ```bash bash domain-api/deploy/multi-region/drive_ops_center.sh go-live-review ``` 如果你已经切到 Ops Center 页面,也可以直接看: - 首屏 `总检决策` - `总检主决策详情` - API `GET /api/v1/ops/doctor-decision` - 首屏 `交付证据` - `交付证据详情` - API `GET /api/v1/ops/go-live-bundle` - 首屏 `正式复核` - `正式复核详情` - API `GET /api/v1/ops/go-live-review` 记录结果: - `status` - `headline` - `critical_failures` - `noncritical_failures` - `launchpad_alignment.consistent` - `env_audit.status` - `env_audit.missing_items` - `recommended_next_steps` 通过标准建议: - `status=ready` - 可进入最终人工确认或正式发布 - `status=attention` - 核心报告已齐,但仍需复核补充失败项或环境缺口 - 也包括 `go_live_summary / stack_diagnosis / driver_feed / codex_brief` 的 launchpad 摘要出现不一致 - `status=blocked` - 关键报告缺失,或环境审计已经判定阻断,不应直接宣称收口完成 如果 `env_audit.missing_items` 里出现: - `missing_env:/etc/default/domaincheck-node-agent` 则这次 bundle review 已经不是泛泛地提示“环境缺口”,而是明确指向 Node Agent 接管还未收口。此时按下面顺序推进: 1. `agent-gap-export` 2. `node-bootstrap-plan` 3. 如果 summary 已提示 `runtime_may_need_restart=true` 4. 完成恢复后重新导出 bundle,再做一次 `go-live-review` ### 3. 生成最终交付包 运行验证、bundle 复核都通过后,再生成最终交付包。 如果当前机器已经具备 smoke 运行条件,直接执行: ```bash bash ./prepare_final_release.sh ``` 如果当前机器只适合先做离线打包,可先跳过 smoke: ```bash DOMAINCHECK_SKIP_SMOKE_TEST=1 bash ./package_domain_release.sh bash ./verify_domain_release.sh ``` 后续再回到具备运行条件的机器上执行: ```bash bash ./prepare_final_release.sh ``` 最后统一查看最新交付结果: ```bash bash ./show_latest_release.sh ``` 重点只看: - `latest_release.package_name` - `latest_release.archive_path` - `latest_release.sha256` - `latest_release.smoke_test_ok` - `final_release_ok` - `final_release_report` - `final_release_report_ok` - `final_release_report_matches_latest` - `final_release_report_stale_reason` - `final_release_gate_decision` - `final_release_gate_blocked_reasons` - `final_release_gate_verify_ok` - `final_release_gate_smoke_test_ok` 通过标准: - `verify_domain_release.sh` 返回 `ok=true` - `latest_release.smoke_test_ok=true` - `final_release_ok=true` - `final_release_report_matches_latest=true` - `final_release_gate_decision=ready` - `final_release_gate_verify_ok=true` - `final_release_gate_smoke_test_ok=true` - `final_release_report` 已指向最新一轮生成的正式报告 4. 先执行 `runtime-refresh-recover` 5. 再重新导出 bootstrap plan --- ## 四、最终交付结论模板 下面这段可以直接作为正式发布前的交付结论模板使用。 ### 模板正文 ```text 本轮发布前运行验证已完成。 一、统一收口结论 - go_live_status: <填写> - publish_status: <填写> - stack_status: <填写> - automation_coverage.launch_status: <填写> - launchpad_status: <填写> 二、默认下一步 - next_step_action_code: <填写> - operator_title: <填写> - launchpad_recommended_target_node_code: <填写> - launchpad_recommended_recovery_label: <填写> 三、上线证据包 - bundle 路径: <填写> - manifest 复核状态: <填写 ready/attention/blocked> - go-live-review.headline: <填写> - manifest.review_status_hint: <填写> - critical_failures: <填写> - noncritical_failures: <填写> - manifest.launchpad_recommended_target_node_code: <填写> - manifest.launchpad_recommended_recovery_label: <填写> - manifest.launchpad_onboarding_bootstrap_pending_nodes: <填写> - manifest.launchpad_onboarding_acceptance_ready_nodes: <填写> - manifest.launchpad_alignment.consistent: <填写 true/false> 四、结论 - <填写:可进入正式发布 / 仍需继续收口 / 暂不可发布> ``` ### 模板补充说明 填写“可进入正式发布”前,建议再做一次人工交叉确认: - 发布门禁是否为 `ready` 或至少非 `blocked` - 当前主车道是否已经明确 - 是否还存在 `dead_letter` - 是否还有节点停留在 `bootstrap pending / acceptance pending` - 是否已经保留可复盘的证据包与 manifest --- ## 五、交付给值班同事时最少要带什么 最少带下面 4 样: 1. `go-live-check` 摘要 2. `stack-diagnosis` 结果 3. `driver-feed / codex-brief` 结果 4. `go-live-export` 生成的 `manifest.json` 如果值班同事需要直接接手节点问题,再多带 3 样: 1. `node-acceptance-run` 最近结果 2. `log-sync-check` 最近结果 3. `queue-status` 或 `queue-records dead_letter` 最近结果 这样交班的人不需要重新从零拼现场。 --- ## 六、真正的收工标准 如果要算“这次版本已经可以收工”,建议至少同时满足: - 前端构建成功 - 海外单脑驾驶舱首屏状态正常 - `go-live-review.status != blocked` - 发布门禁不为 `blocked` - Node Agent 目标节点已完成接管验收 - 远端日志回传链可用或已确认本轮不依赖 - delivery queue 不存在未处理 `dead_letter` - 当前默认下一步已经不是“继续补基础设施”,而是进入正式发布 / 观察 / 验收车道 到这一步,才适合说: > 当前项目已经进入可上线、可交付、可持续运维状态。