背景
目前大多数服务仍是以tomcat-war形式进行部署,在一些不具备自动化部署环境下,更换war包仍需手动,步骤重复且复杂,大概分为以下步骤:
- 1、
kill
掉tomcat。 - 2、备份war包中属于该环境下的特有配置文件,如
classes
下的配置文件、web.xml
。 - 3、删除
webapps
目录下之前的war
包和已解压的包。 - 4、移动新
war
包到webapps目录下,解压。 - 5、替换原环境下的配置文件。
- 6、启动
tomcat
。
部署次数少还可以接受,如果服务数量多起来,这样重复的步骤做不了几次就会让你崩溃,此时肯定会想如果能换上自动化部署工具(如:jenkins
)就好了,但是自己说话没有话语权,仍需要忍着并不断的干着。
既然不能改变环境,那就适应它,所以制作了一个中间脚本去适应它。
需求
先不放脚本而是说下需求,我们需要这个脚本干什么
- 以上6个流程,肯定要一键帮我完成。
- 该环境的配置文件有特有的配置,能单独拎出来,不用我再在一堆繁琐的
tomcat
中找;部署新包时也要能覆盖包里的文件。 - 不要侵入这个
tomcat
,意味着tomcat
文件夹下不要随意新增无用的文件,避免被别人说。
介绍
准备
ok,有了上述需求,那我们就可以下手code了,下面贴出我的代码
#!/bin/bash
project_name=abc
tomcat_path=/root/tomcat/tomcat-8080-abc
work_path=/share/tmp/abc
if [[ !(-f ${work_path}/war/${project_name}.war) ]]
then
echo "工作目录中,未检测到war包"
exit 1;
fi
######################################### kill启动过tomcat #########################################
echo "1、kill之前启动过的${project_name}"
eval $(ps --no-heading -aux |grep -i "${project_name}" | grep -v "grep"|awk '{print "kill -9 " $2}')
######################################### 备份配置文件 #########################################
echo "2、备份${project_name}配置文件"
#备份class下的配置文件
if [[ !(-d "${work_path}/conf") ]]
then
mkdir -p "${work_path}/conf"
fi
if [[ -d "${tomcat_path}/webapps/${project_name}" ]]
then
awk 'BEGIN { cmd="cp -iR '"${tomcat_path}"'/webapps/'"${project_name}"'/WEB-INF/classes/* '"${work_path}"'/conf"; print "n" |cmd; }'
echo "备份配置文件完成"
else
echo "未检测到部署的${project_name}文件夹"
fi
#备份web.xml文件
if [[ !(-d "${work_path}/web") ]]
then
mkdir -p "${work_path}/web"
fi
if [[ -d "${tomcat_path}/webapps/${project_name}" ]]
then
awk 'BEGIN { cmd="cp -i '"${tomcat_path}"'/webapps/'"${project_name}"'/WEB-INF/web.xml '"${work_path}"'/web"; print "n" |cmd; }'
echo "备份web.xml完成"
else
echo "未检测到部署的${project_name}文件夹"
fi
######################################### 清除旧文件 #########################################
echo "3、清除旧${project_name}文件"
rm -rf "${tomcat_path}/webapps/${project_name}"*
######################################### 解压并移动 #########################################
echo "4、解压并移动新的${project_name}文件"
if [[ !(-d "/tmp/${project_name}") ]]
then
mkdir "/tmp/${project_name}"
fi
cp "${work_path}/war/${project_name}.war" "/tmp/${project_name}/"
cd "/tmp/${project_name}/"
jar -xf "${project_name}.war"
rm -f "/tmp/${project_name}/${project_name}.war"
mv "/tmp/${project_name}" "${tomcat_path}/webapps/"
######################################### 替换配置文件 #########################################
echo "5、替换配置文件"
cp -Rf "${work_path}/conf/"* "${tomcat_path}/webapps/${project_name}/WEB-INF/classes/"
cp -Rf "${work_path}/web/web.xml" "${tomcat_path}/webapps/${project_name}/WEB-INF/web.xml"
######################################### 重启tomcat #########################################
echo "6、重启${project_name}"
${tomcat_path}/bin/startup.sh
这个shell中需要我们填写的信息有:
- 项目名,即
war
包名去掉后缀。 - 要替换的tomcat路径。
- 工作区间路径。
项目名和tomcat路径很好明白,这里有必须要说下工作区间的概念,工作区间是具有特殊目录结构,包含要替换文件的目录。
.
├── replace.sh
└── war
└── abc.war
-
replace.sh
就是刚才一堆脚本,它的位置不强制放在工作区间下。 -
war
包目录要求必须有,它仅包含了一个要部署的war
包。
运行
放置好war
包后,就可以执行replace.sh
运行了。运行后,它会按照以上6个步骤执行,同步将配置文件抽取出来放到工作区间内,以下是运行后的工作目录:
.
├── conf
│ └── logback.xml
├── replace.sh
├── war
│ └── abc.war
└── web
└── web.xml
-
conf
目录自动生成,存放WEB-INF/classes/
下的所有配置文件,可以编辑里面的文件内容,运行时会自动覆盖webapps/abc/WEB-INF/classes
下的配置文件。 -
web
目录自动生成,目前仅存放WEB-INF/
下的web.xml
文件,可以编辑web.xml
,运行时会自动覆盖webapps/abc/WEB-INF/web.xml
。 - 如有其他覆盖需求,请自行添加。
结尾
docker的volumes
也支持类似的覆盖机制。