Tomcat优化发布项目流程
对于没有专业运维人员支持的团队来说,通常项目的上线发布还是由开发人员来负责。针对需要部署在tomcat容器中的项目,由于没有很好的规划线上环境tomcat的配置,导致部署过程中费时费力、各种低级错误,我表示曾经就深受其害。。。受前辈们的启发,在此整理了下我认为相对比较高效方式,希望能给各位小伙伴们一些帮助。
传统方式在tomcat下部署应用
步骤:
- 打war包;
- 停止tomcat;
- 上传并替换webapps目录下的war包;
- 替换生成环境下应用的配置文件,通常在 WEB-INF/classes/config.xml、db.properties等(最坑的地方);
- 重启tomcat;
弊端:
- 整个过程繁琐,易出错(特别是替换一些配置文件的时候);
- 没有自动生成发布记录,如果项目发布失败,不能快速的进行回滚;
- 项目与tomcat自身目录耦合较高,如果需要对tomcat进行升级,操作麻烦。
理想方式-基于shell脚本实现一键发布
具备功能:
- Tomcat自身配置与项目分离,便于以后升级Tomcat或者统一配置;
- 项目的配置文件与项目本身的war包分离(采用shell脚本将服务器上的配置文件替换war包内的配置文件);
- 一键部署与快速回滚
- 自定义项目的配置(jvm参数等)
实现步骤:
1.部署规划
文件目录结构:
├── service-app 项目部署文件目录
--------------------------从安装tomcat中拷贝以下文件夹
│ ├── conf
│ ├── logs (也可自己建立空文件夹)
│ ├── temp (同上)
│ ├── webapps (同上)
│ └── work (同上)
---------------------------项目相关文件
│ ├── app-conf (项目配置文件)
│ ├── war (war包解压后存放的文件)
--------------------------编写的shell脚本
│ ├── tomcat.sh (启动脚本)
│ ├── deploy.sh (部署脚本)
--------------------------运行脚本后生成的文件
│ ├── appwar -> war/demo-2.0-2018-03-04_09-22-28 (软连接指向解压后的项目文件夹)
│ ├── current_deploy_info (当前部署记录)
│ ├── last_deploy_info (上次部署记录)
2.tomcat.sh脚本
#!/bin/bash
#配置jvm参数
#export JAVA_OPTS="-Xms100m -Xmx200m"
#export JAVA_HOME=/usr/lib/java/jdk1.8.0_131
export CATALINA_HOME=/usr/local/apache-tomcat-8.5.28
export CATALINA_BASE="`pwd`"
case $1 in
start)
$CATALINA_HOME/bin/catalina.sh start
echo start success!!
;;
stop)
$CATALINA_HOME/bin/catalina.sh stop
echo stop success!!
;;
restart)
$CATALINA_HOME/bin/catalina.sh stop
echo stop success!!
sleep 2
$CATALINA_HOME/bin/catalina.sh start
echo start success!!
;;
esac
exit 0
3.deploy.sh脚本
#!/bin/bash -e
#应用war包名称
pom_a=$1
#版本号
pom_v=$2
export work_time=$(date +%Y-%m-%d_%H-%M-%S)
echo "deploy time: $work_time"
mkdir -p war/
#1.1 下载war包的命令可以在此补充(svn/ftp),这里写死为war目录
war=war/${pom_a}_${pom_v}.war
deploy_war() {
#1.2检查war包是否存在
if [ ! -f "$war" ]; then
echo "war not exist: $war"
exit 1
fi
#2.1解压war包到指定目录,格式为war包名称加部署时间(demo-1.0-2018-03-04_07-47-52)
target_d=war/${pom_a}-${pom_v}-$work_time
target_dir=`pwd`/$target_d
unzip -q $war -d $target_dir
#2.2替换war包解压后的配置文件,重复直接覆盖,不提示
\cp -rf app-conf/* $target_dir/WEB-INF/classes/
#2.3建立软连接appwar指向解压后的war包目录
rm -f appwar
ln -sf $target_d appwar
#2.4判断current_deploy_info文件是否存在,即是否部署过
# 第一次部署,将Root.xml中的Context标签下的docBace目录指向软连接appwar,并建立本次部署信息记录(current_deploy_info文件)
# 以后部署,停止tomcat并生成上次部署的信息(lash_deplo_info文件)
if [ -f current_deploy_info ]
then
./tomcat.sh stop
cat current_deploy_info > last_deploy_info
fi
target_ln=`pwd`/appwar
echo '<?xml version="1.0" encoding="UTF-8" ?>
<Context docBase="'$target_ln'" allowLinking="true">
</Context>' > conf/Catalina/localhost/ROOT.xml
echo -ne "\npom_a=${pom_a}\npom_v=${pom_v}\ndir=${target_d}" > current_deploy_info
chmod +x current_deploy.sh
./tomcat.sh start
}
deploy_war
3.使用示例
##################部署war目录下demo_1.0.war#########################
[root@redhat service-app]# ./deploy.sh demo 1.0
deploy time: 2018-03-04_11-18-05
Using CATALINA_BASE: /usr/local/service-app
Using CATALINA_HOME: /usr/local/apache-tomcat-8.5.28
Using CATALINA_TMPDIR: /usr/local/service-app/temp
Using JRE_HOME: /usr/lib/java/jdk1.8.0_131
Using CLASSPATH: /usr/local/apache-tomcat-8.5.28/bin/bootstrap.jar:/usr/local/apache-tomcat-8.5.28/bin/tomcat-juli.jar
stop success!!
Using CATALINA_BASE: /usr/local/service-app
Using CATALINA_HOME: /usr/local/apache-tomcat-8.5.28
Using CATALINA_TMPDIR: /usr/local/service-app/temp
Using JRE_HOME: /usr/lib/java/jdk1.8.0_131
Using CLASSPATH: /usr/local/apache-tomcat-8.5.28/bin/bootstrap.jar:/usr/local/apache-tomcat-8.5.28/bin/tomcat-juli.jar
Tomcat started.
start success!!
[root@redhat service-app]# curl http://localhost:8080
<html>
<head>
<title>tomcat部署优化</title>
</head>
<body>
tomcat部署优化-1.0
</body>
</html>
##################部署war目录下demo_1.0.war#########################
[root@redhat service-app]# ./deploy.sh demo 2.0
deploy time: 2018-03-04_11-20-51
Using CATALINA_BASE: /usr/local/service-app
Using CATALINA_HOME: /usr/local/apache-tomcat-8.5.28
Using CATALINA_TMPDIR: /usr/local/service-app/temp
Using JRE_HOME: /usr/lib/java/jdk1.8.0_131
Using CLASSPATH: /usr/local/apache-tomcat-8.5.28/bin/bootstrap.jar:/usr/local/apache-tomcat-8.5.28/bin/tomcat-juli.jar
stop success!!
Using CATALINA_BASE: /usr/local/service-app
Using CATALINA_HOME: /usr/local/apache-tomcat-8.5.28
Using CATALINA_TMPDIR: /usr/local/service-app/temp
Using JRE_HOME: /usr/lib/java/jdk1.8.0_131
Using CLASSPATH: /usr/local/apache-tomcat-8.5.28/bin/bootstrap.jar:/usr/local/apache-tomcat-8.5.28/bin/tomcat-juli.jar
Tomcat started.
start success!!
[root@redhat service-app]# curl http://localhost:8080
<html>
<head>
<title>tomcat部署优化</title>
</head>
<body>
tomcat部署优化-2.0
</body>
</html>
##################回滚部署版本为1.0#########################
[root@redhat service-app]# ll
总用量 52
drwxr-xr-x. 2 root root 4096 3月 4 07:20 app-conf
lrwxrwxrwx. 1 root root 32 3月 4 11:20 appwar -> war/demo-2.0-2018-03-04_11-20-54
drwx------. 3 root root 4096 2月 24 05:42 conf
-rw-r--r--. 1 root root 58 3月 4 11:20 current_deploy_info
-rwxrwxrwx. 1 root root 1701 3月 4 09:12 deploy.sh
-rw-r--r--. 1 root root 58 3月 4 11:20 last_deploy_info
drwxr-x---. 2 root root 4096 3月 4 06:11 logs
drwxr-x---. 2 root root 4096 2月 24 05:42 temp
-rwxrwxrwx. 1 root root 508 3月 4 06:10 tomcat.sh
drwxr-xr-x. 7 root root 4096 3月 4 11:20 war
drwxr-x---. 2 root root 4096 3月 4 09:22 webapps
drwxr-x---. 3 root root 4096 2月 24 06:17 work
[root@redhat service-app]# rm -f appwar
[root@redhat service-app]# ln -sf war/demo-1.0-2018-03-04_11-18-05 appwar
[root@redhat service-app]# ll
总用量 52
drwxr-xr-x. 2 root root 4096 3月 4 07:20 app-conf
lrwxrwxrwx. 1 root root 32 3月 4 11:30 appwar -> war/demo-1.0-2018-03-04_11-18-05
drwx------. 3 root root 4096 2月 24 05:42 conf
-rw-r--r--. 1 root root 58 3月 4 11:20 current_deploy_info
-rwxrwxrwx. 1 root root 1701 3月 4 09:12 deploy.sh
-rw-r--r--. 1 root root 58 3月 4 11:20 last_deploy_info
drwxr-x---. 2 root root 4096 3月 4 06:11 logs
drwxr-x---. 2 root root 4096 2月 24 05:42 temp
-rwxrwxrwx. 1 root root 508 3月 4 06:10 tomcat.sh
drwxr-xr-x. 7 root root 4096 3月 4 11:20 war
drwxr-x---. 2 root root 4096 3月 4 09:22 webapps
drwxr-x---. 3 root root 4096 2月 24 06:17 work
[root@redhat service-app]# ./tomcat.sh restart
Using CATALINA_BASE: /usr/local/service-app
Using CATALINA_HOME: /usr/local/apache-tomcat-8.5.28
Using CATALINA_TMPDIR: /usr/local/service-app/temp
Using JRE_HOME: /usr/lib/java/jdk1.8.0_131
Using CLASSPATH: /usr/local/apache-tomcat-8.5.28/bin/bootstrap.jar:/usr/local/apache-tomcat-8.5.28/bin/tomcat-juli.jar
stop success!!
Using CATALINA_BASE: /usr/local/service-app
Using CATALINA_HOME: /usr/local/apache-tomcat-8.5.28
Using CATALINA_TMPDIR: /usr/local/service-app/temp
Using JRE_HOME: /usr/lib/java/jdk1.8.0_131
Using CLASSPATH: /usr/local/apache-tomcat-8.5.28/bin/bootstrap.jar:/usr/local/apache-tomcat-8.5.28/bin/tomcat-juli.jar
Tomcat started.
start success!!
[root@redhat service-app]# curl http://localhost:8080
<html>
<head>
<title>tomcat部署优化</title>
</head>
<body>
tomcat部署优化-1.0
</body>
</html>