Merge pull request #2213 from pikasTech/fix/2205-public-edge-single-authority
Pipelines as Code CI / hwlab-web-probe-sentinel-nc01- Success
Pipelines as Code CI / platform-infra-gitea-nc01- Failed
Pipelines as Code CI / unidesk-host- Success

feat: 接入 NC01 shared public-edge 单链自动交付
This commit is contained in:
Lyon
2026-07-15 22:15:27 +08:00
committed by GitHub
9 changed files with 773 additions and 22 deletions
@@ -0,0 +1,150 @@
# R9.5.1.1 任务报告
## 任务定位
- MDTODO`R9.5.1.1`
- IssueUniDesk `#2205`
- Target`NC01`
- targetWorkspace
`/root/unidesk/.worktree/2205-public-edge-single-authority`
- 分支:`fix/2205-public-edge-single-authority`
- 最新基线:`origin/master``76511eabfb291c95a03d3aa150fa51ab404fa6f9`
- 主要实现 commit`1b423f2b9b178fc89dc6eef17b717c3294ea0c4b`
- Pull RequestUniDesk `#2213`
- 当前状态:`completed`;主代理复审已通过,Secret bootstrap 已受控完成,
等待正常 PR merge 自动交付。
- 子代理交付边界:只创建 PR,不合并;主代理按受控路径完成 Secret sync 与
guarded merge。
- 禁止人工 PipelineRun、Argo sync 或运行面终态 apply。
## 实现结果
- `config/platform-infra/public-edge.yaml` 继续作为 shared public-edge 唯一真相:
- 新增现有 `platform-infra-gitea-nc01` PaC 的自动触发归属;
- 声明 source commit 环境变量、受控 trans SecretRef、NC01 host cwd
- 声明 commit archive 根目录、archive 内 helper 与 source path 集合;
- 未复制 hostname、upstream、Caddyfile 或 Compose 渲染逻辑。
- `config/secrets-distribution.yaml` 新增 `public-edge-delivery-nc01` scope
- sourceRef 为 `unidesk-host-k8s.env`
- sourceKey 与 targetKey 均为 `UNIDESK_SSH_CLIENT_TOKEN`
- 目标是 `devops-infra/public-edge-trans`
- 仅披露 presence、key、fingerprint 与摘要,不披露 Secret 值。
- `.tekton/platform-infra-gitea-nc01-pac.yaml` 在现有 immutable checkout 后新增步骤:
- 再次校验 checkout `HEAD` 等于 `SOURCE_COMMIT`
- 通过 Kubernetes SecretRef 注入受控 trans token
- 调用 checkout 内版本化 archive delivery helper
- 未增加 PipelineRun、Argo Hook、Job、hostPath、Docker socket 或特权 Pod。
- `scripts/native/cicd/deliver-platform-infra-public-edge.mjs`
- 读取 owning YAML 与 secrets-distribution 引用图;
- 校验 source checkout、source commit、sourceRef、sourceKey 与 targetKey
- 只从该 commit 生成 `config``scripts``package.json``bun.lock` archive
- 计算 SHA-256,并由 checkout 内 `scripts/trans` 上传和执行;
- 仅在 host-local apply 返回 `mutation=true` 后报告成功。
- `scripts/native/cicd/apply-platform-infra-public-edge-archive.mjs`
- 校验 archive source commit marker
- 从 archive checkout 调用既有
`platform-infra public-edge apply --target NC01 --confirm`
- 不包含 Caddyfile 生成、安装、reload、探测或 rollback 的第二实现。
## 单一控制链证明
终态链固定为:
1. GitHub `master` merge
2. 现有 `platform-infra-gitea-nc01` PaC immutable checkout
3. `config/platform-infra/public-edge.yaml` 的 delivery 与 SecretRef 声明;
4. `config/secrets-distribution.yaml` 的 sourceRef/targetKey 投影;
5. checkout 内版本化 `scripts/trans`
6. NC01 host-local commit archive helper
7. 同 archive 的既有 `platform-infra public-edge apply`
8. 候选校验与原子安装后,通过同一 Compose 强制重建唯一
`pikaoa-edge`
9. 只有安装或唯一 edge 重建失败时恢复旧文件并再次重建,站点探测失败
仅输出 `blocking=false` warning。
不存在以下第二路径:
- Argo `PostSync``Sync` Hook 或 Kubernetes Job
- hostPath、Caddy Admin API 直写或直接修改 Caddyfile
- 第二 renderer、第二 apply、第二 Caddy、fallback listener
- Docker socket、Docker daemon API、`docker exec` 或特权 Pod
- PK01 变更或人工终态交付。
## 审核局部返工
- 删除安装新 Caddyfile 后的 `docker exec ... caddy reload`
- 单文件 bind mount 经原子 `mv` 后,旧容器仍引用旧 inode
- 改为
`docker compose ... up -d --no-build --no-deps --force-recreate caddy`
- 只重建 Compose 中现有 `caddy` 服务,继续复用同一 host listener、
workDir、data/config 目录和唯一 `pikaoa-edge` 容器名。
- 回滚恢复旧 Compose 与 Caddyfile 后,也通过同一 Compose 重建唯一 edge
不再对旧 inode 执行 reload。
- site/upstream probe 与配置安装分层:
- probe 失败不进入 rollback 条件;
- apply 保持 `ok=true``mutation=true`
- 每个失败站点输出包含 hostname/path 的结构化
`site-probe-failed``level=warning``blocking=false` 记录。
- MDTODO `R9.5.1.1` 保持 `in_progress`,等待 PR 复审与正常自动链收口。
## Target 原入口证据
以下证据全部在指定 Target workspace 通过 `trans` 执行:
- `node --check`
- `deliver-platform-infra-public-edge.mjs` 通过;
- `apply-platform-infra-public-edge-archive.mjs` 通过。
- `bun test scripts/native/cicd/deliver-platform-infra-public-edge.test.ts`
- `4 pass`
- 覆盖 YAML delivery plan、PaC 禁止项、SecretRef 绑定;
- fake-trans confirm 实际生成 commit archive 并执行三段受控调用;
- 未连接 Target 运行面。
- 生成后的 host-local apply shell 隔离执行:
- 模拟 `lab.hwpod.com` probe 失败时,命令退出码为 `0`
- `mutation=true`warning 为 `site-probe-failed`
`blocking=false`
- `rollback.attempted=false`,只执行一次唯一 edge force-recreate
- 模拟首次 force-recreate 失败时,命令退出码非零且
`failurePhase=recreate`
- 旧 Compose/Caddyfile 完整恢复,rollback 使用同一 Compose 再次重建,
`rollback.exitCode=0`
- `platform-infra public-edge plan --target NC01`
- `mutation=false`
- 七站全部解析;
- `unresolved=[]`
- UDP `443` 保持;
- Caddyfile fingerprint 为
`sha256:a998c3d5c3a409883a7dc62e121f7e8210998af686c0b9c34aa456035494ff67`
- `platform-infra public-edge apply --target NC01 --dry-run`
- `mutation=false`
- 七站与 fingerprint 和 plan 一致。
- Secret 分发 plan
- 命令为
`secrets plan --config config/secrets-distribution.yaml --scope public-edge-delivery`
- `mutation=false`
- sourceRef 存在且 owner-only mode 为 `0600`
- `UNIDESK_SSH_CLIENT_TOKEN` 无缺失;
- desired Secret 为 `devops-infra/public-edge-trans`
- `valuesPrinted=false`
- `git diff --check`:通过。
- 未运行 Vitest 或重型构建。
## Primary Workspace 边界
- primary workspace 仅用于加载 resource bundle skills、调用 `trans` wrapper、
使用 `unidesk-gh` 读取和评论 Issue。
- primary workspace 未修改目标源码,未执行目标测试,未冒充 Target 原入口证据。
## 未执行事项
- 未执行 `secrets sync`
- 未触发或创建 PipelineRun。
- 未执行 Argo refresh、sync 或 runtime patch。
- 未执行 `platform-infra public-edge apply --confirm`
- 未修改 PK01 任意配置、Secret、路由或运行面。
- PR 合并与 merge 后自动链观察由主代理审核后完成。
## 回链
- MDTODO`R9.5.1.1`
- Issue`#2205`
@@ -150,7 +150,7 @@
#### R9.5.1 [in_progress]
重建 [UniDesk #2205](https://github.com/pikasTech/unidesk/issues/2205):从最新 master 以全新 worktree/session 实现 NC01 shared public-edge 的 merge 驱动自动交付,复用同一 renderer/apply 与 owning YAML/source commit;禁止复用旧 docker.sock 工件,禁止 Kubernetes 挂载 Docker socket/daemon、第二 edge/authority、人工交付、PK01和Vitest,合并后只由正常自动链收敛,完成任务后将详细报告写入[任务报告](./details/pr-merge-driven-automatic-delivery/R9.5.1_Task_Report.md)。
##### R9.5.1.1 [in_progress]
##### R9.5.1.1 [completed]
重做 [UniDesk #2205](https://github.com/pikasTech/unidesk/issues/2205) 的单一 shared public-edge 自动交付链:仅允许 immutable PaC checkout → YAML SecretRef → 受控 trans → NC01 host-local 既有 public-edge renderer/apply;禁止 Argo PostSync、hostPath、Caddy Admin API 直写、Docker socket/daemon、第二 authority/fallback、PK01、Vitest和人工终态交付;必须使用最新 master 的全新 worktree 与全新 Artificer session,合并后只由自动 CI/CD 收敛,完成任务后将详细报告写入[任务报告](./details/pr-merge-driven-automatic-delivery/R9.5.1.1_Task_Report.md)。
### R9.6 [completed]