K8S+Jenkins實現SpringBoot項目CI/CD

2020-08-27 木訥大叔愛運維


、 兩篇文章實現了K8S+Jenkins+Maven基礎環境,通過此環境我們進一步實現SpringBoot項目的CI/CD。

K8S+Jenkins+maven基礎環境目前能夠實現:

  1. Jenkins slave在K8S集群內的動態構建;
  2. Maven實現編譯、打包、構建鏡像並push到遠程docker倉庫;

剩下的工作需在Jenkins流水線中調用kubectl 命令實現SpringBoot項目在K8S中部署了。

要想Jenkins能夠調用kubectl命令,需要安裝相關插件,下面我們來介紹下。

Kuberntes相關插件

Jenkins中有兩個插件可以實現與Kubernetes進行交互。

一、Kubernetes CLI

此插件允許在Jenkins Job中通過kubectl與k8s集群進行交互,主要是通過kubectl執行各種命令。

1.安裝Kubernetes CLI插件

2.通過&34;生成指令


通過&34;來使用插件:

  • Credentials:使用前面文章在devops命令空間中的sa--jenkins
  • Kubernetes server endpoint:k8s api server;
  • Namespace:需要執行命令的命名空間;

3.添加需要執行的命令

withKubeConfig(caCertificate: &39;, clusterName: &39;, contextName: &39;, credentialsId: &39;, namespace: &39;, serverUrl: &39;) { // 自定義指定塊 sh &34; }

4.執行流水線

pipeline { agent { label &39; } stages { stage(&39;) { steps{ git credentialsId: &39;, url: &39; } } stage(&39;) { steps { container(&39;) { sh &34;&34;&34; } } } stage(&39;) { steps { withKubeConfig(caCertificate: &39;, clusterName: &39;, contextName: &39;, credentialsId: &39;, namespace: &39;, serverUrl: &39;) { // 自定義指令塊 sh &34; } } } }}


由此可見,通過此插件可以在k8s中執行任何命令。

注意:

  1. 插件使用的認證server account:jenkins ,綁定的是cluster-admin角色,因此可以不同的namespace中執行命令。
  2. 如果構建過程中報錯:&34;,需從宿主機掛載kubectl命令。


二、Kubernetes Continuous Deploy

此插件用於將資源配置文件部署到k8s集群,主要是應用yaml配置文件。

1.安裝Kubernetes Continuous Deploy插件

2.添加憑據

&34;中的內容為&34;內容,直接拷貝即可。

3.通過&34;生成指令

通過&34;來具體使用插件:

  • Kubeconfig:使用上面創建的憑據;
  • Config Files:&34; 所使用的yaml配置文件,如helloworld.yaml,具體位置可根據實際情況填寫;
  • Kubernetes Namespace for secret:harbor倉庫密鑰所在的命名空間;
  • Secret Name:harbor倉庫使用的secret;

注意:pod中的容器鏡像存在於自建的遠程harbor倉庫,拉取鏡像時需要進行認證,在k8s中我們將此密碼在k8s以secret形式存放。

4.添加需要執行的命令

kubernetesDeploy configs: &39;, kubeconfigId: &39;, secretName: &39;, secretNamespace: &39;, ssh: [sshCredentialsId: &39;, sshServer: &39;], textCredentials: [certificateAuthorityData: &39;, clientCertificateData: &39;, clientKeyData: &39;, serverUrl: &39;]39;helloworld.yaml&39;k8s-cd-plugin&39;harbor&39;test&34;Kubernetes Continuous Deploy&34;Kubernetes CLI&FF0000; --tt-darkmode-color: 生產環境helloworld-prod.yaml 以測試模板配置文件為例 hosts解析 hostAliases: - ip: &34; hostnames: - &34; - &34; - ip: &34; hostnames: - &34; containers: - name: helloworld 鏡像tag image: harbor.test.cn/helloworld/helloworld:{tag} imagePullPolicy: IfNotPresent livenessProbe: httpGet: path: / port: 8080 initialDelaySeconds: 60 timeoutSeconds: 5 readinessProbe: httpGet: path: / port: 8080 initialDelaySeconds: 60 timeoutSeconds: 5 ports: - containerPort: 8080 resources: limits: cpu: &34; memory: &34; requests: cpu: &34; memory: &34; volumeMounts: - name: logdir mountPath: /logs - name: localtime mountPath: /etc/localtime - name: timezone mountPath: /etc/timezone imagePullSecrets: - name: harbor volumes: - name: logdir emptyDir: {} - name: localtime hostPath: path: /etc/localtime - name: timezone hostPath: path: /etc/timezone---apiVersion: v1kind: Servicemetadata: name: helloworld namespace: testspec: type: NodePort selector: app: helloworld ports: - port: 8080 targetPort: 8080---apiVersion: extensions/v1beta1kind: Ingressmetadata: name: helloworld namespace: testspec: rules: - host: hello.test.cn http: paths: - path: / backend: serviceName: helloworld servicePort: 8080

模板文件中我們設置了JAVA_OPTS、鏡像tag變量,經流水線傳遞具體參數後,將生成最終的helloworld-test.yaml文件,以便&34;插件調用。

二、流水線配置

Jenkins新建流水線項目並添加以下流水線:

pipeline { agent { label &39; } environment { branch = &34; JAVA_OPTS = &34; } stages { stage(&39;) { steps{ git branch: &39;, credentialsId: &39;, url: &39; } } stage(&39;) { steps { container(&39;) { sh &34;&獲取git版本作為鏡像tag tag=`git rev-parse HEAD` echo \$tag mvn clean package docker:build -DdockerImageTags=\$tag -Dmaven.test.skip=true -DpushImageTag 34;s\$tag{JAVA_OPTS}g&34;&34; } } } stage(&39;) { when { environment name: &39;, value: &39; } steps { kubernetesDeploy configs: &39;, kubeconfigId: &39;, secretName: &39;, secretNamespace: &39; } } }}

要點:

  • 通過environment傳遞JAVA_OPTS變量;
  • 鏡像tag無法通過獲取環境變量GIT_COMMIT,因此只能通過命令獲取;
  • 通過when來匹配不同環境的部署,由於不是多分支流水線,因此不能使用when { branch: &39;},但能通過environment進行匹配判斷;

最終部署結果如下:

如圖:Jenkins的&34;插件直接應用的yaml,如果換成&34;則需要執行&34;,大家可根據自己的習慣選擇不同的插件。

三、回滾

&34; 是一個滾動升級的過程,即當readinessProbe探針檢查正常後才會加入到service的Endpoints提供服務;最終原來的pod將會被終止、刪除。

既然滾動升級可以了,我們再來嘗試下回滾:

kubectl get deploy -n testNAME READY UP-TO-DATE AVAILABLE AGEhelloworld 1/1 1 1 4d18h kubectl rollout history deploy helloworld -n testdeployment.apps/helloworld REVISION CHANGE-CAUSE2 <none>3 <none>4 <none>5 <none>6 <none>7 <none>8 <none>9 <none> kubectl rollout undo deploy/hellworlddeployment.apps/helloworld rolled back kubectl rollout undo deploy/hellworld --to-revision=3

總結

為實現整個SpringBoot項目CI/CD的整個過程,因文章篇幅問題,我們從基礎環境的準備到本文分別總結了4篇文章,另外3篇為:

相關焦點

  • k8s集群CI/CD集成介紹四:Jenkins部署應用到rancher集群
    容器編排從幾年前群雄割據、各方亂戰,到如今Google的k8s一統天下。能迅速力挽狂瀾,已說明其技術實力。但k8s複雜的架構,不太友好的文檔,確實讓一些初學者望而卻步。近期正好一直在學習k8s的東西,走了一些彎路。整理出來以備參考。由於內容過多,本文將分多章介紹k8s集群構建過程,並發布demo到k8s集群,簡單演示一個完整CI/CD的自動化過程。
  • k8s集群CI&CD集成介紹四:Jenkins部署應用到rancher集群
    容器編排從幾年前群雄割據、各方亂戰,到如今Google的k8s一統天下。能迅速力挽狂瀾,已說明其技術實力。但k8s複雜的架構,不太友好的文檔,確實讓一些初學者望而卻步。近期正好一直在學習k8s的東西,走了一些彎路。整理出來以備參考。
  • 記一次Gitlab-CI集成K8S實錄
    Gitlab-ci綁定k8s集群我們可以先手動一個K8S集群的集成,預置好具有對K8S集群有操縱權限的帳號,供後續使用。/cd variables獲取kube_config編碼串,定義到變量中,利用kube_config訪問集群,在deploy階段可有用echo $(cat ~/.kube/config | base64) | tr -d " "gitlab-ci部署階段,將編碼串解碼寫入配置variables: KUBECONFIG
  • k8s管理 jenkins集群彈性伸縮
    碼雲現成https://gitee.com/q7104475/k8s-jenkins-cik8s-jenkins-ci介紹/參考文章在Kubernetes上部署和伸縮Jenkins7104475/jenkins-master:v1.0 . && \docker build -f Dockerfile-jenkins-slave-jnlp1 -t 7104475/jenkins-slave-jnlp1:v1.0 . && \docker build -f Dockerfile-jenkins-slave-jnlp2 -t 7104475/jenkins-slave-jnlp2
  • SpringBoot+GitLab+Docker+Jenkins實現持續集成下
    ADD /$ARTIFACTID-$ARTIFACTVERSION.jar $HOME_PATH/$ARTIFACTID.jarENTRYPOINT ["java", "-jar", "springboot_jenkins01.jar"]這一切都準備完畢之後,我們把項目push到上一節搭建好的GitLab中。
  • Jenkins master位於k8s集群外,實現jenkins slave的動態構建
    既然&34;支持Jenkins master在k8s集群外部,那麼就不必要再在k8s中創建了。下面我們就來詳細介紹下jenkins master位於k8s集群外,實現jenkins slave的動態構建,其中有很多細節問題牽扯到docker、k8s的使用問題,我們一一講解。
  • Jenkins+Docker+git多分支實現springboot項目多環境快速交付
    簡介中我們實現了spring項目在jenkins slave上動態構建。但是在實際CI/CD應用過程中,運維可能以下問題:環境校驗 springboot項目的多個git分支,不同分支對應不同的環境。版本發布在jenkins slave上進行,在master上通過標籤將構建任務綁定到指定的slave上;環境校驗根據git的test/master分支,分別對應任務名稱中的test/prod,以此來實現環境校驗;操作校驗分為發版/回滾/重啟,分別實現不同的功能需求; 發版/回滾/重啟在伺服器上執行的
  • 使用 GitLab CI 與 Argo CD 進行 GitOps 實踐
    -l app.kubernetes.io/name=argocd-server -o name | cut -d'/' -f 2argocd-server-7877ff8889-zp7tq用上面的用戶名和密碼即可登錄成功,接下來我們在 GitLab 中來創建示例項目。
  • Jenkins自動構建Springboot(-) 小白系列
    建議2核4g起步)1.jenkins安腳本創建(複製粘貼運行就好啦)mkdir -p /home/shtouch /home/sh/jenkins_install.sh1.1 jenkins_install.sh
  • 12個可以替代jenkins的CI/CD工具
    但是,與當前的用戶界面趨勢相比,它的界面已經過時,用戶界面也不夠友好(苦葉子推薦你用script pipeline:Jenkins之jenkinsfile基礎)。此外,Jenkin配置可能比較複雜,而且它還有許多其他缺點。這裡列出了幾種可以替代Jenkins的工具。這個列表折衷了具有流行特性和最新下載連結的商業和開源的continuos集成工具。
  • Jenkins Pipeline結合github拉取請求自動進行項目發布(CI/CD)
    由於準備發布所需的步驟較多,軟體項目的發布過程需要一段時間,並且容易出現人為錯誤。通過Jenkins Pipeline自動執行某些步驟來簡化發布流程將會大大改善發布的工作流程,這種業界一般稱為自動持續集成和自動持續部署(CI/CD),一般來說可以結合Jenkins和Github結合來完成,當然如果是私有倉庫用的是gitlab做的話,gitlab自有一套強大的CI/CD流程,在自己體系內就可以完成,而無需Jenkins來做了,以後有機會蟲蟲會和大家一起探討gitlab的ci/cd功能
  • k8s集群CI/CD集成介紹二:rancher搭建k8s集群環境
    容器編排從幾年前群雄割據、各方亂戰,到如今Google的k8s一統天下。能迅速力挽狂瀾,已說明其技術實力。但k8s複雜的架構,不太友好的文檔,確實讓一些初學者望而卻步。近期正好一直在學習k8s的東西,走了一些彎路。整理出來以備參考。由於內容過多,本文將分多章介紹k8s集群構建過程,並發布demo到k8s集群,簡單演示一個完整CI/CD的自動化過程。
  • 使用 Jenkins + Ansible 實現 Spring Boot 自動化部署101
    本文首發於:Jenkins 中文社區https://jenkins-zh.cn/wechat/articles/2019/05/2019-05-20-jenkins-ansible-springboot/1.
  • 手把手帶你玩轉k8s-jenkins安裝與流水線
    前言本系列教程最主要的目地是使用k8s做持續集成,從本文開始,才算是正式進入主題。5分鐘在阿里雲Kubernetes服務上搭建jenkins環境並完成應用構建到部署的流水線作業為了通用性,這裡並沒有使用ack-jenkins,而是使用官方的 jenkinsci/blueocean鏡像。jenkins中文官網因為後面要講的jenkins內容需要聯網,但是之前購買的伺服器是沒有綁定公網ip的,這裡也不想購買綁定了(省錢)。
  • k8s集群CI/CD集成介紹一:環境準備
    容器編排從幾年前群雄割據、各方亂戰,到如今Google的k8s一統天下。能迅速力挽狂瀾,已說明其技術實力。但k8s複雜的架構,不太友好的文檔,確實讓一些初學者望而卻步。近期正好一直在學習k8s的東西,走了一些彎路。整理出來以備參考。由於內容過多,本文將分多章介紹k8s集群構建過程,並發布demo到k8s集群,簡單演示一個完整CI/CD的自動化過程。
  • k8s+jenkins中使用自定義maven鏡像
    好在,現在的工具基本都支持docker部署,這樣只需將工具的docker化添加到pod中,k8s就可以靈活使用了。需求k8s+jenkins中直接使用官方maven鏡像雖然也可以打包,但是打包過程中下載存儲在
  • docker 安裝 jenkins 就是這麼簡單?
    jenkins是一個開源軟體項目,是基於Java開發的一種持續集成工具,用於監控持續重複的工作,旨在提供一個開放易用的軟體平臺,使軟體的持續集成變成可能docker如何安裝jenkins?java項目,採用的maven管理jar,如果採用安裝完jenkins後在線直接安裝的話,會非常慢,所以我們提前在宿主機安裝好maven,然後採用docker 掛載的方式進行安裝處理 大概在150行<mirror> <id>aliyunmaven</id> <mirrorOf>*</mirrorOf>
  • Jenkins 多環境 CI/CD 架構設計
    >Jenkins相關目錄設計----jenkins-ex jenkins構建時使用到的目錄------software Jenkins安裝目錄--------master--------slave-
  • k8s集群CI/CD集成介紹三:rancher應用部署
    容器編排從幾年前群雄割據、各方亂戰,到如今Google的k8s一統天下。能迅速力挽狂瀾,已說明其技術實力。但k8s複雜的架構,不太友好的文檔,確實讓一些初學者望而卻步。近期正好一直在學習k8s的東西,走了一些彎路。整理出來以備參考。由於內容過多,本文將分多章介紹k8s集群構建過程,並發布demo到k8s集群,簡單演示一個完整CI/CD的自動化過程。
  • 基於Kubernetes Jenkins CICD
    Job時,會自動創建一個Jenkins Slave,Job完成後,Slave自動註銷並刪除容器,資源自動釋放,並且Kubernetes會根據每個資源的使用情況,動態分配slave到空閒的節點上創建,降低出現因某節點資源利用率高,降低出現因某節點利用率高出現排隊的情況擴展性好,當Kubernetes集群的資源嚴重不足導致Job排隊等待時,可以很容器的添加一個Kubernetes Node到集群,從而實現擴展二