GitOps 部署实战指南(CICD)

一、基本认识和简单介绍

DevOps 和 GitOps 的关系:

DevOps:开发 + 运维一体化思想,目标快速、稳定交付,范围大:CI/CD、自动化、监控、协作、流水线全都算。常用的软件:Jenkins、GitLab CI。

GitOps:用 Git 仓库做唯一数据源,管控集群、部署、配置,属于DevOps 子集,范围小:只聚焦 K8s 容器交付,以 Git 为唯一可信源,GitOps 是容器云原生场景下标准化的 DevOps。常用的软件:ArgoCD、Tekton。

DevOps → GitOps →ArgoCD(GitOps 首选工具)企业多用ArgoCD,ArgoCD 是完全开源、免费使用的。个人、公司、商业项目均可免费使用、修改、分发,可用于生产环境,无功能限制、无隐藏收费。

ArgoCD 简介:

ArgoCD是Kubernetes 专用的 GitOps 持续部署工具,属于GitOps最主流落地工具,专门管K8s 集群应用自动发布、同步、回滚,所有部署配置都存在Git 仓库,集群主动拉取配置,自动更新服务。

支持多种配置管理/模板工具(Kustomize、Helm、Jsonnet、纯 YAML)。

ArgoCD官网:

复制代码
https://argoproj.github.io/

ArgoCD 官方文档:

复制代码
https://argo-cd.readthedocs.io/en/stable/

ArgoCD代码仓库:

复制代码
https://github.com/argoproj/argo-cd

当前最新版本:

复制代码
v3.4.2

二、Argo CD部署环境准备

需要一个Kubernetes集群,单节点,多节点,高可用集群都可以,当前演示的是基于Kubernetes v1.35.1,如果不会部署K8S的可以参考:kubernetes_v1.35.1高可用集群部署实战

三、Argo CD代码仓库结构剖析

复制代码
https://github.com/argoproj/argo-cd

3.1、argo-cd的结构:

复制代码
argo-cd/
├── .github/                    # GitHub CI/CD 配置、Issue模板
├── applicationset/             # ApplicationSet 控制器的完整代码(批量管理多应用)
├── assets/                     # 静态资源文件(UI图标、文档图片等)
├── cmd/                        # 各组件的可执行入口(和之前说的一致)
│   ├── argocd-server/
│   ├── argocd-repo-server/
│   └── ...
├── cmpserver/                  # 配置管理插件(CMP)服务的实现
├── committerserver/            # Git提交服务,负责同步Git仓库状态
├── common/                     # 全项目通用的工具函数、常量、数据结构
├── controller/                 # 应用控制器的核心逻辑( reconcile 循环)
├── docs/                       # 官方文档源码
├── examples/                   # 场景化使用示例
├── gitops-engine/              # 核心的GitOps引擎(差异计算、同步逻辑)
├── hack/                       # 构建/发布脚本
├── manifests/                  # 安装部署的YAML清单(你之前用的install.yaml就在这!)
├── notification_controller/    # 通知控制器,处理Webhook、邮件等告警
├── notifications_catalog/      # 通知模板、渠道配置的目录
├── overrides/partials/language/ # 文档的语言/主题覆盖配置
├── pkg/                        # 核心业务逻辑库(大部分功能实现)
├── renovate-presets/           # 依赖自动更新工具Renovate的配置
├── reposerver/                 # Repo Server 组件的完整实现
├── resource_customizations/    # 自定义资源的健康检查、同步策略配置
├── server/                     # ArgoCD API Server 和 UI 服务的实现
├── test/                       # 端到端(E2E)测试代码
├── tools/cmd-docs/             # 命令行工具的文档生成脚本
├── ui/                         # 前端UI代码(React)
├── util/                       # 通用工具函数库
└── 根目录文件(Dockerfile、Makefile、go.mod等)

3.2、核心组件源码目录:

每个子目录对应一个独立的 Kubernetes Pod,你可以用 命令查看:

复制代码
kubectl get pods -n argocd

cmd/
├── argocd-server/               # API 服务器 + UI 前端(用户请求入口)
├── argocd-application-controller/ # 核心控制器:负责应用同步、状态检查、回滚
├── argocd-repo-server/          # Git 仓库服务器:拉取/解析 Helm/Kustomize 配置
├── argocd-dex-server/           # SSO 身份验证服务(支持 OIDC/LDAP 登录)
├── argocd-redis/                # 缓存服务(HA 模式下为 Redis 哨兵集群)
├── argocd-cmp-server/           # 配置管理插件(CMP)服务:扩展 Helm/Kustomize 能力
└── argocd-util/                 # 工具命令:调试/维护 ArgoCD 用(如重置 admin 密码)

3.3、安装部署核心manifests目录:

