Jenkins+Java+Maven+不中断服务+自动化部署+失败自动回滚

关于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端的配置
Jenkins+Java+Maven+不中断服务+自动化部署+失败自动回滚
指定好jdk的安装目录
Jenkins+Java+Maven+不中断服务+自动化部署+失败自动回滚
Jenkins+Java+Maven+不中断服务+自动化部署+失败自动回滚

Jenkins+Java+Maven+不中断服务+自动化部署+失败自动回滚
安装下面这个插件Maven Integration
Jenkins+Java+Maven+不中断服务+自动化部署+失败自动回滚
安装完后重启一下Jenkins服务器

添加需要被部署的机器
Jenkins+Java+Maven+不中断服务+自动化部署+失败自动回滚

找到Publish over ssh这个栏目
Jenkins+Java+Maven+不中断服务+自动化部署+失败自动回滚
填好被部署机器的内容后点保存
Jenkins+Java+Maven+不中断服务+自动化部署+失败自动回滚

Jenkins+Java+Maven+不中断服务+自动化部署+失败自动回滚
Jenkins+Java+Maven+不中断服务+自动化部署+失败自动回滚

Jenkins+Java+Maven+不中断服务+自动化部署+失败自动回滚

Jenkins+Java+Maven+不中断服务+自动化部署+失败自动回滚
Jenkins+Java+Maven+不中断服务+自动化部署+失败自动回滚
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的配置文件中注释掉那台机器,以免部署期间正常用户访问到在部署的机器)
Jenkins+Java+Maven+不中断服务+自动化部署+失败自动回滚
部署脚本: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+自动部署+检测+及时回滚完成,此文章仅供参考,根据自己情况进行修改。别直接照搬,有些不足的地方欢迎指正!!

上一篇:Maven deploy第三方包报400异常


下一篇:理解maven命令package、install、deploy的联系与区别