部署方案: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