复制代码
manifests/
├── install.yaml           # 单副本「非高可用版」完整安装清单(你第一次用的文件)
├── namespace-install.yaml # 轻量版:仅创建 argocd 命名空间 + 基础 RBAC
├── crds/                  # 所有 ArgoCD CRD 的 YAML 文件(Application/AppProject 等)
│   └── *.yaml
├── base/                  # Kustomize 基础配置(非 HA 模式的原始模块)
│   ├── argocd-cm.yaml     # ArgoCD 核心配置 ConfigMap
│   ├── argocd-secret.yaml # 初始密钥(admin 密码、Git 凭证等)
│   ├── kustomization.yaml # Kustomize 合并规则
│   └── ...(Deployment/Service/RBAC 等基础资源)
├── ha/                   # 高可用(HA)模式的专属配置(你第二次用的文件就在这!)
│   ├── install.yaml      # HA 模式完整安装清单
│   └── base/             # HA 模式的 Kustomize 叠加配置(多副本、Redis 哨兵等)
└── ...(其他场景:低权限模式、开发者模式等)

install.yaml与 ``ha/install.yaml 的本质:它们是通过 kustomize build 命令合并 base/ 目录的配置生成的「完整清单」,包含了所有 Deployment、Service、RBAC、CRD 资源。非 HA 版默认单副本,HA 版默认 3 副本控制器 + Redis 哨兵集群,无单点故障。

--server-side --force-conflicts 参数的作用:因为 manifests/crds/ 里的 CRD 定义可能随版本更新,使用服务端应用(Server-side Apply)可以避免旧版本 CRD 字段冲突,确保安装成功。

3.4、核心业务逻辑库pkg目录

复制代码
pkg/
├── application/    # 应用管理核心:资源差异计算(Diff)、同步逻辑
├── controller/    # 控制器 reconcile 循环:持续监听 Git 与集群状态
├── rbac/           # 细粒度权限控制(RBAC 策略验证)
├── git/            # Git 仓库交互逻辑(拉取、分支同步、凭证管理)
├── kube/           # Kubernetes API 交互逻辑(资源增删改查)
├── diff/           # 资源差异计算(含 v3.x 新增的「服务端 Diff」优化)
└── ...(metrics/健康检查/缓存等通用模块)

3.5、场景化使用示例``examples目``录

复制代码
examples/
├── k8s-rbac/argocd-server-applications/  # Argo CD自身的RBAC权限配置示例
├── known-hosts/                          # SSH known_hosts配置示例
├── plugins/helm/                         # Helm配置管理插件(CMP)示例
├── dashboard-legacy.json                 # 旧版Grafana监控仪表盘
└── dashboard.json                        # 最新版Argo CD控制器遥测仪表盘

四、安装Argo CD服务端

Argo CD服务端部署

五、部署Traefikv3.7.1版本访问argocd web

部署Traefikv3.7.1版本访问web(k8s)

https://argocd.dashboard.com/

admin / QVpFeGl9cfezIfnA

六、更改argocd web的登录密码

目的:不用每次都去查询,直接设置一个密码进行登录:

https://argocd.dashboard.com/

admin / Admin@2026#

七、Argo CD客户端工具安装和使用

ArgoCD客户端工具安装和使用

经过客户端修改后的密码:

复制代码
https://argocd.dashboard.com/
admin / Admin@2026##

[root@master1 argocd-ns]# argocd cluster list
SERVER                          NAME        VERSION  STATUS      MESSAGE  PROJECT
https://kubernetes.default.svc  in-cluster  1.35.1   Successful           
[root@master1 argocd-ns]# 

八、K8S集群集成Harbor

8.1、修改Docker的全局配置文件(所有节点执行)

复制代码
cat > /etc/docker/daemon.json << EOF
{
 "data-root":"/datah/docker",
 "exec-opts": ["native.cgroupdriver=systemd"],
 "insecure-registries": ["192.168.1.20"],
 "bip":"170.64.0.1/16",
 "registry-mirrors": [
    "https://docker.registry.cyou",
    "https://docker-cf.registry.cyou",
    "https://dockercf.jsdelivr.fyi",
    "https://docker.jsdelivr.fyi",
    "https://dockertest.jsdelivr.fyi",
    "https://mirror.aliyuncs.com",
    "https://dockerproxy.com",
    "https://mirror.baidubce.com",
    "https://docker.m.daocloud.io",
    "https://docker.nju.edu.cn",
    "https://docker.mirrors.sjtug.sjtu.edu.cn",
    "https://docker.mirrors.ustc.edu.cn",
    "https://mirror.iscas.ac.cn",
    "https://docker.rainbond.cc"
  ],
 "max-concurrent-downloads":10,
 "log-driver":"json-file",
 "log-level":"warn",
 "log-opts": {
   "max-size":"10m",
   "max-file":"3"
  }
}
EOF

8.2、删除本地代理后面有需要的时候再添加

复制代码
cd /etc/systemd/system/docker.service.d
rm -f http-proxy.conf

8.3、重新加载配置并重启

复制代码
systemctl daemon-reload
systemctl restart docker

8.4、docker 登录harbor

复制代码
docker login http://192.168.1.20 -u admin -p Harbor12345

8.5、把Argo CD的镜像推送到私有仓库

复制代码
docker pull ghcr.io/dexidp/dex:v2.45.0
docker tag ghcr.io/dexidp/dex:v2.45.0 192.168.1.20/dexidp/dex:v2.45.0
docker push 192.168.1.20/dexidp/dex:v2.45.0

