0%

Jenkins在SpringCloud微服务项目Devops中发挥的作用

“持而盈之,不如其已。
揣而锐之,不可常保。
金玉满堂,莫之能守;富贵而骄,自遗其咎。
功遂身退,天之道也。”1

Jenkins在SpringCloud微服务项目Devops中发挥的作用

Jenkins

本文不做具体安装部署的介绍,我Github上有一个完整的基于docker-compose的安装套件(同时还包括Mysql,Nginx,RabbitMQ,FastDFS,Redis等),可以去参考

Jenkins是以job(常用的有:自由风格模式 多任务模式)的方式提供打包服务,每一个job,都提供了一个方便“插一脚”的前置处理后置处理,均可以调用shell指令的方式进行接入整合。

  • 前置处理:便于做一些备份工作;
  • 后置处理:打包之后,调用类似“跳板机”上的shell脚本进行集群(联调环境,测试环境,生产环境)的服务部署。

Devops持续集成部署架构

架构图:
jenkins-in-devops.png

部署流程解析

1.通过jenkins上job构建服务,并通过后置处理脚本触发跳板机对应脚本 以部署生产环境为例,触发prod_one_deploy.sh

1
export JAVA_HOME=/usr/java/jdk1.8.0_121
2
export PATH=$JAVA_HOME/bin:$PATH
3
#export JAVA_OPTS='-Djava.rmi.server.hostname=106.14.33.163 -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9994 -Dcom.sun.management.jmxremote.rmi.port=9994 -Dcom.sun.management.jmxremote.authenticate=true -Dcom.sun.management.jmxremote.ssl=false'
4
5
marvel_jar_version="1.0.0-RELEASE"
6
marvel_module_dir="/marvel/product/deploy"
7
marvel_module_name=$1
8
9
#marvel_jenkins2jar_dir="/marvel/product/deploy"
10
#marvel_module_dir="/marvel/product/jenkins2jar"
11
marvel_module_name=$1
12
13
#mkdir $marvel_module_dir/$marvel_module_name &>/dev/null
14
#mkdir $marvel_module_dir/$marvel_module_name/target &>/dev/null
15
16
#cp $marvel_jenkins2jar_dir/$marvel_module_name/target/$marvel_module_name-$marvel_jar_version.jar $marvel_module_dir/$marvel_module_name/target/$marvel_module_name-$marvel_jar_version.jar
17
18
deploy_interval_seconds=`cat $marvel_module_dir/conf/deploy_interval_seconds.txt` ## 设定服务启动间隔时间,单位秒
19
20
for ip in `cat $marvel_module_dir/conf/$marvel_module_name.txt`
21
do
22
	echo "开始部署节点[$ip]上的服务[$marvel_module_name]...."
23
	echo "上传服务JAR到节点[$ip]/marvel/deploy/$marvel_module_name/ ..."
24
	ssh root@$ip "mkdir -p /marvel/deploy/$marvel_module_name > /dev/null"
25
	scp $marvel_module_dir/$marvel_module_name/target/$marvel_module_name-$marvel_jar_version.jar root@$ip:/marvel/deploy/$marvel_module_name/$marvel_module_name-$marvel_jar_version.jar
26
	echo "调用节点服务部署脚本..."
27
	ssh root@$ip "/marvel/deploy/one_deploy.sh $marvel_module_name"
28
	echo "已调用节点服务脚本,sleep $deploy_interval_seconds seconds..."
29
	sleep $deploy_interval_seconds
30
done

注意:需要设置跳板机和部署集群节点见的免密登录

2.prod_one_deploy.sh将服务jar包scp到部署节点,并通过ssh方式调用部署脚本one_deploy.sh

