k8s部署jenkins+gitlab实现代码发布

发布时间 2023-10-08 09:20:24作者: 小糊涂90

 

1.#k8s部署jenkins
#k8s中运行jenkins服务,gitlab还是跑在物理机上,因为经常需要clone修改代码。
#基于java命令,运⾏java war包或jar包,本次以jenkins.war 包部署⽅式为例,jenkins的数据保存⾄外部存储(NFS或者PVC)。

1.1#镜像⽬录⽂件:
# pwd
/opt/k8s-data/dockerfile/magedu/jenkins
# tree
.
├── build-command.sh
├── Dockerfile
├── jenkins-2.190.1.war
└── run_jenkins.sh
0 directories, 4 files

1.2#编辑Dockerfile文件
#Jenkins Version 2.190.1
FROM harbor.magedu.net/pub-images/jdk-base:v8.212
MAINTAINER tan 123456@qq.com
ADD jenkins-2.190.1.war /apps/jenkins/
ADD run_jenkins.sh /usr/bin/
EXPOSE 8080
CMD ["/usr/bin/run_jenkins.sh"]

1.3#编辑jenkins启动脚本
#vim run_jenkins.sh
#!/bin/bash
cd /apps/jenkins && java -server -Xms1024m -Xmx1024m -Xss512k -jar jenkins-2.190.1.war --webroot=/apps/jenkins/jenkins-data --httpPort=8080

1.4#构建Jenkins镜像:
#vim build-command.sh
#!/bin/bash
docker build -t harbor.magedu.net/magedu/jenkins:v2.190.1 .
echo "镜像制作完成,即将上传至Harbor服务器"
sleep 1
docker push harbor.magedu.net/magedu/jenkins:v2.190.1
echo "镜像上传完成"

#bash build-command.sh

1.5#验jenkins镜像
# docker run -it --rm -p 8088:8080 harbor.magedu.net/magedu/jenkins:2.190.1

1.6#创建PV/PVC:
需要两个PVC,⼀个保存jenkins的数据,⼀个保存.jenkins的数据。
#ls /opt/k8s-data/yaml/magedu/jenkins/pv
jenkins-persistentvolume.yaml
jenkins-persistentvolumeclaim.yaml

#vim jenkins-persistentvolume.yaml
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: jenkins-datadir-pv
namespace: magedu
spec:
capacity:
storage: 100Gi
accessModes:
- ReadWriteOnce
nfs:
server: 172.31.7.109
path: /data/k8sdata/magedu/jenkins-data

---
apiVersion: v1
kind: PersistentVolume
metadata:
name: jenkins-root-datadir-pv
namespace: magedu
spec:
capacity:
storage: 100Gi
accessModes:
- ReadWriteOnce
nfs:
server: 172.31.7.109
path: /data/k8sdata/magedu/jenkins-root-data

#vim jenkins-persistentvolumeclaim.yaml
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: jenkins-datadir-pvc
namespace: magedu
spec:
volumeName: jenkins-datadir-pv
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 80Gi

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: jenkins-root-data-pvc
namespace: magedu
spec:
volumeName: jenkins-root-datadir-pv
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 80Gi

# kubectl apply -f pv/
persistentvolume/jenkins-datadir-pv created
persistentvolume/jenkins-root-datadir-pv created
persistentvolumeclaim/jenkins-datadir-pvc created
persistentvolumeclaim/jenkins-root-data-pvc created

1.7#验证pv/pvc
# kubectl get pv -n magedu
# kubectl get pvc -n magedu

1.8#yaml文件
#pwd
/opt/k8s-data/yaml/magedu/jenkins

root@k8s-master1:/opt/k8s-data/yaml/magedu/jenkins#
tree
.
├── jenkins.yaml
└── pv
├── jenkins-persistentvolumeclaim.yaml
└── jenkins-persistentvolume.yaml
1 directory, 3 files

#vim jenkins.yaml
kind: Deployment
#apiVersion: extensions/v1beta1
apiVersion: apps/v1
metadata:
labels:
app: magedu-jenkins
name: magedu-jenkins-deployment
namespace: magedu
spec:
replicas: 1
selector:
matchLabels:
app: magedu-jenkins
template:
metadata:
labels:
app: magedu-jenkins
spec:
containers:
- name: magedu-jenkins-container
image: harbor.magedu.net/magedu/jenkins:v2.190.1
#imagePullPolicy: IfNotPresent
imagePullPolicy: Always
ports:
- containerPort: 8080
protocol: TCP
name: http
volumeMounts:
- mountPath: "/apps/jenkins/jenkins-data/"
name: jenkins-datadir-magedu
- mountPath: "/root/.jenkins"
name: jenkins-root-datadir
volumes:
- name: jenkins-datadir-magedu
persistentVolumeClaim:
claimName: jenkins-datadir-pvc
- name: jenkins-root-datadir
persistentVolumeClaim:
claimName: jenkins-root-data-pvc

---
kind: Service
apiVersion: v1
metadata:
labels:
app: magedu-jenkins
name: magedu-jenkins-service
namespace: magedu
spec:
type: NodePort
ports:
- name: http
port: 80
protocol: TCP
targetPort: 8080
nodePort: 38080
selector:
app: magedu-jenkins

1.9#运行jenkins服务
# pwd
/opt/k8s-data/yaml/magedu/jenkins
# kubectl apply -f jenkins.yaml
deployment.extensions/magedu-jenkins-deployment
created
service/magedu-jenkins-service created

