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

相关文章
相关标签/搜索