<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          KubeSphere + Argo CD,實(shí)現(xiàn)真正的 GitOps!

          共 33197字,需瀏覽 67分鐘

           ·

          2021-07-10 10:24

          來自社區(qū)用戶 willqy 的分享

          Argo CD 簡介

          Argo CD 是用于 Kubernetes 的聲明性 GitOps 持續(xù)交付工具,應(yīng)用程序定義,配置和環(huán)境應(yīng)為聲明性的,并應(yīng)受版本控制,應(yīng)用程序部署和生命周期管理應(yīng)該是自動(dòng)化、可審核且易于理解。

          Argo CD 遵循 GitOps 模式,該模式使用 Git 倉庫作為定義所需應(yīng)用程序狀態(tài)的真實(shí)來源。

          Argo CD 可在指定的目標(biāo)環(huán)境中自動(dòng)部署所需的應(yīng)用程序狀態(tài),應(yīng)用程序部署可以在 Git 提交時(shí)跟蹤對(duì)分支,標(biāo)簽的更新,或固定到清單的特定版本。

          官網(wǎng):https://argoproj.github.io/[1]

          Argo CD 架構(gòu)圖:

          Argo CD 被實(shí)現(xiàn)為 kubernetes 控制器,該控制器持續(xù)監(jiān)視正在運(yùn)行的應(yīng)用程序,并將當(dāng)前的活動(dòng)狀態(tài)與所需的目標(biāo)狀態(tài)(在 Git 存儲(chǔ)庫中指定)進(jìn)行比較。當(dāng)已部署應(yīng)用程序的運(yùn)行狀態(tài)偏離目標(biāo)狀態(tài)時(shí)將被 Argo CD 視為 OutOfSync。

          Argo CD 報(bào)告并可視化差異,同時(shí)提供了自動(dòng)或手動(dòng)將實(shí)時(shí)狀態(tài)同步回所需目標(biāo)狀態(tài)的功能。在 Git 存儲(chǔ)庫中對(duì)所需目標(biāo)狀態(tài)所做的任何修改都可以自動(dòng)應(yīng)用并同步到指定的目標(biāo)環(huán)境中。

          Argo CD 支持的 Kubernetes 配置清單包括 helm charts、kustomize 或純 YAML/json 文件等。

          本篇文章涉及內(nèi)容:

          • 使用 KubeSphere DevOps 實(shí)現(xiàn) CI 部分, CD 部分由 Argo CD 完成;
          • Argo CD 持續(xù)監(jiān)測 Git 倉庫某個(gè)目錄下 yaml 文件變動(dòng),自動(dòng)將 yaml 文件部署到 k8s 集群;
          • Argo CD 持續(xù)監(jiān)測 Harbor 鏡像倉庫某個(gè)鏡像 tag 變動(dòng),自動(dòng)將最新鏡像部署到 K8s 集群。

          基本原理圖:

          準(zhǔn)備 Git 代碼倉庫

          準(zhǔn)備 2 個(gè) Git 倉庫,一個(gè)源碼倉庫,一個(gè) yaml 文件倉庫,源碼和 yaml 文件分離。

          源碼倉庫可參考以下鏈接,離線環(huán)境原因,這里選擇第二個(gè)示例 spring-demo:

          • https://github.com/KubeSphere/DevOps-java-sample[2]
          • https://github.com/willzhang/spring-demo[3]

          yaml 文件倉庫可參考以下鏈接,這里命名為 argocd-gitops:

          • https://github.com/argoproj/argocd-example-apps[4]

          yaml 倉庫下創(chuàng)建 javademo 目錄,并創(chuàng)建 2 個(gè)簡單的 yaml 文件:

          [root@jenkins git]# tree argocd-gitops/
          argocd-gitops/
          ├── javademo
          │   ├── javademo-deployment.yaml
          │   └── javademo-svc.yaml

          javademo-deployment.yaml 示例,當(dāng)前鏡像 tag 可隨意指定,執(zhí)行 CI 時(shí)會(huì)實(shí)時(shí)替換該參數(shù):

          apiVersion: apps/v1
          kind: Deployment
          metadata:
            name: javademo
          spec:
            replicas: 1
            revisionHistoryLimit: 3
            selector:
              matchLabels:
                app: javademo
            template:
              metadata:
                labels:
                  app: javademo
              spec:
                containers:
                - image: 10.39.140.196:8081/apps/javademo:replace
                  name: javademo
                  ports:
                  - containerPort: 8080

          javademo-svc.yaml:

          apiVersion: v1
          kind: Service
          metadata:
            name: javademo
          spec:
            type: NodePort
            ports:
            - port: 8012
              targetPort: 8080
            selector:
              app: javademo

          部署 Argo CD

          Argo CD 有多種部署方式,可以直接部署 yaml 文件:

          kubectl create namespace Argo CD
          kubectl apply -n Argo CD -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml

          這里使用 helm 方式部署,可直接指定 Argo CD server service 類型 nodePort:

          helm repo add argo https://argoproj.github.io/argo-helm

          helm install Argo CD \
            --namespace=Argo CD --create-namespace \
            --set server.service.type=NodePort \
            argo/argo-cd

          查看運(yùn)行的 Pod:

          [root@master ~]# kubectl -n Argo CD get pods
          NAME                                             READY   STATUS    RESTARTS   AGE
          argocd-application-controller-5db8c6f8f9-qnmtr   1/1     Running   0          8h
          argocd-dex-server-84b5cbfbc9-fc7rf               1/1     Running   0          8h
          argocd-redis-7c7c79dcd9-hjhgr                    1/1     Running   0          8h
          argocd-repo-server-5fb9cbb945-9xmc7              1/1     Running   0          8h
          argocd-server-8d8cb6488-pjwt4                    1/1     Running   0          8h

          如果使用 KubeSphere 部署 Argo CD,首先需要配置 Argo CD helm 倉庫,進(jìn)入企業(yè)空間,選擇應(yīng)用模板上傳離線 helm chart 包,或在應(yīng)用倉庫配置公網(wǎng) helm repo 地址。

          完成后進(jìn)入項(xiàng)目,點(diǎn)擊部署新應(yīng)用,選擇 Argo CD helm chart 進(jìn)行部署即可:

          安裝 Argo CD CLI

          要與 Argo CD API Server 進(jìn)行交互,我們需要安裝 CLI 命令:

          wget https://github.com/argoproj/argo-cd/releases/download/v1.7.10/argocd-linux-amd64
          cp argocd-linux-amd64 /usr/local/bin/Argo CD
          chmod +x /usr/local/bin/Argo CD

          Argo CD version

          如果上面 Argo CD 使用 yaml 方式部署,修改 serivce 類型為 nodeport,以便訪問 Argo CD API Server:

          kubectl patch svc argocd-server -n Argo CD -p '{"spec": {"type": "NodePort"}}'

          查看 Argo CD server service,記錄 nodeport 信息:

          [root@master ~ ]# kubectl -n Argo CD get svc
          NAME                    TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE
          argocd-dex-server       ClusterIP   10.99.232.27     <none>        5556/TCP,5557/TCP,5558/TCP   5d
          argocd-metrics          ClusterIP   10.107.37.4      <none>        8082/TCP                     5d
          argocd-redis            ClusterIP   10.106.160.6     <none>        6379/TCP                     5d
          argocd-repo-server      ClusterIP   10.100.101.100   <none>        8081/TCP,8084/TCP            5d
          argocd-server           NodePort    10.106.141.243   <none>        80:31195/TCP,443:32079/TCP   5d
          argocd-server-metrics   ClusterIP   10.109.81.234    <none>        8083/TCP                     5d

          Argo CD 默認(rèn)登錄用戶為 admin,初始密碼為 argocd-server pod 名稱,獲取 pod 名稱:

          podName=`kubectl get pods -n Argo CD -l app.kubernetes.io/name=argocd-server -o name | cut -d'/' -f 2`

          使用 Argo CD CLI 登錄,以 nodeIP 和 nodePort 作為 Argo CD server 登錄地址:

          Argo CD login 10.39.140.248:31195 --username admin --password $podName

          修改默認(rèn)密碼:

          Argo CD account update-password \
          --current-password $podName \
          --new-password Argo CD@123

          瀏覽器登錄 Argo CD UI:

          https://10.39.140.248:31195

          部署 Argo CD 應(yīng)用

          登陸 Argo CD UI 后,選擇 NEW APP 創(chuàng)建 application,選擇 EDIT AS AYML:

          粘貼以下內(nèi)容,SAVE 后點(diǎn)擊左上 CREATE,當(dāng)然也可以直接使用 kubectl apply 命令執(zhí)行以下內(nèi)容,效果相同。

          apiVersion: argoproj.io/v1alpha1
          kind: Application
          metadata:
            name: javademo
            namespace: Argo CD
            finalizers:
              - resources-finalizer.Argo CD.argoproj.io
          spec:
            project: default
            source:
              path: javademo
              repoURL: http://10.39.140.196:10080/gogs/argocd-gitops.git
              targetRevision: HEAD
            destination:
              namespace: apps
              server: https://kubernetes.default.svc
            syncPolicy:
              automated:
                prune: true
                selfHeal: true
                allowEmpty: false
              syncOptions:
              - Validate=false
              - CreateNamespace=true
              retry:
                limit: 5
                backoff:
                  duration: 5s
                  factor: 2
                  maxDuration: 3m

          參數(shù)說明:

          • metadata 字段:指定了應(yīng)用名稱,命名空間必須指定 Argo CD,添加 finalizers 字段可在刪除應(yīng)用時(shí)級(jí)聯(lián)刪除相關(guān) K8s 資源;
          • source 字段:指定了 yaml 文件所在 Git 倉庫 URL,及要監(jiān)測的 yaml 文件存放目錄,該目錄下文件有任何變更 Argo CD 都會(huì)自動(dòng)將其更新部署到 K8s 集群;
          • destination 字段:指定監(jiān)測的 yaml 文件要部署到哪個(gè) K8s 集群及哪個(gè)命名空間下;
          • syncPolicy 字段:指定自動(dòng)同步策略和頻率,不配置時(shí)需要手動(dòng)觸發(fā)同步。

          另外如果使用私有 Git 倉庫,需要?jiǎng)?chuàng)建憑證,這里的憑證是 Argo CD 訪問 yaml 文件 Git 倉庫的憑證:

          等效的 Argo CD cli 命令:

          Argo CD repo add http://10.39.140.196:10080/gogs/argocd-gitops --username gogs --password xxxxxx

          創(chuàng)建后 Argo CD 會(huì)自動(dòng)將 Git 倉庫 javademo 目錄下的 yaml 文件部署到 K8s 集群,此時(shí)應(yīng)用無法正常啟動(dòng),因?yàn)?yaml 文件中的鏡像 tag 還不存在,拉取鏡像會(huì)失?。?/p>

          也可以使用 Argo CD CLI 查看部署的應(yīng)用:

          [root@master ~]# Argo CD app get javademo
          Name:               javademo
          Project:            default
          Server:             https://kubernetes.default.svc
          Namespace:          apps
          URL:                https://10.39.140.248:31195/applications/javademo
          Repo:               http://10.39.140.196:10080/gogs/argocd-gitops.git
          Target:             HEAD
          Path:               javademo
          SyncWindow:         Sync Allowed
          Sync Policy:        Automated (Prune)
          Sync Status:        Synced to HEAD (1b96380)
          Health Status:      Progressing

          GROUP  KIND        NAMESPACE  NAME      STATUS  HEALTH       HOOK  MESSAGE
                 Service     apps       javademo  Synced  Healthy            service/javademo unchanged
          apps   Deployment  apps       javademo  Synced  Progressing        deployment.apps/javademo unchanged

          在 KubeSphere UI 查看 Pod 狀態(tài),一直在重試?yán)$R像:

          使用 kubectl 命令查看,狀態(tài)為 ImagePullBackOff :

          [root@master ~]# kubectl -n apps get pods
          NAME                       READY   STATUS             RESTARTS   AGE
          javademo-64d46bff8-6dgjn   0/1     ImagePullBackOff   0          13m

          [root@master ~]# kubectl -n apps get svc
          NAME       TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
          javademo   ClusterIP   10.111.56.180   <none>        8012/TCP   33m

          KubeSphere 創(chuàng)建流水線

          創(chuàng)建 CI 流水線,使用 KubeSphere DevOps 完成源碼編譯、鏡像構(gòu)建并推送到 Harbor 倉庫,最后以 git commit 方式更新 yaml 倉庫中 image 字段。

          由于此時(shí) Argo CD 持續(xù)監(jiān)測 yaml 倉庫配置文件變動(dòng),當(dāng) CI 部分執(zhí)行 git push 時(shí)便會(huì)觸發(fā) Argo CD 更新 yaml 文件到 k8s 集群。

          在 KubeSphere DevOps 工程下創(chuàng)建一條空流水線,命名為 javademo,進(jìn)入流水線,選擇編輯 Jenkinsfile,復(fù)制以下內(nèi)容:

          pipeline {

              environment {
                  GIT_URL='http://10.39.140.196:10080/gogs/spring-demo.git'
                  GIT_CREDENTIAL_ID = 'git-id'
                  GIT_BRANCH = 'master'
                  REGISTRY = '10.39.140.196:8081/apps/javademo'
                  REGISTRY_CREDENTIAL_ID = 'harbor-id'
              }

              agent {
                  node {
                      label 'maven'
                  }
              }

              stages {

                  stage('SCM Checkout') {
                      steps {
                          git branch: "${GIT_BRANCH}"credentialsId: "${GIT_CREDENTIAL_ID}"url: "${GIT_URL}"
                      }
                  }

                  stage('source build') {
                      steps {
                          container('maven') {
                              sh 'mvn clean package'

                          }
                      }
                  }

                  stage('docker build & push') {
                      steps {
                          script {
                              env.COMMIT_ID = sh(returnStdout: truescript: "git log -n 1 --pretty=format:'%h'").trim()
                              env.TIMESTRAP = sh(returnStdout: truescript: 'date +%Y%m%d%H%M%S').trim()
                              env.DOCKER_TAG = "dev_${TIMESTRAP}_${COMMIT_ID}_${BUILD_NUMBER}"
                          }
                          container('maven') {
                              withCredentials([usernamePassword(passwordVariable : 'DOCKER_PASSWORD' ,usernameVariable : 'DOCKER_USERNAME' ,credentialsId : "$REGISTRY_CREDENTIAL_ID" ,)]) {
                                  sh 'docker build -t $REGISTRY:$DOCKER_TAG .'
                                  sh 'echo "$DOCKER_PASSWORD" | docker login $REGISTRY -u "$DOCKER_USERNAME" --password-stdin'
                                  sh 'docker push $REGISTRY:$DOCKER_TAG'
                              }
                          }
                      }
                  }

                  stage('update docker tag') {
                      environment {
                          BUILD_USER = 'admin'
                          BUILD_USER_EMAIL = 'admin@Argo CD.com'
                          YAML_REPO_URL='http://${username}:${password}@10.39.140.196:10080/gogs/argocd-gitops.git'
                      }

                      steps {
                          withCredentials([usernamePassword(passwordVariable : 'password' ,usernameVariable : 'username' ,credentialsId : "$GIT_CREDENTIAL_ID" ,)]) {
                              sh """
                                  git config --global user.name "$BUILD_USER"
                                  git config --global user.email "$BUILD_USER_EMAIL"
                                  git clone ${YAML_REPO_URL} && cd argocd-gitops
                                  sed -i "s#$REGISTRY.*#${REGISTRY}:${DOCKER_TAG}#g" javademo/javademo-deployment.yaml
                                  git add -A && git commit -m "update tag: ${DOCKER_TAG}" && git push ${YAML_REPO_URL}
                              """

                          }
                      }
                  }
              }
          }

          注意修改相關(guān)參數(shù),流水線中引用了 2 個(gè)憑證:

          • GIT_CREDENTIAL_ID 為內(nèi)網(wǎng) gogs git 倉庫賬號(hào)密碼
          • REGISTRY_CREDENTIAL_ID 為 Harbor 倉庫賬號(hào)密碼

          運(yùn)行流水線前需要在 DevOps 工程下提前創(chuàng)建好相關(guān)憑證,后續(xù)需要在 jenkinsfile 中引用。

          最終流水線如下,點(diǎn)擊運(yùn)行,等待流水線執(zhí)行完成,查看狀態(tài)為成功:

          查看流水線構(gòu)建日志,可以看到執(zhí)行了以下過程,其中最后 update docker tag 步驟,執(zhí)行了 2 個(gè)關(guān)鍵操作,sed 命令替換鏡像 tag,然后執(zhí)行 git push 更新 yaml 倉庫。

          查看推送到 Harbor 倉庫的鏡像:

          Argo CD 監(jiān)測到 yaml 文件變更后更新至 K8s 集群:

          Argo CD UI 查看使用的鏡像:

          登錄 KubeSphere UI 查看應(yīng)用狀態(tài)為運(yùn)行中:

          在 Git 倉庫直接修改 yaml 文件配置,同樣能夠觸發(fā) Argo CD 同步,例如將 service 類型改為 nodePort:

          等待 Argo CD 自動(dòng)同步配置更新到 K8s 集群,瀏覽器以 nodeport 方式訪問 java web 應(yīng)用:

          部署 Argo CD Image Updater

          上面演示了基于 Git 倉庫變更作為應(yīng)用部署的事實(shí)來源,下面演示另一種方式,以鏡像 tag 變更作為應(yīng)用部署的事實(shí)來源。Argo CD 提供了Argo CD Image Updater小工具,用于實(shí)現(xiàn)該操作。

          Argo CD image updater 是一種自動(dòng)更新由 Argo CD[5]管理的 Kubernetes 工作負(fù)載容器鏡像的工具。

          該工具目前還在開發(fā)中,并且有以下特性和局限性:

          • 只能更新由 Argo CD 管理并由 Helm 或 Kustomize 工具生成的應(yīng)用程序的鏡像;
          • 對(duì)廣泛使用的容器倉庫的默認(rèn)支持:Dockerhub、Harbor 私有鏡像倉庫等;
          • 能夠使用匹配器功能過濾鏡像倉庫返回的標(biāo)簽列表;
          • 鏡像拉取 secrets 必須存在于 Argo CD Image Updater 在其中運(yùn)行(或可以訪問)的同一 Kubernetes  集群中。當(dāng)前不可能從其他集群中獲取這些 secrets。
          • 在當(dāng)前版本中,Argo CD Image Updater 不會(huì)將任何更改寫回到 Git 存儲(chǔ)庫。

          官方文檔:

          https://argocd-image-updater.readthedocs.io/en/stable/[6]

          Argo CD Image Updater 部署略顯繁瑣,部署操作如下:

          1、在 Argo CD 中創(chuàng)建本地用戶

          創(chuàng)建 Argo CD 鏡像更新程序需要訪問 Argo CD API Server 的憑據(jù),使用一個(gè) image-updater 具有適當(dāng) API 權(quán)限的帳戶,將以下用戶定義添加到 argocd-cm:

          # kubectl -n Argo CD edit cm argocd-cm
          data:
            accounts.image-updater: apiKey

          為用戶創(chuàng)建訪問令牌,將令牌的值復(fù)制到某個(gè)地方,稍后將需要它。

          Argo CD account generate-token --account image-updater --id image-updater

          2、在 Argo CD 中授予 RBAC 權(quán)限

          image-updater用戶配置適當(dāng)?shù)?RBAC 權(quán)限,Argo CD Image Updater 需要應(yīng)用程序的updateget權(quán)限。

          # kubectl -n Argo CD edit cm argocd-rbac-cm
          data:
            policy.default: role:readonly
            policy.csv: |
              p, role:image-updater, applications, get, */*, allow
              p, role:image-updater, applications, update, */*, allow
              g, image-updater, role:image-updater

          3、 安裝 Argo CD Image Updater

          yaml 文件下載:https://github.com/argoproj-labs/argocd-image-updater/tree/master/manifests[7]

          kubectl create ns argocd-image-updater
          kubectl apply -n argocd-image-updater -f manifests/install.yaml

          4、 配置鏡像倉庫

          即使您不打算使用私有鏡像倉庫,您也需要至少配置一個(gè) empty registries.conf

          # kubectl -n argocd-image-updater edit cm argocd-image-updater-config
          data:
            registries.conf: ""

          沒有此條目argocd-image-updater Pod 將無法啟動(dòng)。

          如果使用私有鏡像倉庫可參考以下配置,以  Harbor 鏡像倉庫為例:

          data:
            Argo CD.insecure: "true"
            log.level: debug
            registries.conf: |
              registries:
              - name: harbor
                api_url: http://10.39.140.196:8081
                prefix: 10.39.140.196:8081
                ping: yes
                insecure: yes

          5、 配置 API 訪問令牌密鑰

          當(dāng)從清單安裝到 Kubernetes 集群時(shí),Argo CD Image Updater 將從名為Argo CD_TOKEN的環(huán)境變量中讀取訪問 Argo CD API 所需的令牌,該環(huán)境變量是從名為Argo CD.token的 secret 字段中設(shè)置的argocd-image-updater-secret。

          Argo CD.token的值應(yīng)設(shè)置為您上面生成的訪問令牌的 base64 編碼值。作為一種捷徑,您可以使用kubectl生成密鑰,并將其應(yīng)用于現(xiàn)有資源:

          YOUR_TOKEN=xxx
          kubectl create secret generic argocd-image-updater-secret \
            --from-literal Argo CD.token=$YOUR_TOKEN --dry-run -o yaml |
            kubectl -n argocd-image-updater apply -f -

          更改后,必須重新啟動(dòng) argocd-image-updater Pod,即運(yùn)行

          kubectl -n argocd-image-updater rollout restart deployment argocd-image-updater

          新建 yaml 倉庫 Kustomize 文件

          由于 image updater 僅支持 helm 或 Kustomize 類型 yaml,這里新建一個(gè)基于 Kustomize 的 yaml 目錄,修改 yaml 中的參數(shù)不要與之前的沖突即可:

          [root@jenkins git]# tree argocd-gitops/kustomize-javademo/
          argocd-gitops/kustomize-javademo/
          ├── javademo-deployment.yaml
          ├── javademo-svc.yaml
          └── kustomization.yaml

          javademo-deployment.yaml

          apiVersion: apps/v1
          kind: Deployment
          metadata:
            name: javademo-tag
          spec:
            replicas: 1
            revisionHistoryLimit: 3
            selector:
              matchLabels:
                app: javademo-tag
            template:
              metadata:
                labels:
                  app: javademo-tag
              spec:
                containers:
                - image: 10.39.140.196:8081/apps/javademo:replace
                  name: javademo-tag
                  ports:
                  - containerPort: 8080

          javademo-svc.yaml

          apiVersion: v1
          kind: Service
          metadata:
            name: javademo-tag
          spec:
            ports:
            - port: 8012
              targetPort: 8080
            selector:
              app: javademo-tag

          kustomization.yaml

          amePrefix: kustomize-

          resources:
          - javademo-deployment.yaml
          - javademo-svc.yaml
          apiVersion: kustomize.config.k8s.io/v1beta1
          kind: Kustomization

          登錄 Argo CD UI 新建一個(gè) Argo CD 應(yīng)用,和之前相比增加了 annotations 參數(shù),指定要監(jiān)測的鏡像地址,更新策略為 latest,另外修改了 source path:

          apiVersion: argoproj.io/v1alpha1
          kind: Application
          metadata:
            annotations:
              argocd-image-updater.argoproj.io/image-list: javademo=10.39.140.196:8081/apps/javademo
              argocd-image-updater.argoproj.io/javademo.update-strategy: latest
            name: javademo-tag
            namespace: Argo CD
            finalizers:
              - resources-finalizer.Argo CD.argoproj.io
          spec:
            destination:
              namespace: apps
              server: https://kubernetes.default.svc
            project: default
            source:
              path: kustomize-javademo
              repoURL: http://10.39.140.196:10080/gogs/argocd-gitops.git
              targetRevision: HEAD
            syncPolicy:
              automated:
                prune: true
                selfHeal: true
                allowEmpty: false
              syncOptions:
              - Validate=false
              - CreateNamespace=true
              retry:
                limit: 5
                backoff:
                  duration: 5s
                  factor: 2
                  maxDuration: 3m

          登錄 KubeSphere UI 重新創(chuàng)建一條 ci 流水線,刪除 update docker tag 步驟即可,已經(jīng)不需要基于 git push 來觸發(fā)應(yīng)用部署了:

          pipeline {

              environment {
                  GIT_URL='http://10.39.140.196:10080/gogs/spring-demo.git'
                  GIT_CREDENTIAL_ID = 'git-id'
                  GIT_BRANCH = 'master'
                  REGISTRY = '10.39.140.196:8081/apps/javademo'
                  REGISTRY_CREDENTIAL_ID = 'harbor-id'
              }

              agent {
                  node {
                      label 'maven'
                  }
              }

              stages {

                  stage('SCM Checkout') {
                      steps {
                          git branch: "${GIT_BRANCH}"credentialsId: "${GIT_CREDENTIAL_ID}"url: "${GIT_URL}"
                      }
                  }

                  stage('source build') {
                      steps {
                          container('maven') {
                              sh 'mvn clean package'

                          }
                      }
                  }

                  stage('docker build & push') {
                      steps {
                          script {
                              env.COMMIT_ID = sh(returnStdout: truescript: "git log -n 1 --pretty=format:'%h'").trim()
                              env.TIMESTRAP = sh(returnStdout: truescript: 'date +%Y%m%d%H%M%S').trim()
                              env.DOCKER_TAG = "dev_${TIMESTRAP}_${COMMIT_ID}_${BUILD_NUMBER}"
                          }
                          container('maven') {
                              withCredentials([usernamePassword(passwordVariable : 'DOCKER_PASSWORD' ,usernameVariable : 'DOCKER_USERNAME' ,credentialsId : "$REGISTRY_CREDENTIAL_ID" ,)]) {
                                  sh 'docker build -t $REGISTRY:$DOCKER_TAG .'
                                  sh 'echo "$DOCKER_PASSWORD" | docker login $REGISTRY -u "$DOCKER_USERNAME" --password-stdin'
                                  sh 'docker push $REGISTRY:$DOCKER_TAG'
                              }
                          }
                      }
                  }
              }
          }

          查看流水線日志,鏡像成功推送到 harbor 倉庫:

          harbor 倉庫鏡像 tag 更新,Argo CD image updater 自動(dòng)將最新 tag 更新到 K8s 集群。

          查看鏡像 tag

          以后每次 Harbor 倉庫生成最新鏡像,Argo CD 都會(huì)自動(dòng)將其更新到 K8s 集群。

          腳注

          [1]

          https://argoproj.github.io/: https://argoproj.github.io/

          [2]

          https://github.com/KubeSphere/DevOps-java-sample: https://github.com/KubeSphere/DevOps-java-sample

          [3]

          https://github.com/willzhang/spring-demo: https://github.com/willzhang/spring-demo

          [4]

          https://github.com/argoproj/argocd-example-apps: https://github.com/argoproj/argocd-example-apps

          [5]

          Argo CD: https://github.com/argoproj/argo-cd

          [6]

          https://argocd-image-updater.readthedocs.io/en/stable/: https://argocd-image-updater.readthedocs.io/en/stable/

          [7]

          https://github.com/argoproj-labs/argocd-image-updater/tree/master/manifests: https://github.com/argoproj-labs/argocd-image-updater/tree/master/manifests



          瀏覽 96
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产成人无码精品久久久一区 | 操一操逼一逼 | 日韩三级片播放 | 国产农村乱╳╳╳乱免费下载 | 天天综合日网射 |