1
export JAVA_HOME=/usr/java/jdk1.8.0_121
2
export PATH=$JAVA_HOME/bin:$PATH
3
#export JAVA_OPTS='-Djava.rmi.server.hostname=106.14.33.163 -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9994 -Dcom.sun.management.jmxremote.rmi.port=9994 -Dcom.sun.management.jmxremote.authenticate=true -Dcom.sun.management.jmxremote.ssl=false'
4
#marvelOPTS="-Xms512m -Xmx2056m -XX:MaxNewSize=1024m -XX:MaxPermSize=1024m"
5
marvelOPTS=""
6
marvel_jar_version="1.0.0-RELEASE"
7
marvel_jenkins2jar_dir="/marvel/product/deploy"
8
#marvel_module_dir="/marvel/product/deploy"
9
marvel_module_dir="/marvel/product/jenkins2jar"
10
marvel_module_name=$1
11
12
mkdir $marvel_module_dir/$marvel_module_name &>/dev/null
13
mkdir $marvel_module_dir/$marvel_module_name/target &>/dev/null
14
cp $marvel_jenkins2jar_dir/$marvel_module_name/target/$marvel_module_name-$marvel_jar_version.jar $marvel_module_dir/$marvel_module_name/target/$marvel_module_name-$marvel_jar_version.jar
15
16
echo "赋予服务[$marvel_module_name]JAR可执行权限"
17
chmod 777 $marvel_module_dir/$marvel_module_name/target/$marvel_module_name-$marvel_jar_version.jar
18
echo "获取当前该服务进程ID"
19
process_id=$(ps -ef | grep $marvel_module_name-$marvel_jar_version | grep -v "grep" | awk '{print $2}')
20
21
if [ -z "$process_id" ]; then
22
	echo "服务[$marvel_module_name]当前尚未启动!"
23
else
24
	echo "服务[$marvel_module_name][id=$process_id]运行中,已杀之"
25
	kill -9 $process_id
26
fi
27
echo "服务[$marvel_module_name]启动中..."
28
29
if [ $marvel_module_name = "marvel-service-payment" ];then
30
	nohup java $marvelOPTS -jar $marvel_module_dir/$marvel_module_name/target/$marvel_module_name-$marvel_jar_version.jar --spring.profiles.active=test &>/dev/null &
31
else
32
	nohup java $marvelOPTS -jar $marvel_module_dir/$marvel_module_name/target/$marvel_module_name-$marvel_jar_version.jar --spring.profiles.active=test &>/dev/null &
33
fi
34
#nohup java -jar $marvel_module_dir/$marvel_module_name/target/$marvel_module_name-$marvel_jar_version.jar --spring.profiles.active=test 1>$marvel_module_dir/log/$marvel_module_name.log 2>&1 &

部署到k8s集群

图中另一条部署分支,是部署服务到k8s的,思路是一样的。

  • 将jenkins构建的构建的服务包,通过脚本k8s_deploy_manager.sh进行镜像打包,并上传到本地私服docker镜像中。
    1
    export JAVA_HOME=/usr/java/jdk1.8.0_121
    2
    export PATH=$JAVA_HOME/bin:$PATH
    3
    version=`head -n +1 /marvel/product/deploy/conf/marvel-k8s-prod-version.txt`
    4
    marvel_jar_version="1.0.0-RELEASE"
    5
    marvel_module_dir="/marvel/product/deploy"
    6
    marvel_module_name=$1
    7
    deploy_interval_seconds=`cat $marvel_module_dir/conf/deploy_interval_seconds.txt`
    8
    cp $marvel_module_dir/$1/target/$1-$marvel_jar_version.jar $marvel_module_dir/$1/docker/
    9
    docker build -t marvel-eureka:$version $marvel_module_dir/$1/docker
    10
    docker tag marvel-eureka:$version 106.14.33.xxx:5000/marvel-eureka:$version
    11
    docker push 106.14.33.xxx:5000/marvel-eureka:$version
  • 跳板机通过脚本k8s_one_deploy.sh部署服务到k8s集群,可以通过模版生成的方式将对应服务的k8s配置文件(如:xxx-service.yml,xxx_development.yml)统一管理,供部署脚本调用。

最后

通过jenkins的中间连接,将代码仓库(如github,gitee)中的代码(master或者分支)构建成jar包或者docker镜像,然后通过编写部署脚本将服务构建到普通集群或者k8s集群。

1:老子《道德经》第九章,老子故里,中国鹿邑。