docker pull public.ecr.aws/docker/library/redis:8.2.3-alpine
docker tag public.ecr.aws/docker/library/redis:8.2.3-alpine 192.168.1.20/docker/library/redis:8.2.3-alpine
docker push 192.168.1.20/docker/library/redis:8.2.3-alpine

docker pull quay.io/argoproj/argocd:v3.4.2
docker tag quay.io/argoproj/argocd:v3.4.2 192.168.1.20/argoproj/argocd:v3.4.2
docker push 192.168.1.20/argoproj/argocd:v3.4.2

8.6、替换镜像并升级应用使用私有镜像

备份原始文件:

复制代码
cp install.yaml install.yaml.bak

一键替换所有镜像前缀为你的私有仓库:

复制代码
sed -i 's|quay.io/argoproj/argocd|192.168.1.20/argoproj/argocd|g' install.yaml
sed -i 's|ghcr.io/dexidp/dex|192.168.1.20/dexidp/dex|g' install.yaml
sed -i 's|public.ecr.aws/docker/library/redis|192.168.1.20/docker/library/redis|g' install.yaml

查看修改后的镜像地址:

复制代码
grep -E 'image:|repository:' install.yaml | grep -E '192.168.1.20|quay.io|ghcr.io|public.ecr.aws'

执行升级(和安装时保持同样的命令):

复制代码
kubectl apply -n argocd --server-side --force-conflicts -f install.yaml

验证升级结果:

复制代码
watch -n 2 'kubectl get pod -n argocd'

查看新 Pod 使用的镜像地址:

复制代码
kubectl get pod -n argocd -l app.kubernetes.io/name=argocd-server -o jsonpath='{.items[0].spec.containers[0].image}'

目的:现在都是使用的私有镜像了,不存在外部网络问题。

九、Argo CD快速实践

提前用jenkins构建了三个版本的镜像:v0.0.1,v0.0.2,v0.0.3,Argo CD主要是CD的过程不在CI构建镜像的过程。Jenkins 流水线构建vue前端项目

v0.0.1

复制代码
docker pull 192.168.1.20/toolbox/toolbox-web:v0.0.1

v0.0.2

复制代码
docker pull 192.168.1.20/toolbox/toolbox-web:v0.0.2

v0.0.3

复制代码
docker pull 192.168.1.20/toolbox/toolbox-web:v0.0.3

9.1、先把之前用jenkins部署的 toolbox-bigdata删除掉

复制代码
[root@master1 ~]# kubectl get pod -n toolbox-bigdata 
NAME                                    READY   STATUS    RESTARTS   AGE
toolbox-web-platform-66987fff5f-6fzj6   1/1     Running   0          10m
toolbox-web-platform-66987fff5f-hjtgc   1/1     Running   0          10m
[root@master1 ~]# kubectl delete ns toolbox-bigdata
namespace "toolbox-bigdata" deleted

9.2、在前端项目toolbox-web下之前已经创建好了包含应用的yaml文件

先把image: ${IMAGE} 替换成:

image: 192.168.1.20/toolbox/toolbox-web:v0.0.1

复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  name: toolbox-web-platform
  labels:
    app: toolbox-web-platform
    version: v1
spec:
  replicas: 2
  selector:
    matchLabels:
      app: toolbox-web-platform
  template:
    metadata:
      labels:
        app: toolbox-web-platform
        version: v1
    spec:
      containers:
        - name: toolbox-web-platform
          image: 192.168.1.20/toolbox/toolbox-web:v0.0.1
          imagePullPolicy: IfNotPresent
          ports:
            - name: http
              containerPort: 80
              protocol: TCP
          resources:
            requests:
              cpu: 100m
              memory: 128Mi
            limits:
              cpu: 500m
              memory: 512Mi
          livenessProbe:
            httpGet:
              path: /
              port: http
            initialDelaySeconds: 10
            periodSeconds: 5
            timeoutSeconds: 3
            failureThreshold: 3
          readinessProbe:
            httpGet:
              path: /
              port: http
            initialDelaySeconds: 5
            periodSeconds: 5
            timeoutSeconds: 3
            failureThreshold: 3

apiVersion: v1
kind: Service
metadata:
  name: toolbox-web-platform-service
  labels:
    app: toolbox-web
spec:
  type: NodePort
  selector:
    app: toolbox-web-platform
  ports:
    - name: http
      port: 8080
      targetPort: http
      protocol: TCP
      nodePort: 30080

9.3、Argo CD添加仓库地址

Argo CD添加仓库地址,Settings → Repositories,点击 CONNECT REPO 按钮添加仓库,填写以下信息:

Choose your connection method: 【选择http方式🔗 】

复制代码
VIA HTTP/HTTPS

Type: 【选择git 】

复制代码
git

Name: 【仓库名称】

复制代码
toolbox-web

Project: 【所属项目】

复制代码
default

Repository URL:【代码仓库地址】

复制代码
http://192.168.1.50:8980/aiops-team/toolbox-web.git

Username (optional):【Git 仓库的账号】

复制代码
root

Password (optional):【个人访问令牌】

