feat: support env reuse and git mirror in v0.1 cicd

This commit is contained in:
Codex
2026-06-02 00:52:19 +08:00
parent f34312c424
commit df38f605fa
11 changed files with 365 additions and 79 deletions
+26 -11
View File
@@ -9,6 +9,8 @@
- `v0.1` 只能部署到 `agentrun-v01` namespace`v0.2``v0.3` 后续使用自己的 namespace 和 GitOps 路径。
- CI/CD 必须使用 G14 原生 k3s、纯 Tekton Pipeline/Task/PipelineRun 和 Argo CD;不得引入自定义 runner、CI.json runner、长期自研 poller/reconciler、D601 legacy、临时 clone、手工 Pod patch 或本地镜像作为发布真相。
- `v0.1` 的 CD 唯一手写真相源是 source branch 内的 `deploy/deploy.json`Tekton 生成的 artifact catalog 和 Argo desired state 必须与 source branch 分离,只写入 `v0.1-gitops`
- Source checkout 与 GitOps promotion 必须优先走 `devops-infra` git mirror/relayPipeline 不直接依赖 GitHub SSH fetch/push。
- Runtime image 采用 env reuse:依赖、Bun/Node、系统包、lockfile、Containerfile 和 boot 脚本构成 env identity;普通 TS/文档/CLI 业务源码变更只改变 boot commit,不重建 env image。
- 发布证据以 live runtime、Argo desired state、GitOps branch、Tekton 证据和干净 source worktree 顺序判断。
## 固定命名
@@ -21,12 +23,17 @@
| Worktree root | `G14:/root/agentrun-v01/.worktree/{task}` |
| Runtime namespace | `agentrun-v01` |
| GitOps branch | `v0.1-gitops` |
| Git mirror read URL | `http://git-mirror-http.devops-infra.svc.cluster.local/pikasTech/agentrun.git` |
| Git mirror write URL | `http://git-mirror-write.devops-infra.svc.cluster.local/pikasTech/agentrun.git` |
| Git mirror cache | `devops-infra:/cache/pikasTech/agentrun.git` |
| Artifact catalog | `v0.1-gitops:deploy/artifact-catalog.v01.json` |
| Runtime path | `v0.1-gitops:deploy/gitops/g14/runtime-v01` |
| Tekton namespace | `agentrun-ci` |
| Tekton Pipeline | `agentrun-v01-ci-image-publish` |
| Tekton ServiceAccount | `agentrun-v01-tekton-runner` |
| PipelineRun prefix | `agentrun-v01-ci-<short12>` |
| Env image repository | `127.0.0.1:5000/agentrun/agentrun-mgr-env:<envIdentity>` |
| Boot script | `deploy/runtime/boot/agentrun-boot.sh` |
| Argo CD AppProject | `argocd/agentrun-v01` |
| Argo CD Application | `argocd/agentrun-g14-v01` |
@@ -45,7 +52,9 @@ CI 的最小检查应覆盖:
- Bun/TS 单元自测试,包括 manager schema、adapter mock、Codex fake app-server stdio client 和 CLI JSON 输出。
- `deploy/deploy.json` 与 GitOps render 只读校验。
容器镜像可以直接运行 TS 入口,也可以运行同一 source commit 构建出的 JS artifact;无论选择哪种形式,artifact catalog 必须记录完整 source commit 和 image digest。CI/CD 仍然只允许纯 Tekton + Argo CD,不因 Bun 工具链引入自定义 runner、长期 poller 或源分支生成物提交。
容器镜像必须区分 env identity 与 source commit。`agentrun-mgr-env:<envIdentity>` 只包含 Bun runtime、生产依赖、Codex CLI、git/kubectl/node 等系统依赖和 boot 脚本,不 bake `src/``scripts/` 或某个业务 source commit。运行时通过 `AGENTRUN_BOOT_COMMIT` 从 git mirror 按完整 SHA 做 `git fetch --depth=1 origin <sha>`,再用 env image 内的 `node_modules` 启动 manager 或 runner。CI/CD 仍然只允许纯 Tekton + Argo CD,不因 Bun 工具链引入自定义 runner、长期 poller 或源分支生成物提交。
Env identity 的输入至少包含:Bun base image、系统包列表、`deploy/container/Containerfile``deploy/runtime/boot/*.sh``package.json``bun.lock``tsconfig.json`。只改业务 TS、文档、模板中不影响 runtime env 的内容时,planner 必须输出 `build=0 reuse=1 unsafeReuse=0`,并复用上一版 catalog 中同一 `envIdentity` 的 digest。
## 真相源
@@ -54,9 +63,11 @@ CI 的最小检查应覆盖:
1. Live runtime`agentrun-v01` namespace 中 Deployment/Job/Pod ready、事件、日志和 service health。
2. Argo desired state`argocd/agentrun-g14-v01` 的 revision、sync、health、source branch 和 runtime path。
3. GitOps branch`v0.1-gitops` 中的 `deploy/artifact-catalog.v01.json``deploy/gitops/g14/runtime-v01/**`
4. Tekton 执行证据:PipelineRun、TaskRun result、image digest 和 promotion 终态。
4. Tekton 执行证据:PipelineRun、TaskRun result、env identity、build/reuse summary、image digest 和 promotion 终态。
5. 干净 source worktree`G14:/root/agentrun-v01``origin/v0.1`、render 脚本、deploy intent 和 `--no-write` 输出。
`devops-infra` git mirror 是 CI/CD source 与 GitOps relay,不是新的 source truth。source truth 仍是 GitHub `v0.1`GitOps truth 仍是 `v0.1-gitops`mirror 只负责降低 Pipeline 中的外网 fetch/push 抖动,并让 exact commit fetch 可在集群内稳定命中。受控入口是 UniDesk CLI`agentrun v01 git-mirror status|sync|flush``status` 必须展示 `localV01``githubV01``localGitops``githubGitops``pendingFlush` 和 exact full-SHA fetch 结果;`trigger-current` 在创建 PipelineRun 前必须先检查 `localV01`,必要时同步 mirror,再继续。
`master` 记忆、`/root/agentrun` 历史固定目录、`agentrun_dev``agentrun_prod`、D601 legacy 路径、临时 worktree 或本地容器只能作为线索,不能作为 `v0.1` 发布通过证据。
## Source 与 GitOps 分层
@@ -76,7 +87,7 @@ CI 的最小检查应覆盖:
`v0.1-gitops` branch 必须包含:
- `deploy/artifact-catalog.v01.json`,记录 image tag、digest、source commit、service identity、publish/reuse 状态。
- `deploy/artifact-catalog.v01.json`,记录 env image tag、digest、source commit、env identity、service identity、build/reuse 状态和 provenance
- `deploy/gitops/g14/runtime-v01/**`,作为 Argo CD 消费的 desired state。
- 必要 generated metadata,但不得包含 Secret 值。
@@ -107,11 +118,11 @@ Tekton promotion 可以读取 `deploy/deploy.json` 来 render runtime desired st
标准链路如下:
1. 人工或受控 GitHub/UniDesk 入口为某个 `origin/v0.1` source commit 创建 Tekton `PipelineRun`;触发器可以是 Tekton Triggers 或手动 `PipelineRun`,但不能是长期自定义 runner。
2. `prepare-source` checkout `v0.1` source,并从 `v0.1-gitops` 读取上一版 `deploy/artifact-catalog.v01.json`
2. `prepare-source` 通过 git mirror read URL 按完整 SHA checkout `v0.1` source,不使用 branch tip 近似 checkout
3. 原语校验 task 只覆盖文档治理、spec 链接、`deploy/deploy.json` schema、轻量语法和必要单元测试;旧 `dev/prod` gate 不进入 lane。
4. Plan task 读取 `deploy/deploy.json` 与上一版 artifact catalog判断 affected/reused servicesplanner 只能输出 TaskRun result 或临时 workspace 文件,不回写 source。
5. Affected service 通过 Tekton Task 内的 BuildKit/kaniko/buildah 之一发布到 G14 本地 registryreused service 复用 catalog digest。不得使用 Docker daemon、DIND 或仓库外自定义 runner。
6. Promotion task 用 publish results 刷新 `deploy/artifact-catalog.v01.json`,并用 `deploy/deploy.json` render `deploy/gitops/g14/runtime-v01/**`,只推送到 `v0.1-gitops`
4. Plan task 通过 git mirror read URL 读取上一版 `v0.1-gitops:deploy/artifact-catalog.v01.json`,计算 `envIdentity`判断 affected/reused servicesplanner 只能输出 TaskRun result 或临时 workspace 文件,不回写 source。
5. Affected env image 通过 Tekton Task 内的 BuildKit 发布到 G14 本地 registryreused service 直接复用 catalog digest。不得使用 Docker daemon、DIND 或仓库外自定义 runner。
6. Promotion task 用 publish/reuse results 刷新 `deploy/artifact-catalog.v01.json`,并用 `deploy/deploy.json` render `deploy/gitops/g14/runtime-v01/**`,只通过 git mirror write URL 推送到本地 `v0.1-gitops` relay。发布收口再用 `agentrun v01 git-mirror flush --confirm` 把 GitOps branch 快进回 GitHub
7. Argo CD Application `agentrun-g14-v01``v0.1-gitops:deploy/gitops/g14/runtime-v01` 同步到 `agentrun-v01`
8. 验收只观察 `agentrun-v01` runtime、Argo revision/sync/health 和对应 service health。
@@ -119,10 +130,10 @@ Tekton promotion 可以读取 `deploy/deploy.json` 来 render runtime desired st
镜像身份同时是 RuntimeAssembly 的 `BackendImageRef` 来源;四要素总模型见 [spec-v01-runtime-assembly.md](spec-v01-runtime-assembly.md)。本文只定义 image digest、artifact catalog 和 GitOps promotion 边界,不定义 profile、session 或 resource bundle 字段。
- `v0.1` 镜像 tag 使用完整 40 位 source commitId
- `v0.1` env image tag 使用 `envIdentity`,而不是 source commitId。source commitId 通过 `AGENTRUN_BOOT_COMMIT` 和 catalog `bootCommit` 进入 runtime
- Runtime manifest 必须使用 digest pin 作为部署身份;G14 本地 registry 对同一 tag 的默认 HEAD 可能返回 Docker schema1 compatibility digestTekton 必须用 `Accept: application/vnd.docker.distribution.manifest.v2+json` 采集 containerd 可直接拉取的 schema2 manifest digest,并在写入 catalog 前按 digest HEAD 验证。
- Catalog 必须记录 lane、source branch、GitOps branch、source commitId、serviceId、image tag、digest、component identity 和 publish/reuse 状态。
- 同一 source commit 对同一 service 应生成同一镜像;lane 差异放在 manifest、env、SecretRef、namespace、RBAC 和 runtime config 中,不 bake 进镜像。
- Catalog 必须记录 lane、source branch、GitOps branch、source commitId、serviceId、env image tag、digest、env identity、boot commit、toolchain inputs 和 build/reuse 状态。
- 同一 env identity 对同一 service 应生成同一镜像;lane 差异放在 manifest、env、SecretRef、namespace、RBAC 和 runtime config 中,不 bake 进镜像。普通 source commit 差异由 boot checkout 选择。
- `deploy/deploy.json` 只承载人写 runtime intent,不承载 digest、publish state 或 reuse evidence。
- Source branch 不得因为 promotion 出现自动提交;若发布后 source branch 变化,必须是人工修改源码、测试、文档、模板或 `deploy/deploy.json`
@@ -152,7 +163,9 @@ Tekton promotion 可以读取 `deploy/deploy.json` 来 render runtime desired st
- `v0.1-gitops` branch 和 `deploy/gitops/g14/runtime-v01` 成为 Argo desired state 来源。
- `deploy/deploy.json` 是 CD 唯一手写真相源;source branch 不跟踪 artifact catalog、runtime generated manifests、digest 或 publish state。
- Tekton/Argo 路径不包含自定义 runner、CI.json runner、长期自研 poller 或 control-plane reconciler。
- Runtime manifest 使用 digest pincatalog 记录完整 source commit 与 digest。
- Runtime manifest 使用 digest pincatalog 记录完整 source commit、env identity、build/reuse summary 与 digest。
- `agentrun v01 git-mirror status``sourceInSync=true``exactFetch.localV01=true`,并能用 mirror 对当前 full SHA 执行 shallow fetch。
- 小的业务源码变更完成后,PipelineRun `planArtifacts.summary` 应为 `build=0 reuse=1 unsafeReuse=0``image-publish` task result `status=reused`,且不出现新的 env image build。
- 发布完成后可通过 `G14:k3s` 读取 `agentrun-v01` Pod ready、service health 和对应 image digest。
## 规格的实现情况
@@ -164,4 +177,6 @@ Tekton promotion 可以读取 `deploy/deploy.json` 来 render runtime desired st
| `agentrun-v01` namespace | 已实现/已通过主闭环 | GitOps lane 已同步 manager、Postgres、ServiceAccount、SecretRef 和 runner Job 所需对象;发布前仍按 [spec-v01-validation.md](spec-v01-validation.md) 手动复验。 |
| `v0.1-gitops` branch | 已实现 | Tekton promotion 生成 artifact catalog 与 runtime desired stateArgo 从 `deploy/gitops/g14/runtime-v01` 同步。 |
| 纯 Tekton/Argo lane | 已实现/已通过主闭环 | `agentrun-ci` Pipeline、BuildKit 镜像发布、GitOps promotion 和 Argo Application 已形成闭环;不得回退到自定义 runner 或 dev/prod。 |
| git mirror/relay | 已实现 | UniDesk `agentrun v01 git-mirror status|sync|flush` 管理 `devops-infra:/cache/pikasTech/agentrun.git`Pipeline read/write 默认使用 mirror URL`trigger-current` 会在创建 PipelineRun 前 pre-sync `v0.1`。 |
| env reuse | 已实现/待持续验收 | Pipeline 计算 `envIdentity`,命中上一版 catalog 时输出 `build=0 reuse=1 unsafeReuse=0` 并复用 env image digest;首次 env identity 或依赖/Containerfile/boot 变化才构建 `agentrun-mgr-env:<envIdentity>`。 |
| `dev/prod` 废弃口径 | 已定义 | 本文明确 `agentrun_dev``agentrun_prod` 不作为当前规格目标。 |