关于jenkins的介绍和安装我这篇文章已经介绍了,https://blog.csdn.net/weixin_43112000/article/details/84032214,这里就不赘述了,直接上菜
环境介绍:公司项目用的是2Nginx+2Tomcat的架构,Nginx处理前端请求,Tomcat处理后端请求,以下的所有配置都是基于这个架构来的,包括后续的脚本
jenkins平台可以解放人员的双手,对于互联网公司具体内容如下:
开发人员:对于开发人员来说,只需负责网站代码的编写,不需要手动再对源码进行编译、打包、单元测试等工作,开发人员只需要把写好的代码分支放在SVN、Git仓库即可。
运维人员:对于运维人员来说,使用jenkins自动部署,可以减轻人工干预的错误率,同时解放运维人员繁杂的上传代码,手动备份,手动更新。
测试人员:对于测试人员来说,可以通过jenkins进行代码测试、网站功能或者功能性测试。
基于jenkins自动部署网站的流程大致分为需求分析—>原型设计—>开发代码—>提交测试—>Jenkins内网部署---->确认上线—>jenkins备份数据—>jenkins外网部署—>发布完毕,如果发现外网部署的代码有异常,可以及时回滚
一、jenkins服务器所需要的配置
1、在jenkins的服务器安装maven、jdk、以及构建代码需要任何环境(这个可以去和java开发要),以下添加的环境变量是必须环境,只增加了JDK、Maven环境,其他的环境要根据构建代码所需要的依赖去添加
Maven安装
[root@test1 ~]#wget http://mirrors.hust.edu.cn/apache/maven/maven-3/3.6.0/binaries/apache-maven-3.6.0-bin.tar.gz
[root@test1 ~]#tar -xf apache-maven-3.6.0-bin.tar.gz
[root@test1 ~]#cd /usr/local
[root@test1 ~]#mkdir maven
[root@test1 ~]#mv apache-maven-3.6.0 /usr/local/maven/
修改环境变量,在末尾加上这些
[root@test1 ~]# vim /etc/profile
export MAVEN_HOME=/usr/local/maven/apache-maven-3.6.0
export PATH=${MAVEN_HOME}/bin:${PATH}
(近期Oracle有新的规定下载JDK必须要注册Oracle账号,直接wget下载地址下载下来的JDK已经没有办法用了,建议大家去网上找找资源下载JDK,版本不要太低就行,下载完解压后继续跟着本篇文章走即可)
JDK安装
[root@test1 tmp]# tar -zxvf jdk-8u191-linux-x64.tar.gz
[root@test1 tmp]# mkdir /usr/local/java
[root@test1 tmp]# mv jdk1.8.0_191 /usr/local/java/
修改环境变量,在末尾加上这些
[root@test1 ~]# vim /etc/profile
export JAVA_HOME=/usr/local/java/jdk1.8.0_191
export CLASSPATH=.:JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin
其他的环境变量我这里就不贴出来了,因为每个项目所需要的环境不同,只贴出必须的两个环境变量
2、jenkins web端的配置
指定好jdk的安装目录
安装下面这个插件Maven Integration
安装完后重启一下Jenkins服务器
添加需要被部署的机器
找到Publish over ssh这个栏目
填好被部署机器的内容后点保存
jenkins所需要的配置就结束了,现在去被部署机器上编写部署脚本
二、被部署机器的部署脚本编写
[root@app_test1 deploy]# vim /home/deploy/deploy_clu.sh
#!/bin/bash
if [ ! -f /home/deploy/webapp/fhtowers.war ] #如果webapp下没有jenkins发送过来的war包直接停止并返回错误码1
then
exit 1
fi
cd /home/deploy/webapp/ #如果有war包进入目录
cp -rp /home/deploy/webapp/fhtowers.war /home/deploy/webapp/fhtowers2.war #将war包复制一份,并改名为fhtowers2.war
jar -xvf fhtowers2.war WEB-INF/classes/config.properties #用jar 解开包
sed -i s/workerId=1/workerId=2/ WEB-INF/classes/config.properties #更改配置文件里的workerid
#说明一下,这里是因为后台有两台tomcat,所以要把war包解开更改一下wokerid,不然的话会有冲突,如果后台只有一个tomcat的话可以不用做这一步,也可以和开发沟通需不需要更改里面的哪些配置,防止冲突
jar -uvf fhtowers2.war WEB-INF/classes/config.properties #把更改好配置文件的包再打包好 传送到集群里的另一台机器
echo "传输war包到app_test2..."
scp -r fhtowers2.war 172.18.30.188:/home/deploy/webapp/fhtowers.war
echo "传送war包完毕."
echo "删除剩余WEB-INF和war包..."
rm /home/deploy/webapp/WEB-INF -rf
rm /home/deploy/webapp/fhtowers2.war -rf
echo "删除完毕."
echo "执行注释掉app_test1 tomcat ..."
sh /home/deploy/stop_app_test1_tomcat.sh #这个脚本主要是注释一台Nginx,让nginx在部署期间不要调度正在被部署的tomcat,后面会把脚本贴到下面去
echo "停止完毕."
echo "执行部署app_test1 tomcat..."
sh /home/deploy/deploytest.sh
echo "部署app_test1 tomcat完毕."
echo "等待Tomcat启动60秒" #tomcat启动需要时间,再此期间不要放开注释,以免用户访问nginx的时候会访问到另一台机器
sleep 60
echo "检测app_test1 Tomcat是否成功启动"
curl -I 127.0.0.1:8443/fhtowers/order/package | grep "HTTP/1.1" >/root/test.txt #去请求一个Tomcat接口,看是不是200
live=`cat /root/test.txt | awk '{print $2}' |grep '200' |wc -l`
if [ "$live" -ne "1" ]; #如果请求的结果不是200说明tomcat 没有启动成功,就执行下面的backupwar.sh回滚脚本
then
echo "Tomcat启动失败,准备执行回滚"
sh /home/deploy/backupwar.sh
exit 1
fi
echo "tomcat启动成功" #如果启动成功就执行下面的操作
echo "放开app_test1 tomcat的注释"
sh /home/deploy/start_app_test1_tomcat.sh
echo "启动完毕."
echo "执行停止app_test2 tomcat..." #第一台部署完成再去部署集群里的另一台,始终保证集群可用状态
sh /home/deploy/stop_app_test2_tomcat.sh #nginx注释掉集群里app_test2的tomcat
echo "停止完毕"
echo "执行部署app_test2 tomcat..."
ssh 172.18.30.188 < /home/deploy/deploytest2.sh #远程执行app_test2的部署脚本
echo "部署app_test2完毕."
echo "等待Tomcat启动60秒"
sleep 60
echo "检测app_test2 Tomcat是否成功启动,若不成功则不启动开放Nginx注释"
curl -I 172.18.30.188:8443/fhtowers/order/package | grep "HTTP/1.1" >/root/test2.txt #请求app_test2的tomcat接口,看有没有返回200
live2=`cat /root/test2.txt | awk '{print $2}' |grep '200' |wc -l`
if [ "$live2" -ne "1" ];
then
echo "Tomcat2启动失败,请手动重启"
exit 1
fi
echo "Tomcat2启动成功"
echo "放开app_test2 tomcat的注释"
sh /home/deploy/start_app_test2_tomcat.sh
echo "启动完毕."
上述脚本中出现的其他脚本
cat /home/deploy/stop_app_test1_tomcat.sh
#!/bin/bash
sed -i "s/\(server 172\.18\.0\.172:8081.*\)/#\1/" /etc/nginx/conf.d/server.conf
nginx -s reload
ssh -t -t 172.18.30.188 << EOF
sed -i "s/\(server 172\.18\.0\.172:8081.*\)/#\1/" /usr/local/openresty/nginx/conf.d/server.conf
nginx -s reload
exit
EOF
nginx配置如下(部署哪一台Tomcat的时候就从Nginx的配置文件中注释掉那台机器,以免部署期间正常用户访问到在部署的机器)
部署脚本:cat /home/deploy/deploytest.sh
#!/bin/bash
if [ ! -f /home/deploy/webapp/fhtowers.war ] #如果目录里没有jenkins发送过来的war包直接退出脚本
then
exit 1
fi
if [ -f /usr/local/tomcat/webapps/fhtowers.war ] #将上一次的war放到备份目录,并控制备份war包的个数
then
echo "backup web war file..."
mv /usr/local/tomcat/webapps/fhtowers.war /home/deploy/webappbackup/fhtowers-`date +"%Y%m%d-%H%M%S"`.war
backupapp_count=`ls /home/deploy/webappbackup/|wc -l`
#控制备份包数量不大于3个
if [ "$backupapp_count" -gt "3" ]
then
rm_list=`ls -lt /home/deploy/webappbackup/|awk '{print $9}'|grep -v "^$"|sed -n '4,$p'`
for i in $rm_list
do
echo "remove the webappbackup war:$i ..."
rm -rf /home/deploy/webappbackup/$i
done
fi
fi
echo "move the war to tomcat webapps..."
mv /home/deploy/webapp/fhtowers.war /usr/local/tomcat/webapps/fhtowers.war #将jenkins发送来的war包放到tomcat目录下
cd /usr/local/tomcat/bin
echo "shutdown tomcat..."
/bin/bash shutdown.sh #重启tomcat
sleep 1
/usr/local/jdk1.8.0_152/bin/java -classpath /home/deploy/tailf.jar LineDeserializer /usr/local/tomcat/logs/catalina.out &
#打印日志到屏幕
process_true=`ps aux|grep 'org.apache.catalina.startup.Bootstrap start'|grep -v 'grep'|wc -l` #如果tomcat没有成功关闭的话强行杀掉tomcat
if [ "$process_true" -gt "0" ]
then
process_pid=`ps aux|grep 'org.apache.catalina.startup.Bootstrap start'|grep -v 'grep'|awk '{print $2}'`
kill -9 $process_pid
fi
sleep 3
echo "startup tomcat..."
/bin/bash startup.sh #启动tomcat
回滚脚本:cat /home/deploy/backupwar.sh
[root@app_test1 deploy]# cat backupwar.sh
#!/bin/bash
backup=`ls -ltr /home/deploy/webappbackup/fhtowers-* | awk '{print $NF}' |tail -1` #把备份包里最新的那个包放到部署目录下
cp $backup /home/deploy/webapp/fhtowers.war
if [ ! -f /home/deploy/webapp/fhtowers.war ]
then
echo "回滚包不存在"
exit 1
fi
echo "执行回滚app_test1 tomcat..."
sh /home/deploy/deploytest.sh
echo "回滚app_test1 tomcat完毕."
echo "等待Tomcat启动60秒"
sleep 60
echo "检测app_test1 Tomcat是否回滚成功"
sh /root/testTomcat.sh
live=`cat /root/test.txt | awk '{print $2}' |grep '200' |wc -l`
if [ "$live" -ne "1" ];
then
echo "app_test1回滚失败,请联系运维人员"
exit 1
fi
echo "tomcat启动成功"
echo "放开app_test1 2台Nginx的注释"
sh /home/deploy/start_lb1_tomcat.sh
echo "回滚完毕."
放开app_test1-nginx注释脚本:
cat /home/deploy/start_app_test1_tomcat.sh
#!/bin/bash
sed -i "s/#\(server 172\.18\.0\.172:8081.*\)/\1/" /etc/nginx/conf.d/server.conf
nginx -s reload
ssh -t -t 172.18.30.188 << EOF
sed -i "s/#\(server 172\.18\.0\.172:8081.*\)/\1/" /usr/local/openresty/nginx/conf.d/server.conf
nginx -s reload
exit
EOF
exit
注释app_test2 nginx脚本(集群里另一台tomcat机器)
cat /home/deploy/stop_app_test2_tomcat.sh
#!/bin/bash
sed -i "s/\(server 172\.18\.30\.188:8081.*\)/#\1/" /etc/nginx/conf.d/server.conf
nginx -s reload
ssh -t -t 172.18.30.188 << EOF
sed -i "s/\(server 172\.18\.30\.188:8081.*\)/#\1/" /usr/local/openresty/nginx/conf.d/server.conf
nginx -s reload
exit
EOF
app_test2的部署脚本
cat /home/deploy/deploytest2.sh
#!/bin/bash
if [ ! -f /home/deploy/webapp/fhtowers.war ]
then
exit 1
fi
if [ -f /usr/local/tomcat/webapps/fhtowers.war ]
then
echo "backup web war file..."
mv /usr/local/tomcat/webapps/fhtowers.war /home/deploy/webappbackup/fhtowers-`date +"%Y%m%d-%H%M%S"`.war
backupapp_count=`ls /home/deploy/webappbackup/|wc -l`
#控制备份包数量不大于3个
if [ "$backupapp_count" -gt "3" ]
then
rm_list=`ls -lt /home/deploy/webappbackup/|awk '{print $9}'|grep -v "^$"|sed -n '4,$p'`
for i in $rm_list
do
echo "remove the webappbackup war:$i ..."
rm -rf /home/deploy/webappbackup/$i
done
fi
fi
echo "move the war to tomcat webapps..."
mv /home/deploy/webapp/fhtowers.war /usr/local/tomcat/webapps/fhtowers.war
cd /usr/local/tomcat/bin
echo "shutdown tomcat..."
/bin/bash shutdown.sh
cat /home/deploy/start_app_test2_tomcat.sh
#!/bin/bash
##修改两台nginx upstream,把app_test2放开注释,并重新加载两台nginx
sed -i "s/#\(server 172\.18\.30\.188:8081.*\)/\1/" /etc/nginx/conf.d/server.conf
nginx -s reload
ssh -t -t 172.18.30.188 << EOF
sed -i "s/#\(server 172\.18\.30\.188:8081.*\)/\1/" /usr/local/openresty/nginx/conf.d/server.conf
nginx -s reload
exit
EOF
exit
至此jenkin+java+自动部署+检测+及时回滚完成,此文章仅供参考,根据自己情况进行修改。别直接照搬,有些不足的地方欢迎指正!!