复制代码
glpat-QEehDmbcU92LUzCnh10V-W86MQp1OjUH.01.0w08fdg81

点击链接:

🔗代码仓库连接成功:

如果集群连接失败,检查argocd-repo-server日志,是否可以正常访问 git 仓库,账号密码是否正确,是否有权限访问仓库。

复制代码
kubectl logs -n argocd argocd-repo-server-ff5578b69-nd5mn -f

9.4、代码创库连成功后:创建应用

Application Name:【应用名称】

复制代码
toolbox-web

Project Name: 【所属项目】

复制代码
default

Sync Policy:【同步策略】

两种策略:

Manual(手动同步):只有你手动点击同步按钮,ArgoCD 才会拉取 Git 里的最新配置,并应用到集群。

Automatic(自动同步):当 Git 仓库里的配置发生变化时,ArgoCD 会自动拉取并同步到集群

复制代码
Automatic

Revision:【代码分支选择开发分支】

复制代码
develop

Path:【资源所在路径】

ArgoCD 会在仓库里的 k8s/ 目录下,寻找 Kubernetes 的 文件(Deployment、Service、Ingress 等 YAML),并把它们部署到集群里。

复制代码
argocd

Cluster URL: 选择要部署的集群

复制代码
https://kubernetes.default.svc

Namespace: 部署到对应的空间下

复制代码
toolbox-bigdata

创建完后界面显示:

并且立马开启了首次部署:

9.5、验证应用部署情况

复制代码
[root@master1 ~]# kubectl get pod -n toolbox-bigdata
NAME                                    READY   STATUS    RESTARTS   AGE
toolbox-web-platform-567ffdd95c-bkgl4   1/1     Running   0          4m51s
toolbox-web-platform-567ffdd95c-vjj7b   1/1     Running   0          4m51s
[root@master1 ~]# kubectl get svc -n toolbox-bigdata
NAME                           TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
toolbox-web-platform-service   NodePort   10.96.187.25   <none>        8080:30080/TCP   4m57s
[root@master1 ~]# 

访问web页面验证:

复制代码
http://192.168.100.200:30080/

9.6、提交代码,验证更新应用

把代码仓库代码的将镜像版本v0.0.1 修改到 v0.0.2:

ArgoCD 默认每 3 分钟(180 秒) 检查一次 Git 仓库的配置是否有变化:

访问web页面,发现已经完成了发布工作:

再次提交代码更新:把代码仓库代码的将镜像版本v0.0.2 修改到 v0.0.3

访问web页面,发现 v0.0.3 发布工作:

9.7、如何完成版本回退

点击History and rollback查看应用的所有发布记录,可以选择指定版本进行回退操作。

在历史版本中选择要回退的版本:

再次访问发现已经回退到v0.0.2版本

9.8、手动点击立即同步代码仓库进行发布

选项 含义 适用场景
PRUNE 修剪:删除集群中存在、但 Git 仓库里已经没有的资源 当你在 Git 里删除了某个资源(比如旧的 Deployment),勾选后 ArgoCD 会自动把集群里的对应资源删掉
DRY RUN 试运行:只模拟同步过程,不实际修改集群 想先看看同步会做哪些变更,确认没问题再执行
APPLY ONLY 仅应用:只创建 / 更新资源,不做删除 / 替换操作 避免误删资源,只保证 Git 里的资源在集群里存在
FORCE 强制同步:绕过部分冲突检查,强制覆盖集群状态 资源状态卡住、常规同步失败时使用,有风险

SKIP SCHEMA VALIDATION:跳过 Kubernetes 资源的 Schema 校验,适合非标准 / CRD 资源。

APPLY OUT OF SYNC ONLY:只同步状态为 OutOfSync的资源,跳过已经和 Git 一致的资源。

SERVER-SIDE APPLY:使用 Kubernetes 服务端合并模式应用配置,避免客户端本地状态不一致问题。

AUTO-CREATE NAMESPACE:如果目标 Namespace 不存在,自动创建它。

RESPECT IGNORE DIFFERENCES:尊重应用里配置的「忽略差异」规则,同步时跳过指定字段的变更。

PRUNE LAST:先创建 / 更新新资源,最后再删除旧资源,避免服务中断。

十、Jenkins 和 ArgoCD 实现标准GitOps流程

Jenkins 只做 前端打包 → 构建镜像 → 推送 Harbor → 提交更新镜像标签的 YAML 到 Git。

ArgoCD 监听 Git 仓库,自动拉取 YAML 并同步到 K8s,不再让 Jenkins 直接操作 kubectl apply。

10.1、ArgoCD CLI客户端的下载地址

目的:可以在Jenkins 里面监听ArgoCD 同步相关的状态。

ArgoCD私有地址:

复制代码
https://argocd.dashboard.com/
admin / Admin@2026##

下载客户端工具包

复制代码
https://argocd.dashboard.com/download/argocd-linux-amd64

客户端工具包互联网下载地址:

复制代码
https://github.com/argoproj/argo-cd/releases/download/v3.4.3/argocd-linux-amd64

10.2、Jenkins 安装ArgoCD CLI

