背景
目前大多数服务仍是以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也支持类似的覆盖机制。










