如何调整GitLab CI实现ArgoCD基于单Helm Chart部署多K8s应用
当前核心问题是现有GitLab CI仅生成单个ArgoCD Application,只能部署指定的approach1.yaml对应的应用。以下提供两种可行方案,实现自动检测GitLab中argocd-apps/prm-helmchart/value_files路径下的所有value文件并部署对应应用。
方案一:用ArgoCD ApplicationSet批量管理(推荐)
ApplicationSet是ArgoCD官方提供的批量应用管理工具,能自动监听Git仓库的文件变更,自动生成/更新对应的ArgoCD Application资源,无需每次变更都触发GitLab CI重新生成配置。
操作步骤
确认ApplicationSet控制器已安装
先确保你的ArgoCD集群中已部署ApplicationSet控制器(可通过ArgoCD官方安装步骤完成)。修改GitLab CI部署ApplicationSet
替换原有CI的prepare和deploy阶段,直接部署ApplicationSet资源:
stages: - deploy deploy: stage: deploy image: google/cloud-sdk:latest script: - gcloud container clusters get-credentials my-gke-cluster1 --zone australia-southeast1-a --project my-project-v1 - | cat <<EOF | kubectl apply -f - apiVersion: argoproj.io/v1alpha1 kind: ApplicationSet metadata: name: prm-multi-apps namespace: argocd spec: generators: - git: repoURL: "https://gitlab.com/gitlab1511220/argocd-apps.git" revision: HEAD files: - path: "argocd-apps/prm-helmchart/value_files/*.yaml" template: metadata: name: "{{path.basenameWithoutExtension}}-app" spec: project: default source: repoURL: "cstmimgjfrog.jfrog.io" chart: "helm-oci-local/oci" targetRevision: "0.1.0" helm: valueFiles: - "argocd-apps/prm-helmchart/value_files/{{path.basename}}" destination: server: "https://kubernetes.default.svc" namespace: py-apps syncPolicy: automated: prune: true selfHeal: true EOF
效果
当GitLab仓库中value_files目录新增、修改或删除yaml文件时,ApplicationSet会自动检测到变化,生成对应名称的ArgoCD Application(比如approach1.yaml对应approach1-app),并自动同步部署到K8s集群。
方案二:调整GitLab CI遍历生成多个Application
如果暂时不想用ApplicationSet,可以修改CI流程,遍历value_files目录下的所有yaml文件,为每个文件生成独立的ArgoCD Application资源。
调整后的.gitlab-ci.yml
stages: - prepare - deploy prepare: stage: prepare script: - git clone https://$CI_GITLAB_USER:$CI_GITLAB_TOKEN@gitlab.com/gitlab1511220/argocd-apps.git artifacts: paths: - argocd-apps/prm-helmchart/value_files/ deploy: stage: deploy image: google/cloud-sdk:latest script: - gcloud container clusters get-credentials my-gke-cluster1 --zone australia-southeast1-a --project my-project-v1 # 遍历所有value文件,逐个创建ArgoCD Application - | for file in argocd-apps/prm-helmchart/value_files/*.yaml; do app_name=$(basename "$file" .yaml)-app cat <<EOF | kubectl apply -f - apiVersion: argoproj.io/v1alpha1 kind: Application metadata: name: $app_name namespace: argocd spec: project: default source: repoURL: 'cstmimgjfrog.jfrog.io' chart: 'helm-oci-local/oci' targetRevision: '0.1.0' helm: valueFiles: - $file destination: server: 'https://kubernetes.default.svc' namespace: py-apps syncPolicy: automated: prune: true selfHeal: true EOF done dependencies: - prepare
效果
GitLab CI触发时,会克隆value_files目录,然后为每个yaml文件生成对应的ArgoCD Application,实现多应用部署。后续只要GitLab中该目录的文件有变更,CI触发后就会自动更新对应应用的配置。
关键注意事项
- 若使用方案一,需保证ArgoCD有权限访问你的GitLab私有仓库(可在ArgoCD中配置Git仓库凭据)
- 方案一更适合长期维护,因为无需依赖GitLab CI的触发,ApplicationSet会主动监听Git仓库变化
- 两种方案都开启了
syncPolicy.automated,会自动同步应用配置并清理不再需要的资源
内容的提问来源于stack exchange,提问作者sdate

