交付门禁实验(U63)
单模块 Maven 工程(Boot 4.0.9 parent/BOM,JDK 21),直连本机 DBngin MySQL 8.4.7(127.0.0.1:3306,root 空密码)。回答一个组合问题:测试分层、迁移、凭据、制品与备份各自在哪道门禁上失败,失败了怎么修。
从仓库根运行完整公开入口:
python3 labs/delivery-gate/run.py需要 JDK 21(/usr/libexec/java_home -v 21 或 JAVA_HOME)、Maven 3.9.9、Python 3、本机 MySQL 客户端(默认 /Users/Shared/DBngin/mysql/8.4.7_arm64/bin,可用 U63_MYSQL_BIN 覆盖)。入口不启动/停止任何外部服务;每个阶段只创建并 DROP 自己的 u63_* 一次性库(uuid 后缀),结束前用 SHOW DATABASES 断言无遗留。原始日志在 ~/.cache/software-engineering-study/java-depth-impl/u63/runtime/<run>/,短产物为 evidence/u63-2026-10-28.json。
流水线阶段与失败注入
| 阶段 | 命令 | 证明什么 |
|---|---|---|
| build | mvn clean package -DskipTests | 可重复构建产物存在 |
| unit | -Dtest=UnitLedgerServiceTest | mock 只证明交互契约(负金额在 mock 下也会“通过”) |
| integration | -Dtest=MigrationTest | 真实 MySQL 上的历史表、校验和、CHECK 约束、失败迁移修复 |
| contract | -Dtest=ContractHttpTest | 真实随机端口 HTTP 响应对照消费者契约;缺字段负例 |
| credential | -Dtest=CredentialGateTest | 缺 token 启动失败;补 token 启动并迁移 |
| migration-seed | -Dtest=MigrationGateTest#seed | 迁移工作副本首次落库 |
| tamper-V2 | 流水线改动 V2 文件 | 注入校验和漂移(真实门禁失败) |
| migration-gate | -Dtest=MigrationGateTest#gate,期望退出 1 | Flyway validate 拒绝漂移,门禁阻断 |
| repair-V2 | 还原 V2 | 修复动作本身可核验 |
| 重跑 | attempt 2 从 build 重新执行全部阶段 | 修复后门禁恢复 |
attempt 1 在 migration-gate 阻断(记录 blockedAt),还原 V2 后 attempt 2 整条流水线重跑全绿。阻断不是脚本判红,而是 Maven 里 Flyway 校验和异常的真实退出码 1。 每次尝试的阶段日志带 attempt1-/attempt2- 前缀,互不覆盖。
制品、冒烟与可重复构建在流水线之后作为独立阶段执行(见下节),不属于上述阶段序列;凭据两态由 CredentialGateTest 的两个测试证明,不是流水线阻断点。
制品与回滚
-Dlab.release=1.0.0/2.0.0构建两个修订版 jar;application.properties的delivery.release.version=@lab.release@由 Maven 资源过滤注入。- 同版本重建两次,SHA-256 必须一致(可重复构建;
project.build.outputTimestamp固定条目时间)。 - 2.0.0 的
/api/v1/about返回capabilities: [ledger, batch-ledger];回滚到 1.0.0 后消失——回滚证据是行为差异,不是文件被覆盖。 - 缺
DELIVERY_RELEASE_TOKEN时真实 jar 进程启动失败(绑定校验),不进入监听。
备份与恢复
部署库插入 3 行账目 → mysqldump --single-transaction → DROP TABLE(模拟数据丢失,SHOW TABLES 为空)→ mysql < backup.sql → 行数与 SUM(amount_cents) 与备份前一致。只证明逻辑备份的可恢复性;增量、binlog PITR、异地副本与 RTO/RPO 演练未运行。
未运行
Docker/Testcontainers(用户未授权 Docker)、真实 CI 平台与制品仓库、签名/SLSA、生产备份体系、蓝绿/金丝雀、Kubernetes 迁移 Job、生产凭据托管、Maven 多模块与 Gradle(归 U62)。详见 evidence 的 limits 字段。