Jenkins + Pipline +K8S 流水線項目選擇分支自動發佈、更新、回滾

Jenkins + Pipline +K8S 流水線項目選擇分支自動發佈、更新、回滾

寫在前面:

在生產環境中,咱們一般會使用Jenkins流水線部署k8s羣集,這裏主要介紹使用Jenkins的pipline可選擇分支實現k8s羣集的發佈、更新、回滾功能。java

部署環境

角色 IP地址 部署軟件 硬件 系統
master 192.168.154.134 docker 、k8s 2C2G CentOS 7.6
node02 192.168.154.132 docker 、k8s 2C2G CentOS 7.6
node01 192.168.154.129 docker、docker-compose、harbor 、k8s 2C2G CentOS 7.6
gitlab 192.168.154.131 gitlab 、git、mysql 2C3G CentOS 7.6
jenkins 192.168.154.128 jdk、git、jenkins、docker、maven 2C2G CentOS 7.6

實驗目的

1.分支可選

有2個分支branch=(master,develop),能夠任意選擇分支構建node

2個分支的區別

爲了作實驗,修改背景圖片來作區別
master 分支:背景圖片上面版本號:v1.0
develop 分支:背景圖片上面版本號:v2.0mysql

3.構建方法可選

每一個分支都有2個構建方法action=(release,rollback),能夠任意選擇方法git

4.兩個方法的區別

方法release:正常版本發佈
方法rollback:出現問題時,緊急回滾上一個版本web

實現選擇各分支和各方法,隨意組合,構建版本sql

部署過程

環境服務部署:

參考博客 http://www.javashuo.com/article/p-nubvpgfx-ve.htmldocker

1、編寫流水線腳本

1.編寫Jenkinsfile

pipeline {

  agent any

    // 拉取代碼
  stages {
    stage('GetCode') {
      when { environment name: 'action', value: 'release' }
      steps {
        println("your choices are Branch:${branch} action:${action} version:1.0 ! ")
        sleep 3
      }
    }

    // 代碼編譯
    stage('Maven Build') {
        when { environment name: 'action', value: 'release' }
        steps {
          sh '''
          export JAVA_HOME=/usr/local/java
          /usr/local/apache-maven-3.6.3/bin/mvn clean install -Ptest
          '''
        }
    }

    // 項目打包成鏡像並推送到倉庫
    stage('Build and Push Image') {
      when { environment name: 'action', value: 'release' }
      steps {
      sh '''
        REPOSITORY=192.168.154.129/maven-test01/maven-quartz:v1 #develop是v2
        docker build -t $REPOSITORY .
        docker login 192.168.154.129 -u admin -p Harbor12345
        docker push $REPOSITORY
        '''
      }
    }

    // 部署到K8S主機
    stage('Deploy to k8s') {
      when { environment name: 'action', value: 'release' }
      steps {
        sh '''
        scp k8s.sh root@192.168.154.134:/root/ 
        ssh root@192.168.154.134 "chmod +x k8s.sh && sh /root/k8s.sh"  
        '''}
    }

   // K8S緊急時回滾
    stage('Rollback to k8s') {
          when { environment name: 'action', value: 'rollback' }
          steps {
            echo "k8s images is rolled back! " 
            sh '''
            ssh root@192.168.154.134 "kubectl rollout undo deployment/tomcat-dpm  -n default" 
            '''
          } 
       }  

  }
}

注意:使用ssh命令不能遠程使用k8s相關命令,須要修改master服務器的環境變量shell

vim /root/.bashrc
末尾添加:apache

export KUBECONFIG=/etc/kubernetes/admin.conf

Jenkins + Pipline +K8S 流水線項目選擇分支自動發佈、更新、回滾

source /root/.bashrc #刷新vim

2.編寫Dockerfile