Jenkins部署指南(docker)

复制代码
mkdir -p /datah/jenkins-data/argocd
cd /datah/jenkins-data/argocd
wget https://argocd.dashboard.com/download/argocd-linux-amd64 --no-check-certificate
复制代码
mv argocd-linux-amd64 argocd
chmod +x argocd 

10.3、Jenkins把ArgoCD客户端挂入容器

1、进入Jenkins程序目录

复制代码
cd /usr/local/jenkins/

2、编辑docker-compose.yml新增挂载配置

复制代码
vim docker-compose.yml

volumes:
      - .......原来的配置保持不变.......
      - /datah/jenkins-data/argocd/argocd:/usr/local/bin/argocd   # 挂载argocd客户端工具

    ........
    user: "root"
    extra_hosts: # 域名解析替换成你的 ArgoCD 实际 IP
      - "argocd.dashboard.com:192.168.100.200" 

3、全量Jenkins的yaml

复制代码
services:
  jenkins:
    image: 192.168.1.20/jenkins/jenkins:2.555.1-lts-jdk21
    container_name: jenkins
    hostname: jenkins
    ports:
      - "58081:8080"   # Jenkins Web UI
      - "50000:50000"  # Jenkins agent communication
    volumes:
      - /datah/jenkins-data:/var/jenkins_home:rw               # 持久化数据,避免容器重启丢失配置
      - /var/run/docker.sock:/var/run/docker.sock             # 允许 Jenkins 调用宿主机的 Docker
      - /usr/local/bin/docker:/usr/bin/docker                 # 将宿主机二进制文件挂载到jenkins容器内部
      - /etc/docker/daemon.json:/etc/docker/daemon.json       # 镜像加速文件挂载到jenkins容器内部
      - /datah/jenkins-data/kubectlv1351/kubectl:/usr/local/bin/kubectl:x   #挂载kubectl到容器的系统PATH目录
      - /datah/jenkins-data/jdk17:/usr/local/jdk17
      - /datah/jenkins-data/maven:/usr/local/maven            # 将宿主机上的 Maven 挂载到容器内部
      - /datah/jenkins-data/go:/usr/local/go                  # 将宿主机上的 golang 挂载到容器内部
      - /datah/jenkins-data/nodejs:/usr/local/nodejs          # 蒋目录下的 nodejs 挂载到容器内部
      - /datah/jenkins-data/python3:/usr/local/python3        # 蒋目录下的 python3 挂载到容器内部
      - /datah/jenkins-data/ssh:/root/.ssh                    # 将宿主机上的 .ssh 挂载到容器内部
      - /usr/bin/envsubst:/usr/local/bin/envsubst             # 命令行工具  gettext 软件包
      - /usr/bin/make:/usr/local/bin/make                     # 构建自动化工具 软件包
      - /datah/jenkins-data/argocd/argocd:/usr/local/bin/argocd   # 挂载argocd客户端工具
    environment:
      - JENKINS_OPTS=--prefix=/jenkins                        # 设置 Jenkins 的上下文路径  #http://0.0.0.0:58081/jenkins/
     #- JAVA_HOME=/usr/local/jdk17
      - JAVA_OPTS=-Dsonar.qualitygate.wait=true
      - JDK17_HOME=/usr/local/jdk17
      - MAVEN_HOME=/usr/local/maven
      - PYTHON_HOME=/usr/local/python3
      - NODE_HOME=/usr/local/nodejs
      - GOPATH=$HOME/go
      - GOROOT=/usr/local/go
      - TZ=Asia/Shanghai
    restart: always  # 容器自动重启
    privileged: true  # 允许容器内运行需要更高权限的进程(如 Docker-in-Docker)
    user: "root"  # 以 root 用户运行容器
    extra_hosts: # 域名解析替换成你的 ArgoCD 实际 IP
      - "argocd.dashboard.com:192.168.100.200" 

4、停止Jenkins

复制代码
docker-compose down

5、启动Jenkins

复制代码
docker-compose up -d

10.4、验证Jenkins容器的argocd客户端

1、进入容器

复制代码
docker exec -it jenkins /bin/bash

2、查看客户端版本

复制代码
[root@node nodejs]# docker exec -it jenkins  /bin/bash
root@jenkins:/# argocd version
argocd: v3.4.2
  BuildDate: 2026-05-12T20:34:57Z
  GitCommit: 0dc6b1b57dd5bb925d5b03c3d09419ab9fb4225e
  GitTreeState: clean
  GitTag: v3.4.2
  GoVersion: go1.26.0
  Compiler: gc
  Platform: linux/amd64
{"level":"fatal","msg":"Argo CD server address unspecified","time":"2026-05-30T18:00:21+08:00"}
root@jenkins:/# 

10.5、Jenkins 新增 ArgoCD 凭据

ArgoCD客户端工具安装和使用

1、在 ArgoCD CLI 中生成生成 token

ArgoCD 所在节点执行,集群客户端节生成 token(无过期时间),不建议直接给 admin 账号开启 apiKey,login,更安全的做法是创建一个专用的服务账号:

创建Jenkins 账号并开启 apiKey,login:

