129 lines
7.6 KiB
Markdown
129 lines
7.6 KiB
Markdown
# SYFJGYD 学员管理系统 — Java 21 / Spring Boot 4 隔离 QA 运行手册
|
||
|
||
本手册仅对应 `boot4-iot-fusion-archive` 的 `fix/iot-safety-hardening` 本地候选版本。
|
||
原 RailwaySystem 和历史实验工程只读;不执行 Push、Merge、共享部署或硬件操作。
|
||
|
||
## 当前验收边界
|
||
|
||
Round 5V-3 已成功接管SSH管理入口,完成匹配V9原生一致性备份及归档完整读取。
|
||
005授权有效,但独立恢复环境尚未确认或获准创建,当前状态为
|
||
`MIGRATION_AUTHORIZED_BLOCKED_ISOLATED_RESTORE`,005未执行。
|
||
不能将 H2/替身测试、构建成功或登录页显示称为
|
||
Kingbase 事务/浏览器业务闭环验收。真实硬件验收始终未进行。
|
||
迁移前置、失败回滚和核验清单见 [迁移计划](docs/iot/ROUND5V_KINGBASE_MIGRATION_PLAN.md)。
|
||
**不要执行 qa-bootstrap 全量初始化、清空测试数据、重建库、重置已有账号或序列。**
|
||
|
||
## 1. 构建前提
|
||
|
||
- Java 21(本机验证 21.0.2)、Maven 3.9.x;全部模块统一 release 21。
|
||
- Node 22.23.2、npm 10.9.8(`build_ui/.nvmrc` / packageManager / lockfile)。
|
||
- Python 3.9+、本机 `redis-server`(新实例只监听 loopback 的独立端口)。
|
||
- 合法取得当前商业 JDBC 9.0.0;不向 Git 或公共 Maven 上传二进制。
|
||
|
||
从本工作树根目录执行(路径以实际 checkout 为准,不引用 RuoYi-Vue-master):
|
||
|
||
```bash
|
||
java -version
|
||
mvn -version
|
||
export KINGBASE_JDBC_JAR='/absolute/path/to/authorized/kingbase8-9.0.0.jar'
|
||
bash scripts/bootstrap/install-kingbase-jdbc.sh
|
||
bash scripts/bootstrap/check-kingbase-jdbc.sh
|
||
mvn -B -f RuoYi-Vue/pom.xml -pl ruoyi-admin -am '-Dtest=Round5s*,Round5vAccommodationAtomicityTest,RealIotSecurityGateTest,FaceExtractClientMockTest,CommandRespHandlerMockTest,DmsHttpClientTest,DmsTokenManagerTest,TrainIotLockAuthBridgeMockTest' -Dsurefire.failIfNoSpecifiedTests=false package
|
||
python3 -m unittest discover -s scripts/qa -p test_qa_tools.py -v
|
||
```
|
||
|
||
驱动私有坐标:`cn.com.kingbase:kingbase8:9.0.0`;SHA256:
|
||
`e439bd1c48ce654748c4f333b874a61465702ceb18f29ee017c3f9bc47738c23`。
|
||
安装脚本先校验供应商文件,再用固定版本 Maven install plugin 安装到本机私有仓库。
|
||
`ruoyi-admin/lib` 不再是构建依赖来源。CI 由管理员合规预置同一私有依赖,缺失即失败。
|
||
|
||
```bash
|
||
cd build_ui
|
||
node --version
|
||
npm --version
|
||
npm ci --ignore-scripts --no-audit --no-fund
|
||
npm run build:prod
|
||
cd ..
|
||
```
|
||
|
||
不得用实验工程/node_modules1/node_modules2、服务器 symlink 或临时依赖目录替代
|
||
lockfile 安装。Quill 2 的转译配置与实验工程一致。Vue 2/CLI 4 的废弃依赖及旧版
|
||
node-ipc engine/ESLint peer 警告仍存在:本轮不做整套前端框架迁移,不声称无漏洞。
|
||
|
||
## 2. 凭据和只读身份检查
|
||
|
||
将 `qa-bootstrap/round5v.env.example` 的键名交给管理员,在 Git 外受保护文件中
|
||
填写真实 QA 配置并设置 owner-only 权限 0600。不要把密码放命令行、截图或报告。
|
||
脚本也兼容本机已有 `~/.railwaysystem-qa.env` 中的 `FUSION_QA_APP_PASSWORD` 和
|
||
身份加密键,但**不会复用其中可能指向旧库的 QA_DB_URL**。
|
||
|
||
```bash
|
||
python3 scripts/qa/qa.py inspect --config /protected/round5v.env
|
||
python3 scripts/qa/qa.py snapshot --config /protected/round5v.env
|
||
python3 scripts/qa/qa.py verify-snapshot --snapshot-dir .qa-runtime/snapshot-REPLACE_WITH_ACTUAL_ID
|
||
```
|
||
|
||
固定目标:`railwaysystem_fusion_qa_20261013`;固定运行账号:`fusion_qa_app`。
|
||
检查使用只读 repeatable-read 事务并 rollback,记录版本、schema、列、索引和计数;
|
||
不打印业务行。快照含两张受影响表的敏感内容,仅存 `.qa-runtime/`(目录0700,
|
||
数据0600);其 XML 解析和 SHA 验证不等同于原生全库备份或数据库恢复演练。
|
||
服务器现有kingbase容器的 `/home/kingbase/install/kingbase/bin/` 已确认具备
|
||
V009R003C018原生工具;现有kingbase管理角色可经容器本地连接认证,不需要给
|
||
fusion_qa_app提权。已完成原生备份,服务器及本机副本均在非Git目录,目录0700、文件0600。
|
||
最新位置、SHA及独立恢复解阻方案见 [本轮记录](docs/iot/ROUND5V3_SERVER_BACKUP.md)。
|
||
`sys_restore --file=/dev/null`成功仅证明归档可完整读取,不能替代实际数据库恢复。
|
||
本机Docker守护进程不可用;服务器只确认一个共享V9实例,旧V8目录不是获准的
|
||
兼容恢复环境。需提供已有独立恢复目标,或明确另行批准隔离容器/实例及恢复库。
|
||
不要自行创建数据库、启动新容器或复用共享库进行覆盖恢复。
|
||
|
||
## 3. 启停隔离 QA(迁移批准并完成后)
|
||
|
||
```bash
|
||
python3 scripts/qa/qa.py start --config /protected/round5v.env
|
||
python3 scripts/qa/qa.py frontend
|
||
```
|
||
|
||
默认端口:后端18096、前端18088、独立 Redis16389,仅监听127.0.0.1;端口占用即
|
||
失败,不杀旧进程、不改共享 Redis。启动器先确认目标数据库和16列/4索引存在,
|
||
缺迁移拒绝启动;列/索引的完整定义仍须按迁移计划人工核验。PID 输出不代表就绪。
|
||
|
||
安全值强制为 MQTT Mock=true / enabled=false / real-device-write-enabled=false /
|
||
whitelist空 / protocol-verified=false / retry-task-enabled=false;人脸 HTTP关闭;
|
||
OpenAPI、QA危险接口、Druid控制台和Quartz自动启动关闭;旧DMS关闭。
|
||
继承环境中的 Spring/IoT/DMS/JVM 注入覆盖被过滤,数据库 URL/账号由命令行固定。
|
||
JWT和独立Redis密钥由安全随机数首次生成至 `.qa-runtime/runtime-secrets.env`,0600,
|
||
以进程环境注入,不写源码/命令行;数据库及身份密钥仅取受保护配置文件。
|
||
不得为演示去打开真实门禁或危险接口。
|
||
|
||
```bash
|
||
curl --noproxy '*' --fail http://127.0.0.1:18096/captchaImage
|
||
# 真实 Chrome 访问 http://127.0.0.1:18088 ,使用管理员单独提供的 QA 账号。
|
||
python3 scripts/qa/qa.py stop
|
||
```
|
||
|
||
stop只处理本脚本账本中且进程命令身份仍匹配的PID;不会清端口、杀其他Chrome、
|
||
停止实验工程或修改系统网络。JWT、访问日志、快照、浏览器证据均不进入Git。
|
||
|
||
## 4. 迁移后验收清单(未完成项不得标 PASS)
|
||
|
||
1. 管理员真实登录、getInfo/getRouters、原品牌菜单和首页图表;培训核心查询。
|
||
2. IoT九页:group/gateway/device/face/auth/command/accesslog/mqttlog/config,
|
||
必须验证组件渲染及实际QA查询,不能把SPA fallback HTTP200当作无404证明。
|
||
3. 为本轮创建可追踪的合成业务样本,不复用/覆盖既有培训测试记录:报名、
|
||
住宿预分配、入住、调宿、退宿、授权意图与`iotlocks.lock_command`流水。
|
||
4. 用实际Kingbase Mapper/Service/事务管理器覆盖迁移计划中的崩溃、并发、晚到ACK、
|
||
提交/回滚场景;外部MQTT和人脸只能是可控替身。危险Mock HTTP端点保持关闭,
|
||
ACK由隔离的Service测试驱动,不通过开放生产式控制接口来换取通过。
|
||
5. 受控Mock ACK成功只能证明软件闭环,不能证明真实门锁已授权或撤权。
|
||
|
||
现有 `Round5sExecutionIntegrationTest` 的文件型H2证据不是第4项的替代品;
|
||
`Round5vAccommodationAtomicityTest`证明异常传播/事务声明,不证明Kingbase回滚。
|
||
|
||
## 5. CI与当前阻塞
|
||
|
||
`.gitlab-ci.yml` 已改为显式web+RUN_FUSION_VALIDATION=true才允许的验证流水线;
|
||
Java21、私有JDBC预检及npm ci,**无部署job**。本轮未Push,也未触发/验证远程Runner。
|
||
005授权、原生备份及既有管理连接均已确认;当前仍缺实际独立恢复证明、真实Kingbase生命周期验证和
|
||
依托新QA后端的完整Chrome验收。迁移安全前提未满足时,单独前端会明确返回502,
|
||
不得用旧实验后端或伪造API响应冒充新版本验收。
|