You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将GitLab CI中的动态Helm部署迁移至ArgoCD?

从GitLab CI Helm部署迁移到ArgoCD适配方案

一、先拆解原部署逻辑

你的GitLab CI部署命令核心逻辑是:

  1. 拉取Helm仓库,加载基础配置values.yaml + 应用专属配置projects/${PROJECT}.yaml
  2. 通过--set传入动态参数:镜像地址、版本、内外网域名
  3. 以${TARGET}-${PROJECT}为发布名,执行10分钟超时的原子化升级

二、ArgoCD适配步骤

方案1:单应用手动配置(适合少量应用)

1. 编写ArgoCD Application配置文件

针对每个应用(比如apigateway),创建对应ArgoCD应用配置,替换原CI中的变量:

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: test-apigateway  # 对应原${TARGET}-${PROJECT}
  namespace: argocd
spec:
  project: default  # 替换为你的ArgoCD项目名
  source:
    repoURL: "http://companygitlab/devops/helm.git"  # 你的Helm仓库地址
    targetRevision: main  # 对应仓库分支
    path: ./helm  # Chart所在路径
    helm:
      # 对应原helm命令的-f参数加载values文件
      valueFiles:
        - values.yaml
        - projects/apigateway.yaml
      # 对应原--set参数的动态配置
      parameters:
        - name: image.repository
          value: "registry.company.com/apigateway"  # 原${DOCKER_IMAGE_URI}
        - name: appVersion
          value: "abc123"  # 原${CI_COMMIT_SHORT_SHA}
        - name: ingress.hosts[0].host
          value: "apigw-internal.company.com"  # 原${DOMAIN_PRIVATE}
        - name: ingress.hosts[1].host
          value: "apigw.company.com"  # 原${DOMAIN_PUBLIC}
  destination:
    server: "https://kubernetes.default.svc"  # 目标K8s集群地址
    namespace: test-apigateway-ns  # 应用部署的命名空间,可自动创建
  syncPolicy:
    # 对应原--atomic的原子化同步,失败自动回滚
    automated:
      prune: true  # 自动清理不再需要的资源
      selfHeal: true  # 集群状态偏离时自动修复
    syncOptions:
      - CreateNamespace=true  # 自动创建目标命名空间
      - Timeout=600  # 对应原--timeout 10m0s
    retry:
      limit: 2  # 同步失败重试次数
      backoff:
        duration: 5s
        factor: 2
        maxDuration: 30s

2. 修改GitLab CI流程

替换原helm upgrade步骤,改为生成并应用ArgoCD配置:

# 1. 生成ArgoCD Application配置文件
- |
  cat > argocd-app-${PROJECT}.yaml << EOF
  apiVersion: argoproj.io/v1alpha1
  kind: Application
  metadata:
    name: ${TARGET}-${PROJECT}
    namespace: argocd
  spec:
    project: default
    source:
      repoURL: "http://companygitlab/devops/helm.git"
      targetRevision: main
      path: ./helm
      helm:
        valueFiles:
          - values.yaml
          - projects/${PROJECT}.yaml
        parameters:
          - name: image.repository
            value: ${DOCKER_IMAGE_URI}
          - name: appVersion
            value: ${CI_COMMIT_SHORT_SHA}
          - name: ingress.hosts[0].host
            value: ${DOMAIN_PRIVATE}
          - name: ingress.hosts[1].host
            value: ${DOMAIN_PUBLIC}
    destination:
      server: "https://kubernetes.default.svc"
      namespace: ${TARGET}-${PROJECT}-ns
    syncPolicy:
      automated:
        prune: true
        selfHeal: true
      syncOptions:
        - CreateNamespace=true
        - Timeout=600
  EOF

# 2. 安装ArgoCD CLI(如果CI环境未预装)
- curl -sSL -o argocd-linux-amd64 https://github.com/argoproj/argo-cd/releases/latest/download/argocd-linux-amd64
- chmod +x argocd-linux-amd64
- mv argocd-linux-amd64 /usr/local/bin/argocd

# 3. 登录ArgoCD并同步应用
- argocd login ${ARGOCD_SERVER} --username ${ARGOCD_USER} --password ${ARGOCD_PASSWORD} --insecure
- argocd app sync ${TARGET}-${PROJECT} --force

方案2:ApplicationSet批量管理(适合多应用场景)

如果需要批量管理projects目录下的所有应用,用ArgoCD ApplicationSet自动生成配置:

apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
  name: helm-projects-appset
  namespace: argocd
spec:
  generators:
    # 从Helm仓库的projects目录读取所有yaml文件,自动生成应用
    - git:
        repoURL: http://companygitlab/devops/helm.git
        revision: main
        files:
          - path: "projects/*.yaml"
            template:
              projectName: "{{ .path.basename | trimSuffix \".yaml\" }}"
  template:
    metadata:
      name: "prod-{{ .projectName }}"  # 这里prod对应原${TARGET},可根据环境调整
    spec:
      project: default
      source:
        repoURL: http://companygitlab/devops/helm.git
        targetRevision: main
        path: ./helm
        helm:
          valueFiles:
            - values.yaml
            - projects/{{ .projectName }}.yaml
          # 动态参数可结合ArgoCD Image Updater自动更新镜像版本
          parameters:
            - name: ingress.hosts[0].host
              value: "{{ .projectName }}-internal.company.com"
            - name: ingress.hosts[1].host
              value: "{{ .projectName }}.company.com"
      destination:
        server: https://kubernetes.default.svc
        namespace: "prod-{{ .projectName }}-ns"
      syncPolicy:
        automated:
          prune: true
          selfHeal: true
        syncOptions:
          - CreateNamespace=true
          - Timeout=600

三、优化建议

  1. 镜像版本自动更新:使用ArgoCD Image Updater组件,无需在CI中传入CI_COMMIT_SHORT_SHA,自动检测镜像仓库的新标签并同步
  2. 环境隔离:不同环境(如test/prod)可创建独立的ArgoCD项目,或者在ApplicationSet中通过分支/目录区分环境配置
  3. 权限控制:给ArgoCD的ServiceAccount配置最小化权限,避免过度授权
  4. 同步验证:开启ArgoCD的健康检查和自动同步,确保应用状态符合预期

内容的提问来源于stack exchange,提问作者lagrance

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 22:29:59