复制代码
kubectl patch configmap argocd-cm -n argocd --type merge -p '{"data":{"accounts.jenkins":"apiKey, login"}}'

查看 ArgoCD 系统中所有账号的配置:

复制代码
argocd account list -o wide

给jenkins账号配置 RBAC 权限(argocd-rbac-cm):

复制代码
kubectl patch configmap argocd-rbac-cm -n argocd --type merge -p '{"data":{"policy.csv":"p, jenkins, *, *, *, allow"}}'

查询权限:

复制代码
kubectl get configmap argocd-rbac-cm -n argocd -o yaml | grep -A 10 "policy.csv"

* * * allow 全权限,适合测试环境,生产环境建议只给必要权限。

给在ArgoCD中的jenkins账号生成 Token (这个 Token 是永久有效的):

复制代码
argocd account generate-token --account jenkins --id jenkins-ci
复制代码
# 生成的token
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJhcmdvY2QiLCJzdWIiOiJqZW5raW5zOmFwaUtleSIsIm5iZiI6MTc4MDEzNjMwNCwiaWF0IjoxNzgwMTM2MzA0LCJqdGkiOiJqZW5raW5zLWNpIn0.OY7W8IER7H2Wo5aFMuTeEKC-9vccIcCYh4hWroyzCIU

生产环境不建议使用永久 Token

复制代码
argocd account generate-token --account jenkins --id jenkins-ci --expires-in 720h

--account:指定要生成 token 的 ArgoCD 账号(必填)。

--id:可选参数,给 token 设置一个标识(替代了你原本想使用的 ``--name 作用)。

--expires-in:可选参数,设置 token 有效期(例如 ``720h 代表 30 天,默认永久有效)。

重启 ArgoCD Server 使配置生效:

复制代码
kubectl rollout restart deployment argocd-server -n argocd

2、用 ArgoCD CLI 命令验证

复制代码
# 1. 设置 Token 环境变量(替换成你自己的 Token)
export ARGOCD_AUTH_TOKEN="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJhcmdvY2QiLCJzdWIiOiJqZW5raW5zOmFwaUtleSIsIm5iZiI6MTc4MDEzNjMwNCwiaWF0IjoxNzgwMTM2MzA0LCJqdGkiOiJqZW5raW5zLWNpIn0.OY7W8IER7H2Wo5aFMuTeEKC-9vccIcCYh4hWroyzCIU"
# 2. 直接执行 ArgoCD 命令,无需 login
argocd app get toolbox-web --grpc-web --insecure

3、在Jenkins 中新增 ArgoCD 凭据

ID:argocd-token

内容:ArgoCD-Token

4、新建一个流水线验证 ArgoCD客户端获取应用信息

复制代码
argocd-test-jenkins-token
复制代码
pipeline {
    agent any
    environment {
        // ArgoCD 服务器地址
        ARGOCD_SERVER = "argocd.dashboard.com"
        // 从 Jenkins 凭据库读取 Token
        ARGOCD_TOKEN = credentials('argocd-token')
    }
    stages {
        stage('验证 ArgoCD Token 与权限') {
            steps {
                script {
                    echo "=== 开始验证 ArgoCD 客户端权限 ==="
                    sh '''
                        set -e
                        # 直接用环境变量鉴权,无需 login 命令
                        export ARGOCD_AUTH_TOKEN="${ARGOCD_TOKEN}"

                        echo "✅ 1. 测试获取 ArgoCD 应用列表"
                        argocd app list --grpc-web --insecure

                        echo "✅ 2. 测试获取指定应用详情(替换成你的应用名)"
                        argocd app get toolbox-web --grpc-web --insecure

                        echo "✅ 3. 测试应用同步状态"
                        argocd app sync toolbox-web --grpc-web --insecure --timeout 60

                        echo "🎉 ArgoCD 客户端验证全部通过!"
                    '''
                }
            }
        }
    }
    post {
        always {
            echo "=== ArgoCD 客户端验证流程结束 ==="
        }
        success {
            echo "✅ 所有验证步骤均成功,Token 与权限配置正常!"
        }
        failure {
            echo "❌ 验证失败,请检查 Token、ArgoCD 地址或 RBAC 权限配置"
        }
    }
}

5、流水线新增 ArgoCD 配置完成整个过程