#從harbor拉取鏡像
FROM 192.168.154.129/maven-test01/tomcat:v1
#鏡像構建人信息(可選)
MAINTAINER zhao
#刪除webapps目錄下文件
RUN rm -rf /usr/local/tomcat/webapps/*
#複製打的最新war包到webapps目錄
ADD target/quartz.war /usr/local/tomcat/webapps/

3.編寫鏡像shell腳本

#/bin/bash

#定義文件數變量
value1=`ls /root/tomcat-deployment.yml |wc -l`
value2=`ls /root/tomcat-service.yml |wc -l`

#檢測tomcat-deployment.yml腳本是否存在
if [ "$vlaue1" == "0" ]; then
    scp tomcat-deployment.yml root@192.168.154.134:/root/
    kubectl create -f tomcat-deployment.yml
    echo "tomcat-deployment.yml is created!"
fi

#檢測tomcat-service.yml腳本是否存在
if [ "$vlaue2" == "0" ]; then
    scp tomcat-service.yml root@192.168.154.134:/root/
    kubectl create -f tomcat-service.yml
    echo "tomcat-service.yml is created!"
fi

#檢測2個腳本存在的狀況
if [ "$value1" == "1" ] && [ "$value2" == "1" ]; then
   kubectl set image deployment tomcat-dpm tomcat-cluster=192.168.154.129/maven-test01/maven-quartz:v1  #develop是v2
   echo "k8s image is updated !"
fi
#查看pod
kubectl get pod -o wide
#查看service
kubectl get svc

4.編寫 tomcat-deployment.yml

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: tomcat-dpm
spec:
  replicas: 2
  template:
    metadata:
      labels: # Pod副本擁有的標籤,對應RC的Selector
        app: tomcat-cluster
    spec:
      containers:
      - name: tomcat-cluster
        image: 192.168.154.129/maven-test01/maven-quartz:v1  #develop分支 是v2
        imagePullPolicy: Always
        ports:
        - containerPort: 8080 # 容器應用監聽的端口號
      imagePullSecrets:
      - name: login

5.編寫 tomcat-service.yml

apiVersion: v1
kind: Service
metadata:
  name: tomcat-service
  labels:
    app: tomcat-service
spec:
  type: NodePort
  selector:
    app: tomcat-cluster
  ports:
  - port: 8000
    targetPort: 8080
    nodePort: 32500

2、代碼環境和分支準備

1.將編寫好代碼和腳本上傳到gitlab倉庫

2.gitalb 建立develop分支,上傳代碼和腳本文件

Jenkins + Pipline +K8S 流水線項目選擇分支自動發佈、更新、回滾

備註:develop分支和master內容同樣(除了背景圖)

3、新建Jenkins項目

1.新建流水線項目

Jenkins + Pipline +K8S 流水線項目選擇分支自動發佈、更新、回滾

2.添加參數模塊

Jenkins + Pipline +K8S 流水線項目選擇分支自動發佈、更新、回滾

Jenkins + Pipline +K8S 流水線項目選擇分支自動發佈、更新、回滾

3.配置流水線

Jenkins + Pipline +K8S 流水線項目選擇分支自動發佈、更新、回滾

Jenkins + Pipline +K8S 流水線項目選擇分支自動發佈、更新、回滾

4、構建測試

1、選擇master分支, release 方法

Jenkins + Pipline +K8S 流水線項目選擇分支自動發佈、更新、回滾

查看構建信息

Jenkins + Pipline +K8S 流水線項目選擇分支自動發佈、更新、回滾
Jenkins + Pipline +K8S 流水線項目選擇分支自動發佈、更新、回滾

預期效果:頁面顯示版本爲v1.0

驗證:

1.在master查看

Jenkins + Pipline +K8S 流水線項目選擇分支自動發佈、更新、回滾
Jenkins + Pipline +K8S 流水線項目選擇分支自動發佈、更新、回滾

2.在node上面查看

Jenkins + Pipline +K8S 流水線項目選擇分支自動發佈、更新、回滾

Jenkins + Pipline +K8S 流水線項目選擇分支自動發佈、更新、回滾

3.頁面查看

Jenkins + Pipline +K8S 流水線項目選擇分支自動發佈、更新、回滾
Jenkins + Pipline +K8S 流水線項目選擇分支自動發佈、更新、回滾

結果:和預期同樣,成功!

2、選擇develop分支, release 方法

Jenkins + Pipline +K8S 流水線項目選擇分支自動發佈、更新、回滾

查看構建信息

Jenkins + Pipline +K8S 流水線項目選擇分支自動發佈、更新、回滾

預期效果: 頁面顯示版本爲v2.0

驗證:

網頁查看

Jenkins + Pipline +K8S 流水線項目選擇分支自動發佈、更新、回滾

結果:和預期同樣,成功!

3、選擇develop分支, rollback方法

Jenkins + Pipline +K8S 流水線項目選擇分支自動發佈、更新、回滾

預期效果:頁面顯示版本爲v1.0 (上一次master構建)

驗證

Jenkins + Pipline +K8S 流水線項目選擇分支自動發佈、更新、回滾

結果:和預期同樣,成功!

4、選擇master分支, rollback方法

Jenkins + Pipline +K8S 流水線項目選擇分支自動發佈、更新、回滾

預期效果:頁面顯示版本爲v2.0 (在master構建後回滾)

驗證

Jenkins + Pipline +K8S 流水線項目選擇分支自動發佈、更新、回滾

實驗結果:和預期同樣,成功!

5、注意事項

問題點

問題一:沒法遠程鏈接gitlab

Jenkins + Pipline +K8S 流水線項目選擇分支自動發佈、更新、回滾

解決方法:

1.在分支裏面填寫變量名字$branch

Jenkins + Pipline +K8S 流水線項目選擇分支自動發佈、更新、回滾

問題二:pipline腳本沒法遠程使用k8s命令

解決方法:參考上面的注意事項

問題三:沒有構建參數選項

安裝 Build With Parameters 、Persistent Parameter 插件(添加構建參數過程)
安裝Git Parameter 插件(選擇分支)
必定要重啓Jenkins,才能生效

6、重難點

1.pipline 腳本選擇方法參數(action)

解決方法:添加when條件

release 方法條件: when { environment name: 'action', value: 'release' }
rollback 方法條件: when { environment name: 'action', value: 'rollback' }
插入位置:在 stag和steps之間

2.shell 腳本的發佈與更新

解決方法:使用if判斷

發佈條件:沒有 tomcat-deployment.yml 和tomcat-serive.yml 腳本
更新條件:有 tomcat-deployment.yml 和tomcat-serive.yml 腳本且運行

3.k8s回滾實現

實現前提條件:

1.已經建立pod和service
2.使用k8s更新命令後的鏡像
3.使用k8s回滾命令

4.pod和service腳本編寫

1.編寫腳本,可參考博客 https://blog.51cto.com/13760351/2504882
2.儘可能將腳本寫在gitlab中,不要寫在k8s節點裏面,避免一個個建立,修改。

7、總結

1.這個實驗,我花了快一週的時間去完成的,之間出現不少問題,也解決了。
2.若後續再添加其餘參數構建,部署方法相似
3.推薦作實驗的電腦內存大於16G,要否則會很卡。
4.其實也能夠只用shell腳本實現這些功能,我這裏主要是爲了學習pipline腳本編寫能力。
參考博客:http://www.javashuo.com/article/p-avfqciyb-bd.html

相關文章
相關標籤/搜索