Files
railwaysystem/docs/_meta/final-release-readiness.md
T

226 lines
17 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# RailwaySystem - Final Release Readiness Audit Report
> **当前正式开发基线分支:** `integration/wave2-20260914`
> **当前 Integration HEAD:** `d162954cd1e26c6948408a8304ca333ba9fe7a40`
> **最终发布版本 HEAD 标记:** `FINAL_HEAD_PENDING`
> **目标远程发布分支:** `origin/feat/cicd-pipeline`
> **审计属性:** 发布准备度审计、CI/CD 门禁验证、Migration 分类盘点、部署与回滚方案定义
> **纪律铁律:** 只做审计、只写文档、禁止修改业务代码、禁止部署、禁止 push、禁止执行 Browser 测试、HOLD COMMIT
---
## 1. 当前发布事实与 Git 状态审计
### 1.1 分支与 HEAD 状态对照
- **目标远程分支:** `origin/feat/cicd-pipeline`
- **当前 Remote HEAD (`origin/feat/cicd-pipeline`):**
`5d93c217d99ff3cb21ced7ca082d3d8685d4adb5`
*(Commit Message: `chore(ci): 增加Kingbase JDBC依赖预检与初始化流程`)*
- **当前 Integration HEAD (`integration/wave2-20260914`):**
`d162954cd1e26c6948408a8304ca333ba9fe7a40`
*(Commit Message: `fix(ui): 清理最终交付界面技术字段与品牌文案`)*
- **工作区 HEAD:** `d162954cd1e26c6948408a8304ca333ba9fe7a40` (detached HEAD)
### 1.2 差异分析与分支滞后事实
- **Remote 分支是否落后:** **是 (Behind)**
- **落后 Commit 数量:** **落后 2 个 Commit**
- **领先提交清单:**
1. `e2d7e63d8e157417c5aa83fba536834951a2ea25` - `fix(db): 补齐Kingbase操作日志耗时字段`
2. `d162954cd1e26c6948408a8304ca333ba9fe7a40` - `fix(ui): 清理最终交付界面技术字段与品牌文案`
- **发布准则:** 保持 **HOLD COMMIT** 与 **DO NOT PUSH**,等待并行任务全部并入并由发版负责人统筹合并。
---
## 2. Current Release Delta Migration (当前版本增量迁移)
### 2.1 增量定义与范围
当前 `FINAL_HEAD_PENDING` 相对于上一稳定 RC/基线分支(`origin/feat/cicd-pipeline`),**唯一的数据库增量变更**为:
- **增量脚本文件:**
[`RuoYi-Vue/sql/system/kingbase/001_sys_oper_log_cost_time.sql`](file:///Users/wzb/Desktop/项目/RailwaySystem/RuoYi-Vue/sql/system/kingbase/001_sys_oper_log_cost_time.sql)
- **变更目标:**
为若依系统核心日志表 `public.sys_oper_log` 补齐缺失的 `cost_time` 字段(`BIGINT DEFAULT 0`),对齐 Java 实体 `SysOperLog.costTime`,消除系统日志查询接口 `/monitor/operlog/list` 报 500 的系统级阻断缺陷。
- **幂等性保障:**
脚本采用 `ALTER TABLE public.sys_oper_log ADD COLUMN IF NOT EXISTS cost_time BIGINT DEFAULT 0;` 与补偿 `UPDATE public.sys_oper_log SET cost_time = 0 WHERE cost_time IS NULL;`,具备严格语法级存在性保护与数据安全性。
- **发布执行判定:**
**若部署目标数据库已经是 V2 基线,本次发布仅需且必须执行该增量脚本,即可完成数据库端升级对齐。**
### 2.2 历史资产声明 (Historical Assets)
仓库中 `sql/train/v2/*` 与 `sql/generator/kingbase/*` 属于 **Historical Bootstrap / Upgrade / Verification Assets (历史引导/整库升级/验收资产)**。
目标库在当前已经处于 V2 基线状态下,**绝对严禁在每次版本发布时重复执行这些历史脚本**(如备份快照、重建业务表、删除成绩表等),历史脚本仅用于全新空环境初始化或特定旧库全量升级。
---
## 3. Migration 分类盘点与准确统计
遵循专业规范,将工程内所有 17 个 Kingbase SQL 脚本严格按照工程属性分类,杜绝混合统计口径:
### 3.1 准确分类统计汇总
- **A 类: Schema/Data Migration(模式与数据迁移):** **11 个**(含 1 个当前 Release Delta,10 个历史迁移)
- **B 类: Preflight/Probe/Verification(预检/探测/验收断言):** **5 个**(纯只读探测或自带事务显式回滚)
- **C 类: Intentionally Disabled(明确禁用/审计禁止):** **1 个**(`007_dicts.sql`,保护系统字典)
- **总计脚本资产:** **17 个**
---
### 3.2 详细分类清单与执行事实
#### A 类:Schema/Data Migration (模式与数据迁移,共 11 个)
| 脚本路径 | 资产属性 | 用途说明 | 是否幂等 | 目标库已是V2时是否执行 | 历史测试环境实测状态 |
| :--- | :---: | :--- | :---: | :---: | :---: |
| `RuoYi-Vue/sql/system/kingbase/001_sys_oper_log_cost_time.sql` | **Current Release Delta** | 为 `sys_oper_log` 补齐 `cost_time` 字段,解决 500 报错 | **是** | **必须执行 (若未补齐)** | **已执行** (P0阶段已实测验证) |
| `RuoYi-Vue/sql/generator/kingbase/002a_gen_table_identity_patch.sql` | Historical Bootstrap | 为 `gen_table.table_id` 添加自增 Identity | 否 | 严禁重复执行 | **已执行** |
| `RuoYi-Vue/sql/generator/kingbase/002b_gen_table_column_identity_patch.sql` | Historical Bootstrap | 为 `gen_table_column.column_id` 添加自增 Identity | 否 | 严禁重复执行 | **已执行** |
| `RuoYi-Vue/sql/train/v2/001_backup_current_schema.sql` | Historical Upgrade | 备份 14 张历史业务表为 `bak_v1_*` 快照 | 否 | 严禁重复执行 | **已执行** |
| `RuoYi-Vue/sql/train/v2/002_create_new_tables.sql` | Historical Upgrade | 创建 8 张 V2 新业务表 | 否 | 严禁重复执行 | **已执行** |
| `RuoYi-Vue/sql/train/v2/003_alter_master_tables.sql` | Historical Upgrade | 解耦改造 8 张主表结构,卸载旧触发器 | 否 | 严禁重复执行 | **已执行** |
| `RuoYi-Vue/sql/train/v2/004_rebuild_business_tables.sql` | Historical Upgrade | 重建 5 张业务过程表结构 | 否 | 严禁重复执行 | **已执行** |
| `RuoYi-Vue/sql/train/v2/005_constraints.sql` | Historical Upgrade | 建立 13 组 UNIQUE, 26 组 FK, 9 组 CHECK | 否 | 严禁重复执行 | **已执行** |
| `RuoYi-Vue/sql/train/v2/006_indexes.sql` | Historical Upgrade | 创建排课三复合索引及部分唯一索引 | 否 | 严禁重复执行 | **已执行** |
| `RuoYi-Vue/sql/train/v2/008_migrate_teacher.sql` | Historical Upgrade | 迁移旧教师数据并固化 NOT NULL | 否 | 严禁重复执行 | **已执行** |
| `RuoYi-Vue/sql/train/v2/009_drop_legacy_score.sql` | Historical Upgrade | 下线 0 行旧表 `train_score_info` | 是 | 严禁重复执行 | **已执行** |
#### B 类:Preflight/Probe/Verification (预检/探测/验收断言,共 5 个)
| 脚本路径 | 资产属性 | 用途说明 | 执行特性 | 是否曾真实执行 | 执行结果与断言结论 |
| :--- | :---: | :--- | :---: | :---: | :---: |
| `RuoYi-Vue/sql/generator/kingbase/001_generator_identity_precheck.sql` | Preflight | 预检 Generator 两张表自增属性 Case 分支 | 只读诊断探针 | **是** | 输出 CASE_2 分支,无状态修改 |
| `RuoYi-Vue/sql/generator/kingbase/003_generator_identity_verify.sql` | Verification | 验证 Generator 表自增、依赖及序列游标对齐 | 只读断言 | **是** | 输出 `VERIFY: PASS` |
| `RuoYi-Vue/sql/train/v2/000_tx_capability_probe.sql` | Probe (Gate A) | 探测 KingbaseES 实例 DDL 事务原子性与回滚机制 | 临时表+显式 ROLLBACK | **是** | 显式回滚成功,输出 `[Probe-PASS]`,零残留 |
| `RuoYi-Vue/sql/train/v2/000_preflight.sql` | Preflight (Gate B) | Phase 0.5 基线强校验 (断言 14旧表, 1教师, 24外键) | **纯只读强断言** | **是** | **在 Gate B 阶段实测执行通过**,输出 `[Preflight-PASS]` |
| `RuoYi-Vue/sql/train/v2/010_verify.sql` | Verification | 21 张 V2 业务表定义级全量深度验收断言脚本 | 纯只读强断言 | **是** | 实测执行通过,输出 `[Verify-PASS]` |
> [!IMPORTANT]
> **关于 `000_preflight.sql` 真实状态的确定性说明:**
> `000_preflight.sql` 属于纯只读前置基线断言探针(Gate B 门禁)。它**已在历史 V2 迁移准入阶段在真实测试库上完整执行过**并输出 `[Preflight-PASS]`。它不包含任何 DDL/DML 写入,不改变任何数据,不属于发布变更脚本。在当前已升级至 V2 的数据库上,无需再次执行(若再次执行会因表结构已演进至 V2 而断言拦截,这正是其预检保护的设计初衷)。
#### C 类:Intentionally Disabled (明确审计禁止执行,共 1 个)
| 脚本路径 | 资产属性 | 审计结论与处置规则 |
| :--- | :---: | :--- |
| `RuoYi-Vue/sql/train/v2/007_dicts.sql` | Intentionally Disabled | **DO NOT EXECUTE (严禁执行)**。经全链路审计确认,当前生产/测试环境 `sys_dict_*` 表处于 44/500 条纯净基线。为保护若依底座零破坏,严禁执行该脚本,直到后续契约专项重新审定。 |
---
## 4. CI Readiness 审计与最终 Gate 顺序
### 4.1 CI 配置与预检核查 (`.gitlab-ci.yml`)
- **Stage 顺序:** `build_backend` → `build_frontend` → `deploy`
- **Kingbase JDBC Preflight:** 由 [check-kingbase-jdbc.sh](file:///Users/wzb/Desktop/项目/RailwaySystem/scripts/bootstrap/check-kingbase-jdbc.sh) 执行,严格比对本地驱动与授权 SHA256 哈希 `346d5602477ed472b19c5e25729fff5a58b1d83cec56162a56ac4b86d9546c32`;
- **Redis Runtime Preflight:** 部署前强制检查 `SPRING_REDIS_PASSWORD` 非空;
- **Maven Test/Package:** `mvn clean package` 输出 `ruoyi-admin.jar`;
- **Frontend Build:** 注入兼容选项并软链本地缓存,`npm run build:prod` 输出 `build_ui/dist/`;
- **Secret 相关检查:** 强制校验 `TRAIN_STUDENT_IDENTITY_ENCRYPTION_KEY`, `TRAIN_STUDENT_IDENTITY_HASH_KEY`, `SPRING_REDIS_PASSWORD`。
### 4.2 最终 CI Gate 顺序
```text
[CI_GATE_01] Backend Environment Setup (JDK 8, Maven 工具链验证)
↓
[CI_GATE_02] Kingbase JDBC 8.6.0 Integrity Preflight (SHA256 驱动强校验)
↓
[CI_GATE_03] Maven Package & Test Gate (ruoyi-admin.jar 产物构建与测试)
↓
[CI_GATE_04] Frontend Node Runtime & Cache Linking (Node 配置与依赖软链)
↓
[CI_GATE_05] Frontend Build Gate (Webpack 生产模式构建 build_ui/dist)
↓
[CI_GATE_06] Deployment Branch Filter Gate (仅 feat/cicd-pipeline 分支允许触发)
↓
[CI_GATE_07] Runtime Secret & Security Preflight (学员加密密钥、Hash密钥、Redis密码校验)
↓
[CI_GATE_08] Process Graceful Shutdown (kill -15 优雅下线,超时 kill -9)
↓
[CI_GATE_09] Backend Service Boot & Captcha Health Check (/captchaImage 轮询断言 code:200)
↓
[CI_GATE_10] Frontend Static Assets Refresh & Nginx Reload (8082 端口平滑重载)
```
---
## 5. Deployment Readiness 审计与步骤修正
### 5.1 部署环境定义
- **服务器别名:** `sict`
- **部署根目录:** `/data2/wzb/deploy`
- **后端服务端口:** `8092`
- **前端 Nginx 端口:** `8082`
- **Kingbase 数据库服务:** `192.168.139.218:4321/training`
- **部署管理脚本:** `deploy/restart-all.sh`
- **Nginx 配置文件:** `/data2/wzb/deploy/nginx/nginx.conf`
- **后端 Jar 物理路径:** `/data2/wzb/deploy/backend/ruoyi-admin.jar`
- **前端 Dist 物理路径:** `/data2/wzb/deploy/frontend/`
### 5.2 修正后的部署步骤 (DEPLOY_STEP_01 ~ DEPLOY_STEP_10)
- **`DEPLOY_STEP_01` (环境与凭据预检):** 确认目标机 `sict` 上敏感环境变量(`TRAIN_STUDENT_IDENTITY_ENCRYPTION_KEY`, `TRAIN_STUDENT_IDENTITY_HASH_KEY`, `SPRING_REDIS_PASSWORD`)已就绪。
- **`DEPLOY_STEP_02` (数据库 Schema 版本判定与 Delta 执行):**
**先判断目标库当前 schema 版本**:
- 若目标库**已经是 V2 基线**:**仅执行当前 Release Delta migration**(即 `RuoYi-Vue/sql/system/kingbase/001_sys_oper_log_cost_time.sql`),**严禁重复执行历史 V2 rebuild/drop/backup 脚本**;
- 若目标库为全新库或历史旧库:按受控初始化手册逐步升级。
- **`DEPLOY_STEP_03` (现网制品备份):** 备份当前运行中的 `ruoyi-admin.jar` 为 `ruoyi-admin.jar.bak`,备份 `frontend` 为 `frontend.bak`。
- **`DEPLOY_STEP_04` (CI 构建产物生成与归档):** 运行发布流水线,生成后端 `ruoyi-admin.jar` 与前端 `dist/` 构建物。
- **`DEPLOY_STEP_05` (前端静态资源覆盖部署):** 清空 `/data2/wzb/deploy/frontend/*`,将新构建的 `dist/*` 内容拷贝至该目录。
- **`DEPLOY_STEP_06` (后端 Jar 包更新部署):** 将新构建的 `ruoyi-admin.jar` 拷贝至 `/data2/wzb/deploy/backend/`。
- **`DEPLOY_STEP_07` (执行平滑重启调度):** 调用 `bash deploy/restart-all.sh`。
- **`DEPLOY_STEP_08` (后端优雅停机与新实例启动):** 脚本优雅终止旧进程并在端口 `8092` 启动新进程。
- **`DEPLOY_STEP_09` (健康自检探针验证):** 脚本自动轮询 `http://127.0.0.1:8092/captchaImage`,35 次内确认返回 `"code":200`。
- **`DEPLOY_STEP_10` (前端 Nginx 平滑重载):** 验证配置并执行 `nginx -s reload`,确保 8082 端口对外访问就绪。
---
## 6. Runtime Verification Checklist (精准三态定义)
由于本次仅为审计与准备任务,未部署、未启动 Browser,所有验收项严谨标注当前真实状态,**不得将当前 HEAD 未重新执行项写成已通过**:
| 验收编号 | 检验项 / 模块 | UI 路由入口 / API 真实端点 | 真实核验状态判定 | 状态说明 |
| :---: | :--- | :--- | :---: | :--- |
| **RTC-01** | Backend Health | `GET http://127.0.0.1:8092/captchaImage` | **PREVIOUSLY_VERIFIED_ON_PRIOR_RC** | 脚本中自检逻辑已在历史发布实测通过,当前 HEAD 未部署 |
| **RTC-02** | Kingbase Connectivity | 后端启动连接池与元数据读取 | **PREVIOUSLY_VERIFIED_ON_PRIOR_RC** | 历史实测通过,当前 HEAD 待最终部署验证 |
| **RTC-03** | Redis Connectivity | Captcha 缓存与 Token 存储 | **PREVIOUSLY_VERIFIED_ON_PRIOR_RC** | 历史实测通过,当前 HEAD 待最终部署验证 |
| **RTC-04** | User Login | `POST /prod-api/login` | **PREVIOUSLY_VERIFIED_ON_PRIOR_RC** | 历史实测通过,当前 HEAD 待最终部署验证 |
| **RTC-05** | OperLog 耗时字段查询 | `GET /prod-api/monitor/operlog/list` | **PREVIOUSLY_VERIFIED / DB_FIX_VALIDATED** | `cost_time` 数据库补丁在当前测试库实测执行并验证 200,但当前 integration 尚未部署验证 |
| **RTC-06** | Plan (培训计划) | **UI:** 课程管理 → 开班计划<br>**API:** `/train/plan/*` | **PENDING_FINAL_GATE** | Safe UI Polish 涉及页面,待最终发版门禁运行时验证 |
| **RTC-07** | Enrollment (参训人员) | **UI:** 课程管理 → 开班计划 → 参训人员 (Tab)<br>**API:** `POST/GET /train/plans/{planId}/enrollments...` | **PENDING_FINAL_GATE** | 内部 Tab 视图,Safe UI Polish 涉及页面,待最终门禁验证 |
| **RTC-08** | Scheduling (智能排课) | **UI:** 课程管理 → 开班计划 → 排课课表 (Tab)<br>**API:** `/train/lessons/*` 及 `/train/plans/{planId}/timetable` | **PENDING_FINAL_GATE** | 内部 Tab 视图,冲突 Soft Warning,待最终门禁验证 |
| **RTC-09** | Board (电子班牌) | **UI:** 设施设备 → 电子班牌<br>**正式路由:** `/train/board`<br>**API:** `/train/board/*` | **PENDING_FINAL_GATE** | Safe UI Polish 涉及页面,正式路径 `/train/board`,待最终门禁验证 |
| **RTC-10** | Legacy Analytics 1: 培训总评分析 | **UI:** 教学评估 → 培训总评分析 (`/analysis/report`) | **PENDING_CODEX** | 处于并行处理中,等待 Codex 交付后验收 |
| **RTC-11** | Legacy Analytics 2: 学员打卡记录 | **UI:** 考勤与打卡 → 学员打卡记录 (`/analysis/checkin`) | **PENDING_CODEX** | 处于并行处理中,等待 Codex 交付后验收 |
| **RTC-12** | Legacy Analytics 3: 学习时长统计 | **UI:** 学习监控 → 学习时长统计 (`/analysis/duration`) | **PENDING_CODEX** | 处于并行处理中,等待 Codex 交付后验收 |
| **RTC-13** | Legacy Analytics 4: 学员画像分析 | **UI:** 学员画像 → 画像分析 (`/portrait`) | **PENDING_CODEX** | 处于并行处理中,等待 Codex 交付后验收 |
| **RTC-14** | Frontend Nginx 8082 | `http://192.168.139.230:8082` | **PENDING_FINAL_GATE** | 待部署后验证反向代理与静态资源加载 |
| **RTC-15** | Global Network Quality | 全模块页面跳转与 API 交互 | **PENDING_FINAL_GATE** | 待全部集成合并后执行全站 **Network 500 = 0** 门禁断言 |
---
## 7. Rollback Plan (版本与数据回滚预案)
### 7.1 代码与前端回滚策略
- **禁止通过执行旧 V2 脚本进行回滚**;
- 采用**上一个已归档稳定制品**进行平滑回退:
```bash
# 恢复后端稳定 Jar
cp /data2/wzb/deploy/backend/ruoyi-admin.jar.bak /data2/wzb/deploy/backend/ruoyi-admin.jar
# 恢复前端稳定 Dist
rm -rf /data2/wzb/deploy/frontend/*
cp -r /data2/wzb/deploy/frontend.bak/* /data2/wzb/deploy/frontend/
# 触发平滑重启
bash deploy/restart-all.sh
```
### 7.2 数据库 Migration 回滚安全准则
- **零 DROP 原则:** `cost_time` 新增列属于向前兼容字段(DEFAULT 0),旧版本代码不读取该列即可正常运行。
- **无需且严禁 DROP COLUMN:** 代码回滚时**严禁为数据库删除 `cost_time` 列**,杜绝锁表与元数据破坏。
---
## 8. Release Artifact Manifest (发布产物清单)
1. **后端 Jar 包:** `RuoYi-Vue/ruoyi-admin/target/ruoyi-admin.jar`
2. **前端静态制品:** `build_ui/dist/`
3. **当前发布 Delta Migration:** `RuoYi-Vue/sql/system/kingbase/001_sys_oper_log_cost_time.sql`
4. **历史引导/升级/验收资产包:** `RuoYi-Vue/sql/train/v2/*`, `RuoYi-Vue/sql/generator/kingbase/*`
5. **部署配置与运维脚本:** `deploy/restart-all.sh`, `deploy/nginx.conf.example`, `scripts/bootstrap/check-kingbase-jdbc.sh`, `.gitlab-ci.yml`
6. **版本基线 HEAD:** `FINAL_HEAD_PENDING` (当前开发基线 `d162954cd1e26c6948408a8304ca333ba9fe7a40`)
7. **测试与准备报告:** `docs/_meta/final-release-readiness.md`, `docs/_meta/deployment-gate-checklist.md`
8. **Browser 审计报告:** `docs/ui-audit-screenshots/`