fix(pikaoa): 允许终态测试步骤安全重跑

This commit is contained in:
Codex
2026-07-15 04:27:02 +02:00
parent d5f4a4c13b
commit 8ac9267e1b
4 changed files with 181 additions and 22 deletions
@@ -2,7 +2,18 @@
## 结论
已在 PR #2084 完成 NC01 固定 `pikaoa-test` 测试运行面的 YAML-first Secret 初始化闭环和单步 CLI 收口。测试运行面使用 PK01 host PostgreSQL 独立 `pikaoa_test` role/database、固定 NodePort `32080`,不创建专用测试集群、动态 namespace 或 namespace-local PostgreSQL,也未恢复 dedicated 门禁。
已在 PR #2084 完成 NC01 固定 `pikaoa-test` 测试运行面的
- YAML-first Secret 初始化闭环;
- 单步 CLI
- 可重跑异步状态机。
测试运行面边界:
- 使用 PK01 host PostgreSQL 独立 `pikaoa_test` role/database
- 固定使用 NodePort `32080`
- 不创建专用测试集群、动态 namespace 或 namespace-local PostgreSQL
- 不恢复 dedicated 门禁。
## 实现
@@ -18,16 +29,31 @@
- 新增 `--step foundation`
- foundation 不要求 `--commit` 或业务 Secret,只提交带所有权标签的固定 Namespace/PVC
- migration、api、worker、web 和 all 继续要求 commit 与 Secret source
- plan 只投影当前 step 所需对象,并保持 Secret 脱敏
- plan 只投影当前 step 所需对象,并保持 Secret 脱敏
- request identity 包含 target、instance、commit、step 和当前 step 稳定 structural manifest fingerprint
- request fingerprint 继续脱敏 Secret `stringData`,并排除每次渲染变化的 `pikaoa.unidesk.io/expires-at`
- 完全相同 request 返回已有任务;
- 不同 request 遇 queued/running 且 worker 存活时返回 `start-instance-conflict`
- 不同 request 遇终态或 worker-missing 时,原子退役旧有界状态目录并提交新任务;
- `status` 继续读取同一 `target/instance/step` 的最新任务,不引入第二状态库、控制器或租约。
- `docs/reference/pikaoa.md`
- 删除专用测试集群、动态 namespace 和临时 PostgreSQL 旧设计;
- 删除动态 namespace 和临时 PostgreSQL 旧设计;
- 写明 foundation、Secret sync、migration、api、worker、web 顺序;
- 写明终态可重跑、运行中去重和稳定 request fingerprint
- 写明先稳定 CLI,再建设独立 test CI/CD,且不得成为业务阻塞门禁。
## 验证
- `bun --check scripts/src/pikaoa-test-target.ts`:通过。
- `bun test scripts/src/pikaoa-test-target-async.test.ts`2 pass0 fail。
- 异步回归覆盖:
- 同 request 在任务终态后仍返回 `start-already-succeeded`
- 不同 commit 在旧任务运行中返回 `start-instance-conflict`
- 不同 commit 在旧任务终态后重置并重新提交;
- 同 commit 但探针 manifest 变化时重置并重新提交;
-`expires-at` 渲染时间变化时仍识别为同 request;
- worker-missing 时允许安全重置并重新提交;
- foundation 终态后可用新 request 重跑。
- `bun scripts/cli.ts check --syntax-only`11 pass0 fail。
- `pikaoa test-target plan --step foundation`
- `readyForMutation=true`
+19 -1
View File
@@ -89,7 +89,25 @@
- foundation 不需要 `--commit`,也不检查业务 Secret。
- migration、api、worker、web 和 all 必须显式提供 `--commit`。
- 每个 `start` 立即返回任务 ID;使用同一 target、instance 和 step 的 `status` 查询终态。
- 相同任务重复提交只返回已有任务状态,不并行创建第二任务。
- request identity 包含:
- target
- instance
- 产品 commit
- step
- 当前 step 的稳定 structural manifest fingerprint。
- request fingerprint 对 Secret `stringData` 只保留 key 结构和脱敏占位,不包含 Secret 原值。
- request fingerprint 排除 `pikaoa.unidesk.io/expires-at` 等每次渲染变化的易变字段。
- 完全相同 request 重复提交只返回已有任务状态,不并行创建第二任务。
- 不同 request 遇旧任务处于 queued/running 且 worker 存活时返回 `start-instance-conflict`。
- 不同 request 遇旧任务已 succeeded/failed/canceled,或 queued/running 但 worker 明确缺失时:
- 原子退役该 step 的旧有界状态目录;
- 继续使用同一 `target/instance/step` 状态路径提交新任务;
- `status` 只读取该 step 的最新任务。
- foundation 也遵循相同规则。
- foundation 需要显式形成新 request 时,可以:
- 提供新的 `--commit` 修订标识;
- 修改 foundation 的稳定 manifest 结构。
- 不为重跑引入第二状态库、控制器、租约或长期历史存储。
- 迁移、rollout 或运行面查询失败返回具名失败码,不静默进入下一阶段。
- OTel exporter、配置版本和 commit 对齐漂移只产生 `blocking=false` warning,不恢复 dedicated 门禁。