Files
railwaysystem/docs/_meta/deployment-gate-checklist.md
T

123 lines
9.8 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 最终部署门禁与运行时验收清单 (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 与前端静态文件:<br>`cp ruoyi-admin.jar ruoyi-admin.jar.bak`<br>`cp -r frontend frontend.bak` | 检查备份文件生成成功 |
| **`DEPLOY_STEP_04`** | **CI 构建物拉取/生成** | 运行流水线或获取当前版本产物 `ruoyi-admin.jar` 与 `dist/` | 校验产物 MD5/SHA256 与构建日志 |
| **`DEPLOY_STEP_05`** | **前端静态资源更新** | 清理并覆盖部署:<br>`rm -rf /data2/wzb/deploy/frontend/*`<br>`cp -r build_ui/dist/* /data2/wzb/deploy/frontend/` | 确认 `frontend/index.html` 存在 |
| **`DEPLOY_STEP_06`** | **后端 Jar 包发布** | 将新构建 Jar 拷贝到发布目录:<br>`cp ruoyi-admin.jar /data2/wzb/deploy/backend/` | 确认物理文件更新且大小正常 |
| **`DEPLOY_STEP_07`** | **执行平滑重启调度** | 赋予权限并调用统一调度脚本:<br>`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/*`<br>`/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`**,以避免锁表与元数据不可逆破坏。