Jenkins+pipeline+k8s自动化发布

 

部署方案:Jenkins是部署在虚拟机上的,

Jenkins插件:

 

 

1.创建Jenkins项目,选择流水线

 

2.配置选择类型(发布版本、回滚版本)

ps:红色圈中的很重要,这个是上一步的key值

 

Groovy Script里的脚本:

if(status.equals("Deploy")){

    def gettags = ("git ls-remote -h root@xx.xx.xx.xx:mcxin/test.git").execute()

    gettags.text.readLines().collect { it.split()[1].replaceAll('refs/heads/', '') }.unique()

}else{
	def myFileDirectory = "/data/docker/rmt-image/test/";
    def myFileName = "version.txt"
	def myFile = new File(myFileDirectory + myFileName).readLines()
	myFile.each{
		println it
	}

}

 

Jenkins页面显示样式

3.编写pipeline脚本

 

脚本内容:

      // 部署远程主机ip地址,需要通过密钥的方式设置免密登录
   def remoteIp = "远程服务ip"
   def remotePort='22'
   // 远程tomcat位置(windows要使用/来表示路径)
   def tomcatPath = "/data/docker/k8s-rmt/test"
	def project='rmt'
	def service='test'
	def v='123'
	def img=''
   node (){ //指定Slave标签
 
   stage('Git Checkout') {
       if("Deploy" == env.status){
                 checkout([$class: 'GitSCM', branches: [[name: '${Deploy}']],
						userRemoteConfigs: [[credentialsId: '《Jenkins的用户id》', 
							url: '《git地址》']]])
       }else{
           echo "回滚版本跳过拉取代码";
       }

	}
   stage('Maven Build') {
       if("Deploy" == env.status){
        sh '''
        mvn -f pom.xml clean package -Ppresit -Dmaven.test.skip=true
        '''
       }else{
           echo "回滚版本跳过拉取代码";
       }
        
   }
   stage('push') {
	    if("Deploy" == env.status){
		echo "pushde时间:${v}"
		sh '''
		cp target/*.jar /data/docker/rmt-image/test/
		'''
		v = sh(script: "date +%Y%m%d.%H%M%S", returnStdout: true).trim()
		sh(script: "cd /data/docker/rmt-image/test/ && ./build.sh ${v} ${project} ${service}", returnStdout: true).trim()
		img = "ucapxcy.com:5000/${project}-${service}:v${v}"
	    }else{
           echo "回滚版本跳过拉取代码";
       }
		
   }
   stage('end') {
       if("Rollback" == env.status){
            img = env.Deploy
       }
      
		sh '''
		pwd 
		'''
		echo "end的时间出:${v}"
		sh(script: "cd /data/docker/rmt-image/test/ && ./sshtest.sh ${img}", returnStdout: true).trim()
		sh(script: "cd /data/docker/rmt-image/test/ && ./writeVersion.sh ${img}", returnStdout: true).trim()
		sh(script: "cd /data/docker/rmt-image/test/ && ./deleteVersion.sh ./version.txt", returnStdout: true).trim()
		echo "end的img:${img}"
   }
}

 

5.推送镜像脚本:

项目目录

 

1) Dockerfile脚本:

FROM centos

MAINTAINER mcxin

COPY jdk11 jdk11
COPY xcy-admin-web-0.0.1-SNAPSHOT.jar xcy-admin-web-0.0.1-SNAPSHOT.jar

ENV JAVA_HOME=/jdk11
ENV PATH=$JAVA_HOME/bin:$PATH
ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

EXPOSE 8080

ENTRYPOINT ["java","-jar","/xcy-admin-web-0.0.1-SNAPSHOT.jar","--server.port=8080"]

2)build.sh推送镜像脚本

#!/bin/bash
project="$2"
service="$3"

if [ -n "$1" ]
then
  v="$1"
else
  v=`date +%Y%m%d.%H%M%S`
fi
docker login dockerimg.com:5000 -u admin -p admin123

docker build -t $project-$service .
docker tag $project-$service dockerimg.com:5000/$project-$service:v$v
docker push dockerimg.com:5000/$project-$service:v$v
echo "dockerimg.com:5000/$project-$service:v$v"

6.更新k8s的pod服务

目前使用的方式是通过远程连接到node服务器的替换yaml文件里的参数来实现的。

sshtest.sh脚本如下:

#!/usr/bin/expect

set ip xxx.xx.xxx.xx
set pass 这里写服务器密码
set timeout 30
set pwd /data/docker/k8s-rmt/usermanage/
set yamlname usermanage
set image [lindex $argv 0]
spawn ssh root@$ip
expect {
        "(yes/no)" {send "yes\r"; exp_continue}
        "password:" {send "$pass\r"}
}
expect "root@*"  {send "cd $pwd\r"}
expect "root@*"  {send "mv -f $yamlname.yaml $yamlname.yaml.bak\r"}
expect "root@*"  {send "cp parent.yaml $yamlname.yaml\r"}
expect "root@*"  {send "sed -i 's?<BUILD_TAG>?$image?' $pwd$yamlname.yaml\r"}
expect "root@*"  {send "kubectl apply -f $yamlname.yaml\r"}
expect "root@*"  {send "exit\r"}
expect eof

writeVersion.sh写入版本号脚本:

#! /bin/bash
echo $1 >> ./version.txt

deleteVersion.sh删除版本号脚本:

#! /bin/bash
total=`wc -l $1 | awk '{print $1}'`
limit=5
deleteNum=0
echo "total = $total"
if [[ $total -gt $limit ]]
then
  deleteNum=$((total-limit)) 
  sed -i  '1,'"$deleteNum"'d' $1
  echo "清理了$deleteNum条数据"
fi
  echo '没有清理'

7.node节点上的目录展示:

 

文件说明:

parent.yaml pod文件,主要用来在里面写标准的替换字符

svc-test.yaml k8s里的server,对外暴露服务的,启动一次就不用管了

test.yaml 服务k8s启动文件

test.yaml.bak 每次更新之前的备份文件

 

parent.yaml文件内容:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: rmt-test
  labels:
    app: rmt-test
spec:
  replicas: 1
  selector:
    matchLabels:
      app: rmt-test
  template:
    metadata:
      labels:
        app: rmt-test
    spec:
      imagePullSecrets:
      - name: myregistrykey
      containers:
      - name: rmt-test
        image: <BUILD_TAG>
        imagePullPolicy: Always
        ports:
        - containerPort: 8080

svc-test.yaml文件内容:

 

apiVersion: v1
kind: Service
metadata:
 name: rmt-test
spec:
 selector:
  app: rmt-test
 ports:
 - name: web
   port: 8080
   targetPort: 8080
   nodePort: 30001
 type: NodePort

test.yaml文件内容:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: rmt-test
  labels:
    app: rmt-test
spec:
  replicas: 1
  selector:
    matchLabels:
      app: rmt-test
  template:
    metadata:
      labels:
        app: rmt-test
    spec:
      imagePullSecrets:
      - name: myregistrykey
      containers:
      - name: rmt-test
        image: dockerimg.com:5000/rmt-test:v20200318.220117
        imagePullPolicy: Always
        ports:
        - containerPort: 8080

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值