“持而盈之,不如其已。
揣而锐之,不可常保。
金玉满堂,莫之能守;富贵而骄,自遗其咎。
功遂身退,天之道也。”1
Jenkins在SpringCloud微服务项目Devops中发挥的作用
Jenkins
本文不做具体安装部署的介绍,我Github上有一个完整的基于docker-compose的安装套件(同时还包括Mysql,Nginx,RabbitMQ,FastDFS,Redis等),可以去参考
Jenkins是以job(常用的有:自由风格模式 多任务模式)的方式提供打包服务,每一个job,都提供了一个方便“插一脚”的前置处理和后置处理,均可以调用shell指令的方式进行接入整合。
前置处理:便于做一些备份工作;后置处理:打包之后,调用类似“跳板机”上的shell脚本进行集群(联调环境,测试环境,生产环境)的服务部署。
Devops持续集成部署架构
架构图:
部署流程解析
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镜像中。1export JAVA_HOME=/usr/java/jdk1.8.0_1212export PATH=$JAVA_HOME/bin:$PATH3version=`head -n +1 /marvel/product/deploy/conf/marvel-k8s-prod-version.txt`4marvel_jar_version="1.0.0-RELEASE"5marvel_module_dir="/marvel/product/deploy"6marvel_module_name=$17deploy_interval_seconds=`cat $marvel_module_dir/conf/deploy_interval_seconds.txt`8cp $marvel_module_dir/$1/target/$1-$marvel_jar_version.jar $marvel_module_dir/$1/docker/9docker build -t marvel-eureka:$version $marvel_module_dir/$1/docker10docker tag marvel-eureka:$version 106.14.33.xxx:5000/marvel-eureka:$version11docker 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:老子《道德经》第九章,老子故里,中国鹿邑。