feat: support env reuse and git mirror in v0.1 cicd
This commit is contained in:
@@ -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/relay;Pipeline 不直接依赖 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 services;planner 只能输出 TaskRun result 或临时 workspace 文件,不回写 source。
|
||||
5. Affected service 通过 Tekton Task 内的 BuildKit/kaniko/buildah 之一发布到 G14 本地 registry;reused 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 services;planner 只能输出 TaskRun result 或临时 workspace 文件,不回写 source。
|
||||
5. Affected env image 通过 Tekton Task 内的 BuildKit 发布到 G14 本地 registry;reused 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 digest,Tekton 必须用 `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 pin,catalog 记录完整 source commit 与 digest。
|
||||
- Runtime manifest 使用 digest pin,catalog 记录完整 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 state,Argo 从 `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` 不作为当前规格目标。 |
|
||||
|
||||
Reference in New Issue
Block a user