复制代码
pipeline {
    agent any
    environment {
        // 合并系统PATH和自定义工具路径,确保所有命令都能找到
        PATH = "${env.PATH}:" +
               "${env.JAVA_HOME}/bin:" +
               "${env.JDK17_HOME}/bin:" +
               "${env.MAVEN_HOME}/bin:" +
               "${env.GO_HOME}/bin:" +
               "${env.NODE_HOME}/bin:" +
               "${env.PYTHON_HOME}/bin"

        // 私有Harbor仓库配置
        HARBOR_REGISTRY = "192.168.1.20"
        HARBOR_PROJECT  = "toolbox"

        // 新增 ArgoCD 配置
        ARGOCD_SERVER = "argocd.dashboard.com"
        ARGOCD_APP_NAME = "toolbox-web"
        ARGOCD_TOKEN = credentials('argocd-token')

        // K8s配置
        KUBECONFIG_CRED = "kubeconfig-cred"
        K8SNAMESPACE = "toolbox-bigdata"

        // 应用配置
        DEPLOYMENT_NAME = "toolbox-web-platform"
        K8S_DEPLOY_FILE = "k8s/deployment.yaml"
        K8S_SERVICE_FILE = "k8s/service.yaml"
    }
    stages {
        // 验证分支是否正确获取
        stage('打印分支信息') {
            steps {
                echo "当前构建的分支是:${BRANCH}"
                echo "通过环境变量获取:${env.BRANCH}"
                echo "输入版本号:${VERSION}"
                echo "通过环境变量获取输入版本号:${env.VERSION}"
            }
        }

        stage('拉取代码') {
            steps {
                // 核心:直接使用 ${BRANCH} 引用用户选择的分支
                git(
                    url: 'http://192.168.1.50:8980/aiops-team/toolbox-web.git',
                    branch: "${BRANCH}", // 必须用双引号!
                    credentialsId: 'gitlab-group-token' // 你的凭据ID
                )
            }
        }

        stage('前端构建') {
            steps {
                sh '''
                    set -e
                    # 配置国内npm源,解决依赖下载慢/超时问题
                    npm config set registry https://registry.npmmirror.com/

                    # 验证Node/NPM版本
                    node -v
                    npm -v

                    # 安装依赖(ci比install更稳定,适合CI环境)
                    npm ci

                    # 生产环境打包
                    npm run build

                    # 验证构建产物
                    ls -la dist/
                '''
            }
        }

        stage('拷贝产物至docker目录') {
            steps {
                sh '''
                    set -e
                    # 如果docker目录不存在则自动创建
                    mkdir -p docker
                    # 递归拷贝dist全部文件到docker目录
                    cp -r dist docker/
                    # 校验拷贝结果
                    ls -la docker/
                '''
            }
        }

       stage('构建镜像并推送Harbor') {
           steps {
               withCredentials([usernamePassword(
                   credentialsId: 'harbor-creds',
                   usernameVariable: 'HARBOR_USER',
                   passwordVariable: 'HARBOR_PASS'
               )]) {
                   sh '''

                       # 进入docker目录
                       cd docker

                       echo "输入版本号:${VERSION}"
                       # 判断VERSION是否为空
                       if [ -z ${VERSION} ]; then
                            IMAGE_TAG="${HARBOR_REGISTRY}/${HARBOR_PROJECT}/toolbox-web:${BRANCH}-${BUILD_NUMBER}"
                       else
                            IMAGE_TAG="${HARBOR_REGISTRY}/${HARBOR_PROJECT}/toolbox-web:${VERSION}"
                       fi

                       # 拼接前端镜像标签:仓库/项目/应用名:分支-构建号
                       # IMAGE_TAG="${HARBOR_REGISTRY}/${HARBOR_PROJECT}/toolbox-web:${BRANCH}-${BUILD_NUMBER}"
                       echo "🔨 开始构建镜像:${IMAGE_TAG}"

                       # 构建Docker镜像
                       docker build -t "${IMAGE_TAG}" .

                       if [ $? -eq 0 ]; then
                           echo "✅ 镜像构建成功!"
                           docker images "${IMAGE_TAG}"
                       else
                           echo "❌ 镜像构建失败!"
                           exit 1
                       fi

                       # 登录Harbor仓库
                       echo "🔐 登录Harbor仓库:${HARBOR_REGISTRY}"
                       docker login "${HARBOR_REGISTRY}" -u "${HARBOR_USER}" -p "${HARBOR_PASS}"

                       if [ $? -eq 0 ]; then
                           echo "✅ Harbor登录成功!"
                       else
                           echo "❌ Harbor登录失败!"
                           exit 1
                       fi

                       # 推送镜像到Harbor
                       echo "🚀 推送镜像到Harbor:${IMAGE_TAG}"
                       docker push "${IMAGE_TAG}"

                       if [ $? -eq 0 ]; then
                           echo "✅ 镜像推送成功!"
                       else
                           echo "❌ 镜像推送失败!"
                           exit 1
                       fi

                       # 清理本地镜像,释放磁盘
                       echo "🧹 清理本地镜像"
                       docker rmi "${IMAGE_TAG}"
                       docker logout "${HARBOR_REGISTRY}"

                       echo "当前构建号:${BUILD_NUMBER}"

                       # 写入环境变量文件,供后续部署阶段读取
                       echo "IMAGE=${IMAGE_TAG}" > ../image.env
                       echo "BRANCH=${BRANCH}" >> ../image.env
                       echo "BUILD_NUMBER=${BUILD_NUMBER}" >> ../image.env
                       echo "APP_NAME=toolbox-web" >> ../image.env

                       echo "🎉 镜像构建推送完成!"
                       echo "📦 最终镜像地址:${IMAGE_TAG}"
                   '''
               }
           }
       }
        // ========== 核心阶段:更新 ArgoCD 目录下的 YAML 并提交 ==========
        stage('更新ArgoCD目录镜像配置并推送Git') {
            steps {
                script {
                    // 读取上一步生成的镜像地址
                    def imageEnv = readFile('image.env').trim()
                    def envMap = [:]
                    imageEnv.split('\n').each { line ->
                        def parts = line.split('=', 2)
                        envMap[parts[0]] = parts[1]
                    }
                    def NEW_IMAGE = envMap['IMAGE']
                    echo "🔧 待替换镜像地址:${NEW_IMAGE}"
                    echo "📄 源YAML目录:k8s/"
                    echo "📄 目标YAML目录:argocd/"

                    sh """
                        set -e
                        # 1. 创建 argocd 目录(如果不存在)
                        mkdir -p argocd/

                        # 2. 复制 k8s/ 目录下的所有 YAML 文件到 argocd/ 目录
                        cp -r k8s/* argocd/

                        # 3. 只在 argocd/ 目录下替换镜像占位符
                        sed -i "s|\\\${IMAGE}|${NEW_IMAGE}|g" argocd/deployment.yaml

                        # 4. 查看变更内容(只看 argocd/ 目录)
                        git diff argocd/ || true

                        # 5. 配置 Git 提交人信息
                        git config --global user.name "Jenkins-CI-Auto"
                        git config --global user.email "jenkins-ci@local.com"

                        # 6. 只暂存、提交 argocd/ 目录的变更
                        git add argocd/
                        git commit -m "CI: update image to ${NEW_IMAGE} | Build:${BUILD_NUMBER} | Branch:${BRANCH}"
                    """

                    // 7. 使用读写凭据推送到远端 Git 仓库
                    withCredentials([usernamePassword(
                        credentialsId: 'gitlab-group-token', // 必须是有写权限的凭据
                        usernameVariable: 'GIT_USER',
                        passwordVariable: 'GIT_PASS'
                    )]) {
                        sh """
                            set -e
                            # 推送当前分支到远端
                            git push http://${GIT_USER}:${GIT_PASS}@192.168.1.50:8980/aiops-team/toolbox-web.git ${BRANCH}
                            echo "✅ argocd/ 目录YAML已推送至 Git,ArgoCD 开始检测变更"
                        """
                    }
                }
            }
        }

        stage('等待ArgoCD同步完成') {
            steps {
                withEnv([
                    "ARGOCD_SERVER=${ARGOCD_SERVER}",
                    "ARGOCD_APP_NAME=${ARGOCD_APP_NAME}",
                    "ARGOCD_AUTH_TOKEN=${ARGOCD_TOKEN}"
                ]) {
                    sh '''
                        set -e
                        echo "🔍 直接使用Token鉴权,等待 ArgoCD 同步与应用健康..."

                        # 1. 强制刷新 ArgoCD,让它立刻感知 Git 变更
                        argocd app get ${ARGOCD_APP_NAME} --refresh --grpc-web --insecure
                        echo "✅ 已触发 ArgoCD 立即检测变更"

                        # 2. 强制触发应用同步(关键步骤!)
                        echo "🚀 强制触发应用同步..."
                        argocd app sync ${ARGOCD_APP_NAME} --grpc-web --insecure --timeout 60

                        # 3. 阻塞等待同步完成 + 应用健康
                        echo "⏳ 等待同步完成与应用健康..."
                        argocd app wait ${ARGOCD_APP_NAME} \
                            --sync \
                            --health \
                            --timeout 300 \
                            --grpc-web \
                            --insecure

                        echo "✅ ArgoCD 同步&健康检查通过"
                    '''
                }
            }
        }

        stage('部署完成通知') {
            steps {
                echo "🎉 应用已成功部署到 K8s 集群!"
                echo "👉 ArgoCD 应用地址:http://${ARGOCD_SERVER}/applications/${ARGOCD_APP_NAME}"
            }
        }

    }
}
相关推荐
nvd1111 天前
腾讯云轻量服务器折腾 K3s 实录 (续):ArgoCD 部署避坑指南
腾讯云·argocd
做个文艺程序员11 天前
第05篇:K8s CI/CD 全流程:GitOps × ArgoCD × Harbor——Java SaaS 从代码提交到生产部署一键直达
ci/cd·kubernetes·argocd
小哈里16 天前
【K8S】云原生时代的GitOps最佳实践 —— ArgoCD
云原生·kubernetes·云计算·argocd·基础设施
JiaWen技术圈23 天前
GitOps 最佳实践:ArgoCD + GitHub Actions 完整落地
github·argocd
我叫唧唧波2 个月前
【自动化部署】CI/CD 实战(三):让 Argo CD 接管 CD,Jenkins 镜像自动同步到集群
运维·前端·ci/cd·docker·自动化·jenkins·argocd
heimeiyingwang2 个月前
【架构实战】GitOps持续交付架构(ArgoCD/Flux)
架构·argocd
七七powerful2 个月前
K8s 工具安装文档 — Harbor + ArgoCD
容器·kubernetes·argocd
only_Klein4 个月前
Jenkinsfile流水线设计解析
kubernetes·jenkins·argocd·cicd
海鸥815 个月前
ArgoCD App of Apps 模式详解
java·elasticsearch·argocd