# RailwaySystem 最终部署门禁与运行时验收清单 (Deployment Gate Checklist) > **当前正式开发基线:** `integration/wave2-20260914` > **当前 Integration HEAD:** `d162954cd1e26c6948408a8304ca333ba9fe7a40` > **最终发布版本 HEAD 标记:** `FINAL_HEAD_PENDING` > **目标发布分支:** `origin/feat/cicd-pipeline` > **部署目标环境:** 服务器别名 `sict`,根目录 `/data2/wzb/deploy`,后端 `8092`,前端 `8082` > **使用说明:** 本清单规范了发布前门禁、标准化部署动作序列、基于精准三态判定的运行时验收,以及基于归档制品的应急回滚方案。 --- ## 一、发布前门禁 (Pre-Deployment Gates) ### Gate 1: Git 版本与基线门禁 - [ ] **G1.1 分支合并状态确认**:确认 `origin/feat/cicd-pipeline` 目前落后当前基线 2 个 commit(`e2d7e63d`, `d162954c`)。最终发版提交标注为 `FINAL_HEAD_PENDING`,待所有并行任务(Legacy Analytics V2 Contract 与 Business Scenario Test Pack)并入后统一核准。 - [ ] **G1.2 仓库状态审查**:保持本地工作区未残留临时变更,**HOLD COMMIT**,未获发版审批前严禁随意提交。 - [ ] **G1.3 远端推送许可确认**:严格遵守发版纪律,保持 **DO NOT PUSH**。 ### Gate 2: 数据库 Migration 分类与增量门禁 - [ ] **G2.1 目标库 Schema 版本判定**:在执行部署前,首先判定目标库是否已处于 V2 基线。 - **若目标库已是 V2 基线:** **仅需且仅允许执行当前 Release Delta migration**(`RuoYi-Vue/sql/system/kingbase/001_sys_oper_log_cost_time.sql`)。 - **历史 V2 脚本隔离:** 历史 V2 脚本(`sql/train/v2/*` 及 `sql/generator/kingbase/*`)已从常规发布执行清单中移除,**严禁在已有 V2 库上重复执行**历史备份、重建与删表操作。 - [ ] **G2.2 `001_sys_oper_log_cost_time.sql` 准备度**:确认目标库已执行补齐 `cost_time` 字段;若未补齐,后端启动前必须执行(具备 `IF NOT EXISTS` 幂等保护)。 - [ ] **G2.3 零破坏纪律**:**严禁执行 `007_dicts.sql` (DO NOT EXECUTE)**;严禁执行任何 DROP TABLE 操作。 ### Gate 3: CI/CD 构建与依赖门禁 - [ ] **G3.1 Kingbase JDBC 8.6.0 Preflight**: - 依赖文件:`${HOME}/.m2/repository/com/kingbase/kingbase8/8.6.0/kingbase8-8.6.0.jar` - SHA256 强校验:`346d5602477ed472b19c5e25729fff5a58b1d83cec56162a56ac4b86d9546c32` 匹配无误。 - [ ] **G3.2 后端编译与打包**:`mvn clean package` 成功,生成 `RuoYi-Vue/ruoyi-admin/target/ruoyi-admin.jar`。 - [ ] **G3.3 前端构建**:`npm run build:prod` 成功,生成 `build_ui/dist/`。 - [ ] **G3.4 运行时安全环境变量就绪**: - 导出 `TRAIN_STUDENT_IDENTITY_ENCRYPTION_KEY` - 导出 `TRAIN_STUDENT_IDENTITY_HASH_KEY` - 导出 `SPRING_REDIS_PASSWORD` --- ## 二、标准化部署执行步骤 (Deployment Steps) | 步骤编号 | 操作名称 | 责任操作与说明 | 验证方法 | | :---: | :--- | :--- | :--- | | **`DEPLOY_STEP_01`** | **环境与凭据预检** | 确认目标机 `sict` 上 JDK 8、Maven、Nginx 可用,三大敏感环境变量已导出 | 执行 `echo` 检查变量存在且非空 | | **`DEPLOY_STEP_02`** | **Schema 判定与 Delta 补丁** | 判定目标库当前 Schema 版本。**若已是 V2,仅执行当前 Release Delta migration (`001_sys_oper_log_cost_time.sql`)**;严禁重跑历史 V2 脚本 | 确认 `sys_oper_log.cost_time` 存在 | | **`DEPLOY_STEP_03`** | **现网制品备份** | 备份已有后端 Jar 与前端静态文件:
`cp ruoyi-admin.jar ruoyi-admin.jar.bak`
`cp -r frontend frontend.bak` | 检查备份文件生成成功 | | **`DEPLOY_STEP_04`** | **CI 构建物拉取/生成** | 运行流水线或获取当前版本产物 `ruoyi-admin.jar` 与 `dist/` | 校验产物 MD5/SHA256 与构建日志 | | **`DEPLOY_STEP_05`** | **前端静态资源更新** | 清理并覆盖部署:
`rm -rf /data2/wzb/deploy/frontend/*`
`cp -r build_ui/dist/* /data2/wzb/deploy/frontend/` | 确认 `frontend/index.html` 存在 | | **`DEPLOY_STEP_06`** | **后端 Jar 包发布** | 将新构建 Jar 拷贝到发布目录:
`cp ruoyi-admin.jar /data2/wzb/deploy/backend/` | 确认物理文件更新且大小正常 | | **`DEPLOY_STEP_07`** | **执行平滑重启调度** | 赋予权限并调用统一调度脚本:
`chmod +x deploy/restart-all.sh && bash deploy/restart-all.sh` | 脚本流程不抛出语法或环境异常 | | **`DEPLOY_STEP_08`** | **后端进程平滑切换** | 脚本向旧进程发送 `kill -15`,超时发送 `kill -9`;以端口 `8092` 启动新进程并记录 `app.pid` | `ps -ef \| grep ruoyi-admin.jar` 确认新 PID | | **`DEPLOY_STEP_09`** | **健康自检探针断言** | 脚本自动轮询 `http://127.0.0.1:8092/captchaImage`(最多 35 次,每 2s 一次),断言返回 `"code":200` | 脚本输出 `后端健康检查通过!` | | **`DEPLOY_STEP_10`** | **前端 Nginx 平滑重载** | 验证 `/data2/wzb/deploy/nginx/nginx.conf` 语法,执行 `nginx -s reload` 或拉起服务 | 检查端口 8082 处于 LISTEN 状态 | --- ## 三、部署后运行时验收清单 (Runtime Verification Checklist) > **审计状态规范说明:** > - `VERIFIED_ON_CURRENT_HEAD`: 在当前 Integration HEAD (`d162954c`) 上重新执行并通过验收的项; > - `PREVIOUSLY_VERIFIED_ON_PRIOR_RC`: 在先前发布版本/分支上已完成真实执行验证,但当前 HEAD 尚未重新运行部署验收的项; > - `PENDING_FINAL_GATE`: 等待最终集成发版门禁在完整部署后执行验收的项; > - `PENDING_CODEX`: 依赖并行 Codex Agent 交付的专项模块。 ### 1. 基础连通性与平台 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` 补丁在测试库实测通过,当前 integration 待部署验证 | ### 2. Wave 2 业务模块核心验收 (纠正 UI 入口与 API 路由) | 验收编号 | 业务模块 | 正确 UI 入口导航 | 对应核心 API 契约 | 当前状态判定 | | :---: | :--- | :--- | :--- | :---: | | **RTC-06** | **培训计划 (Plan)** | 课程管理 → 开班计划 | `/train/plan/*` | **PENDING_FINAL_GATE** | | **RTC-07** | **参训人员 (Enrollment)** | 课程管理 → 开班计划 → 参训人员 (内部Tab) | `POST/GET /train/plans/{planId}/enrollments...` | **PENDING_FINAL_GATE** | | **RTC-08** | **排课课表 (Scheduling)** | 课程管理 → 开班计划 → 排课课表 (内部Tab) | `/train/lessons/*`
`/train/plans/{planId}/timetable` | **PENDING_FINAL_GATE** | | **RTC-09** | **电子班牌 (Board)** | 设施设备 → 电子班牌 (**正式路径: `/train/board`**) | `/train/board/*` | **PENDING_FINAL_GATE** | ### 3. Legacy Analytics 分析模块 (并行交付项) | 验收编号 | 业务模块 | UI 路由入口 | 当前状态判定 | 说明 | | :---: | :--- | :--- | :---: | :--- | | **RTC-10** | 培训总评分析 (Class Report) | 教学评估 → 培训总评分析 (`/analysis/report`) | **PENDING_CODEX** | 等待 Codex Agent 交付 V2 契约 | | **RTC-11** | 学员打卡记录 (Student Checkin) | 考勤与打卡 → 学员打卡记录 (`/analysis/checkin`) | **PENDING_CODEX** | 等待 Codex Agent 交付 V2 契约 | | **RTC-12** | 学习时长统计 (Study Duration) | 学习监控 → 学习时长统计 (`/analysis/duration`) | **PENDING_CODEX** | 等待 Codex Agent 交付 V2 契约 | | **RTC-13** | 学员画像分析 (Student Portrait) | 学员画像 → 画像分析 (`/portrait`) | **PENDING_CODEX** | 等待 Codex Agent 交付 V2 契约 | ### 4. 综合体验与全站质量门禁 | 验收编号 | 检验项 | 验证内容 | 当前状态判定 | | :---: | :--- | :--- | :---: | | **RTC-14** | Frontend Entry 8082 | 访问 `http://192.168.139.230:8082`,前端路由与静态资源无 404 | **PENDING_FINAL_GATE** | | **RTC-15** | 全站 Network 500 = 0 | 完整业务端到端流转中,网络请求 **500 报错数量严格为 0** | **PENDING_FINAL_GATE** | --- ## 四、回滚预案与应急处置 (Rollback Gate) ### 1. 触发条件 - 部署后 `/captchaImage` 健康自检连续 35 次超时失败; - 系统日志或核心功能持续出现 HTTP 500 异常; - 出现严重影响主业务的未预期缺陷。 ### 2. 执行回滚操作规范 - **严禁通过重新执行旧 V2 脚本来进行回滚**; - 统一使用**上一个已归档制品**执行回退: ```bash # 1. 恢复后端稳定 Jar cp /data2/wzb/deploy/backend/ruoyi-admin.jar.bak /data2/wzb/deploy/backend/ruoyi-admin.jar # 2. 恢复前端稳定静态资源 rm -rf /data2/wzb/deploy/frontend/* cp -r /data2/wzb/deploy/frontend.bak/* /data2/wzb/deploy/frontend/ # 3. 触发平滑重启脚本 bash /data2/wzb/deploy/restart-all.sh ``` ### 3. 数据库 Migration 回滚安全准则 - `001_sys_oper_log_cost_time.sql` 属于**向前兼容(Backward-Compatible)**字段; - 旧版本后端代码在不读取该字段的情况下完全可以正常运行; - **回滚代码时严禁对数据库执行 `ALTER TABLE ... DROP COLUMN cost_time`**,以避免锁表与元数据不可逆破坏。