6.3 KiB
G14 GitOps CI/CD
G14 是 HWLAB 的旁路 DEV 集群目标。G14 CI/CD 必须只作用于 G14 k3s,不接管 D601 生产,不使用 UniDesk Code Queue 作为调度器,也不把 UniDesk backend、provider-gateway 或 microservice proxy 当作 HWLAB runtime。
目标模型
- Source of truth:业务版本以 Git source commit 为唯一身份;镜像 tag、OCI labels、runtime annotation 和 Argo CD desired state 都必须记录同一个 source commit。
- CI:Tekton 在 G14 k3s 内运行
hwlab-g14-ci-image-publishPipeline,读取CI.json命令,按 source commit 构建镜像并推送到 G14 registry。 - Artifact:镜像使用 commit tag,例如
127.0.0.1:5000/hwlab/hwlab-cloud-api:<shortCommit>;digest 由 registry 返回,CI report 只作为审计证据,不作为 CD 真相。 - Branch split:
G14是源码监控分支;G14-gitops是 Tekton promotion 写入的生成分支,保存deploy/gitops/g14/**desired state。 - CD:Argo CD 只消费
G14-gitops:deploy/gitops/g14/runtime的 Git desired state,不重新构建镜像,不读取 D601 状态,不获取 legacy DEV CD Lease。 - 并行性:不同 source commit 的 CI build 不共享发布锁;并行安全由 immutable commit tag/digest 和 Git desired state 保证。最终运行版本由 Argo CD 当前同步的 Git revision 决定。
生成入口
scripts/g14-gitops-render.mjs 是 G14 专用转换器:
- 读取
CI.json,生成 Tekton Pipeline 和 PipelineRun 样板。 - 读取
deploy/deploy.json与deploy/k8s/*,生成 Argo CD 可消费的 G14 runtime Kustomize path。 - 生成
hwlab-g14-branch-pollerCronJob:它使用 G14 集群内的 Git SSH Secret 轮询G14分支,按 source commit 创建确定命名的 Tekton PipelineRun。 - 默认输出到
deploy/gitops/g14/。 - 默认 GitOps 生成分支是
G14-gitops;Pipeline 成功后把本次 source commit 对应的deploy/gitops/g14/**推送到该分支,避免把生成提交继续写回G14。 - 默认 registry prefix 是
127.0.0.1:5000/hwlab,用于 G14 单节点 k3s 的 node-local registry。 - 默认 CI/CD proxy 是 G14 本机
http://127.0.0.1:10808/socks5h://127.0.0.1:10808。Tekton CI step、Docker-in-Docker sidecar 和 publish step 都注入 proxy/no_proxy;publish step 必须先在 DIND 内docker pull $HWLAB_DEV_BASE_IMAGE,再进入 DEV base-image preflight、build 和 registry push,保证 npm、Playwright Chromium 安装、base image 拉取和 registry push 走 G14 本机代理边界。CI step 固定使用 Node 22 Debian 镜像,避免 Playwright 官方镜像内 Node 版本漂移影响node --test。 - 任何依赖下载阶段都必须有可观测诊断。生成的 Tekton 脚本在 apt/apk、npm、Playwright browser、Docker base image pull 和 GitOps promote 之前输出结构化
dependency-proxy-probe、dependency-curl-probe或dependency-download-*日志,至少包含 phase、目标 URL/镜像、脱敏 proxy、首包耗时、总耗时、下载字节数和速度。CI/CD 卡在下载时,先用这些日志判断是 proxy 不可达、目标源慢、DNS/首包慢还是下载吞吐低,再决定是否切换 G14 代理节点或预热镜像;不能只凭 PipelineRun Running 时长判断业务测试失败。
常用命令:
npm run g14:gitops:render -- --source-revision <sourceCommit>
npm run g14:gitops:check
Polling 触发
G14 不要求 GitHub webhook 或 GitHub Actions 配置。hwlab-ci/hwlab-g14-branch-poller CronJob 每 5 分钟通过 Git SSH 拉取 G14 HEAD,并用 source commit 的前 12 位生成 PipelineRun 名称 hwlab-g14-ci-poll-<short12>。
如果同名 PipelineRun 已存在,poller 直接跳过;如果不存在,则创建新的 PipelineRun。这样可以用 Kubernetes 原生 CronJob、ServiceAccount、RBAC 和 Tekton API 实现无 GitHub webhook 的分支监控,同时避免同一个 commit 被反复派单。历史上的 chore: promote G14 GitOps source ... 生成提交会被 poller 跳过。
Pipeline 的标准路径是:G14 source commit -> CI.json Tekton 测试 -> commit-tagged image push 到 G14 registry -> render deploy/gitops/g14/** -> push G14-gitops -> Argo CD 同步 runtime。CD 只消费已经构建好的镜像和 Git desired state,不在 Argo CD 内构建镜像。
下载阶段排障命令:
KUBECONFIG=/etc/rancher/k3s/k3s.yaml kubectl -n hwlab-ci logs pod/<pipelinerun-task-pod> --all-containers --tail=400 \
| grep -E 'dependency-(proxy|curl|download)'
如果 probe 显示 proxy-env-missing、proxy-connect-failed、timeout 或速度长期接近 0,应先按 /root/docs/vpn-proxy-ops.md 检查 v2rayN/Hysteria,再重跑 polling。若 probe 正常但后续测试失败,按对应 CI.json 命令和业务检查排障。
集群资源
hwlab-ci:registry、Tekton runner RBAC、Polling CronJob、Pipeline/PipelineRun 所在 namespace。argocd:Argo CD 控制面和hwlab-g14-devApplication 所在 namespace。hwlab-dev:HWLAB runtime namespace,由 Argo CD 应用deploy/gitops/g14/runtime。
G14 registry 由 Kubernetes Deployment hwlab-ci/hwlab-registry 承载,使用 host network 暴露 127.0.0.1:5000 给 k3s/containerd 和 host-network Tekton build pod。旧 host Docker registry 不能与该 Deployment 同时占用 5000 端口。
G14 k3s/containerd 的 Pod 镜像拉取也必须长期使用 G14 本机代理。主机配置记录在 /root/docs/kubernetes-ops.md,当前 systemd env 文件是 /etc/systemd/system/k3s.service.env。修改代理后需要 systemctl daemon-reload && systemctl restart k3s,并确认 k3s-server 进程环境中存在 HTTP_PROXY / NO_PROXY。
凭证边界
HWLAB repo 是私有仓库时,Tekton 和 Argo CD 需要各自的 Git SSH Secret。Secret 只能从 G14 本机已有 SSH key 创建,不能写入 Git,不能打印 key 内容。
Tekton 约定 Secret 名称:hwlab-ci/hwlab-git-ssh。
Argo CD 约定 repository Secret:argocd/hwlab-git-ssh,并带 label argocd.argoproj.io/secret-type=repository。
D601 边界
G14 GitOps manifests 不包含 D601 kubeconfig、D601 node guard、D601 FRP 公网入口或 UniDesk Code Queue 调度入口。D601 仍由既有生产路径维护;G14 GitOps 的安装、PipelineRun、Argo sync 和 registry 操作都不能对 D601 执行 kubectl、docker 或流量切换动作。