1.10#验证pod:
# kubectl get pods -n magedu
# kubectl describe pods magedu-jenkins-deployment-74c4b55576-ssxdv -n magedu

1.11#验证web访问jenkins:
http://192.168.7.110:38080

1.12#创建构建任务
参考我的博客:https://www.cnblogs.com/tanll/p/16655966.html

1.13#脚本内容
#!/bin/bash

#记录脚本开始执行时间
starttime=`date +'%Y-%m-%d %H:%M:%S'`

#变量
SHELL_DIR="/root/scripts"
SHELL_NAME="$0"
K8S_CONTROLLER1="172.31.7.101"
K8S_CONTROLLER2="172.31.7.102"
DATE=`date +%Y-%m-%d_%H_%M_%S`
METHOD=$1
Branch=$2

if test -z $Branch;then
Branch=develop
fi


function Code_Clone(){
Git_URL="git@172.31.5.101:magedu/app1.git"
DIR_NAME=`echo ${Git_URL} |awk -F "/" '{print $2}' | awk -F "." '{print $1}'`
DATA_DIR="/data/gitdata/magedu"
Git_Dir="${DATA_DIR}/${DIR_NAME}"
cd ${DATA_DIR} && echo "即将清空上一版本代码并获取当前分支最新代码" && sleep 1 && rm -rf ${DIR_NAME}
echo "即将开始从分支${Branch} 获取代码" && sleep 1
git clone -b ${Branch} ${Git_URL}
echo "分支${Branch} 克隆完成,即将进行代码编译!" && sleep 1
#cd ${Git_Dir} && mvn clean package
#echo "代码编译完成,即将开始将IP地址等信息替换为测试环境"
#####################################################
sleep 1
cd ${Git_Dir}
tar czf ${DIR_NAME}.tar.gz ./*
}

#将打包好的压缩文件拷贝到k8s 控制端服务器
function Copy_File(){
echo "压缩文件打包完成,即将拷贝到k8s 控制端服务器${K8S_CONTROLLER1}" && sleep 1
scp ${Git_Dir}/${DIR_NAME}.tar.gz root@${K8S_CONTROLLER1}:/opt/k8s-data/dockerfile/linux43/tomcat-app1/
echo "压缩文件拷贝完成,服务器${K8S_CONTROLLER1}即将开始制作Docker 镜像!" && sleep 1
}

#到控制端执行脚本制作并上传镜像
function Make_Image(){
echo "开始制作Docker镜像并上传到Harbor服务器" && sleep 1
ssh root@${K8S_CONTROLLER1} "cd /opt/k8s-data/dockerfile/linux43/tomcat-app1 && bash build-command.sh ${DATE}"
echo "Docker镜像制作完成并已经上传到harbor服务器" && sleep 1
}

#到控制端更新k8s yaml文件中的镜像版本号,从而保持yaml文件中的镜像版本号和k8s中版本号一致
function Update_k8s_yaml(){
echo "即将更新k8s yaml文件中镜像版本" && sleep 1
ssh root@${K8S_CONTROLLER1} "cd /opt/k8s-data/yaml/linux43/tomcat-app1 && sed -i 's/image: harbor.magedu.*/image: harbor.magedu.net\/linux43\/tomcat-app1:${DATE}/g' tomcat-app1.yaml"
echo "k8s yaml文件镜像版本更新完成,即将开始更新容器中镜像版本" && sleep 1
}

#到控制端更新k8s中容器的版本号,有两种更新办法,一是指定镜像版本更新,二是apply执行修改过的yaml文件
function Update_k8s_container(){
#第一种方法
ssh root@${K8S_CONTROLLER1} "kubectl set image deployment/linux43-tomcat-app1-deployment linux43-tomcat-app1-container=harbor.magedu.net/linux43/tomcat-app1:${DATE} -n linux43"
#第二种方法,推荐使用第一种
#ssh root@${K8S_CONTROLLER1} "cd /opt/k8s-data/yaml/linux43/tomcat-app1 && kubectl apply -f tomcat-app1.yaml --record=true"
echo "k8s 镜像更新完成" && sleep 1
echo "当前业务镜像版本: harbor.magedu.net/linux43/tomcat-app1:${DATE}"
#计算脚本累计执行时间,如果不需要的话可以去掉下面四行
endtime=`date +'%Y-%m-%d %H:%M:%S'`
start_seconds=$(date --date="$starttime" +%s);
end_seconds=$(date --date="$endtime" +%s);
echo "本次业务镜像更新总计耗时:"$((end_seconds-start_seconds))"s"
}

#基于k8s 内置版本管理回滚到上一个版本
function rollback_last_version(){
echo "即将回滚之上一个版本"
ssh root@${K8S_CONTROLLER1} "kubectl rollout undo deployment/linux43-tomcat-app1-deployment -n linux43"
sleep 1
echo "已执行回滚至上一个版本"
}

#使用帮助
usage(){
echo "部署使用方法为 ${SHELL_DIR}/${SHELL_NAME} deploy "
echo "回滚到上一版本使用方法为 ${SHELL_DIR}/${SHELL_NAME} rollback_last_version"
}

#主函数
main(){
case ${METHOD} in
deploy)
Code_Clone;
Copy_File;
Make_Image;
Update_k8s_yaml;
Update_k8s_container;
;;
rollback_last_version)
rollback_last_version;
;;
*)
usage;
esac;
}

main $1 $2