mirror of
https://github.com/whyour/qinglong.git
synced 2026-09-20 16:07:11 +08:00
52 lines
4.9 KiB
Markdown
52 lines
4.9 KiB
Markdown
# ADR-0524:Exact Headless 升级切换链演练
|
||
|
||
- 状态:Accepted(D-426b2b 同源双架构阶段实物已交付)
|
||
- 日期:2026-08-30
|
||
- 决策:D-426b2b
|
||
- 关联:ADR-0520、ADR-0521、ADR-0522、ADR-0523
|
||
|
||
## 上下文
|
||
|
||
ADR-0523 已修正 Apply 后 Adopted Target 的回退基线,但仓库内单元测试不能证明用户下载到的 Docker archive 具备完整控制器能力。阶段产物必须从将要上传的 exact bundle 走通 reviewed stage、Owner 认证、apply、真实 Docker legacy stop、target start/stop 和 clean `rollback_candidate`。
|
||
|
||
短生命周期 Operator 此前不含 Docker client,无法在容器内通过受约束的 Docker socket 执行既有 controller。另一方面,Console 镜像入口是 Local API,而 adopted target 证据当前只接受 `local-application-process@v3/v4`;把 Console fresh journey 标记为已验证切换会形成错误承诺。
|
||
|
||
## 决策
|
||
|
||
1. Operator runtime 增加固定 Alpine 版本的 `docker-cli`,不包含 daemon、Compose、listener、timer 或常驻进程;现有无网络、只读 rootfs、128 MiB、0.5 CPU、32 PID 边界不变。
|
||
2. Trial Kit v8 新增 canonical `upgrade-cutover-rehearsal.sh`,并将其文件摘要绑定到 bundle manifest、offline auditor 与 Local milestone v5。
|
||
3. 脚本仅允许 headless Trial Kit,在全新 rehearsal root 和两个专用合成容器上执行:
|
||
- exact bundle checksum/load/image identity;
|
||
- reviewed SQLite 与 data-directory stage/verify/activation;
|
||
- fresh Owner ceremony、credential presentation、transform/apply/verify;
|
||
- Docker socket 上的 legacy stop、offline image target start/stop;
|
||
- Application v4 post-apply baseline 与最终 `rollback_candidate`。
|
||
4. Legacy root 在 Operator、合成 Legacy 与 target 中均为只读绑定;演练前后主 SQLite SHA-256 必须一致,WAL/journal 不得出现。
|
||
5. 成功后写入私有 `cutover-summary.json`,固定 `status=rollback_candidate`、`legacySource=unchanged`、`target=stopped`;CI 删除两个已停止合成容器后才可上传产物。
|
||
6. Console 继续执行 exact readiness/stage,`legacyUpgradeCutover=not_applicable`。在 target evidence 支持 Local API 入口前,不得将其写成 `passed`。
|
||
|
||
## 产物闭包
|
||
|
||
- `qinglong/alpha-local-trial-kit@v8` / verification v6 / audit v5;
|
||
- `qinglong/alpha-local-milestone@v5` / audit v5;
|
||
- Stage Index v2 只接受新的 Local milestone v5;
|
||
- headless 原生 amd64、arm64 artifact job 必须执行 exact cutover rehearsal;普通源码 CI、模拟 Docker 或单架构结果都不能替代该门。
|
||
|
||
本 ADR 不授权生产 cutover、真实 2.x 容器停机、Legacy restart/rollback 或数据目录替换。新阶段实物只有在同源双架构 artifact 与 milestone 均由成功终态 workflow 闭合后成立。
|
||
|
||
## 验证
|
||
|
||
- back:1657 total / 1655 pass / 2 conditional skip / 0 fail;
|
||
- Local Owner CLI:308 total / 301 pass / 7 conditional skip / 0 fail;
|
||
- Trial Kit、Local milestone、Stage Index 聚焦测试:29/29;
|
||
- package boundary 保持 18 个 workspace package、无 single/shallow package、零 finding;
|
||
- Operator image、milestone workflow、Stage Index workflow auditor 均为 compatible。
|
||
|
||
提交 `79045a0d439074994812d9cd682f933b9e415706` 的显式 Local headless [run 33326143744](https://github.com/whyour/qinglong/actions/runs/33326143744) 已完成 `42 success / 2 expected scope skip / 0 fail`。两个原生架构都从将要上传的 exact Trial Kit 实跑 readiness、reviewed stage、Owner credential presentation、transform/apply、真实 Docker legacy stop、只读 target cutover probe start/stop,并得到 clean `rollback_candidate`;普通 Application 启动命令不能冒充 probe。最终器生成同 run 的 milestone v5,三个 artifact ID 为 amd64 `9736356778`、arm64 `9736354298`、milestone `9736502478`,保留至 2026-09-29。
|
||
|
||
下载后的 milestone 与两个 Trial Kit 已再次用仓库离线 auditor 审计,三者均返回 `compatible=true`。Docker archive 为 amd64 `226122240` bytes / `sha256:1e1c5c83fd2c39b3bbe7b194113998a96cbe810e69d34858c3f40d2638837c60`,arm64 `221521920` bytes / `sha256:dcec37f65382d7d8c06f448780878ec2474e45d6e64b2febb764b1836898d2d6`;两个 verification v6 都把 `legacyUpgradeReadiness`、`legacyUpgradeStage`、`legacyUpgradeCutover` 标记为 `passed`。同 run 的跨架构资源证据还在 128 MiB、0.5 CPU、64 PID 的 CI stress envelope 下记录 x64 `77967360` bytes、arm64 `72581120` bytes peak,并明确该数据不是固定物理设备最低配置承诺。
|
||
|
||
## 后续
|
||
|
||
D-426b2c 已由 ADR-0525 实现为 Console Local API 外层入口与 Application 内层配置的双重证据,且保持 headless 既有 command/journal shape;同源 exact Console 双架构 artifact 与 milestone 已由成功终态 CI 交付并完成下载后离线审计。D-426c 继续处理 target 写入后的 capture、review、reconciliation 与恢复,不得削弱 headless 已闭合的离线镜像和回退基线。
|