经常开发时部署应用到服务器调试,一系列重复操作实在无趣,于是写了个一键部署的shell,以求解放。
功能:
- 终止Tomcat进程
- 备份原应用
- 部署新应用
- 替换相应配置文件
- 启动Tomcat
- 显示Tomcat运行日志
#!/bin/bash
#部署新应用 by xl @ 2014-8-1 15:13:14
#last modify @ 2014-8-4 14:25:31
#获取最新war包
echo ">GET NEW WAR"
scp root@x.x.x.x:/home/xl/war/webapp.war /home/xl/war/webapp.war
##参数设置##
tomcatPath="/home/xl/tomcat"
warPath="/home/xl/war/webapp.war"
appName="webapp"
webappsPath="$tomcatPath/webapps"
bakPath="$tomcatPath/webapps_bak"
#杀死tomcat进程
#ps x|grep "/home/xl/tomcat"|grep -v "grep"|grep -v "sh"|awk '{print $1}'|xargs kill -9
pid=$(ps x|grep "$tomcatPath"|grep -v "grep"|grep -v "sh"|awk '{print $1}')
#ps x|grep "/home/xl/tomcat"|grep -v "grep"|grep -v "sh"|awk -F '[ +]' '{print $1}'
if [ -n "$pid" ]; then
#PID NOT EMPTY
#进程存在则中止
kill -9 $pid
echo ">KILL PID: " $pid
fi
#备份原应用
if [ ! -d $bakPath ]; then
#如果备份目录不存在,则新建
mkdir "$bakPath"
fi
bakNowPath="$bakPath/$(date +%Y%m%d_%H%M%S)"
mkdir "$bakNowPath"
echo ">BAK DIRECTORY: $bakNowPath"
#BAK
mv "$webappsPath/$appName"* "$bakNowPath"
echo "[$webappsPath]"
ls "$webappsPath"|grep "$appName"
echo "[$bakNowPath]"
bakApp=$(ls "$bakNowPath"|grep "$appName")
echo $bakApp
if [ -n "$bakApp" ]; then
echo ">BAKED"
else
echo ">BAK FAIL"
fi
#DEPLOY
#mv "$warPath" "$webappsPath"
#UNZIP
unzip -q "$warPath" -d "$webappsPath/$appName"
echo ">DEPLOY NEW WAR"
echo "[$webappsPath/$appName]"
ls "$webappsPath/$appName"
#REPLACE
#替换配置文件:如数据库连接配置
cp "./bak/jdbc.properties" "$webappsPath/$appName/WEB-INF/classes"
echo ">REPLACED"
echo ">DEPLOYED"
#CONFIRM
#是否启动Tomcat
echo -e "Start WebApp? (y/ENTER or n)\c"
read input
#if [ -n "$input" ] && [ "y" != "$input" ] && [ "Y" != "$input" ]; then
if [ -n "$input" -a "y" != "$input" -a "Y" != "$input" ]; then
#用户有输入则退出;直接输入回车则继续
echo ">EXIT"
exit 0
fi
#START
#sh "$tomcatPath/bin/startup.sh"
#可以避免关闭终端连接 导致 tomcat进程的关闭
nohup "$tomcatPath/bin/startup.sh" &
echo ">START WEBAPP.."
#SHOW LOG
echo ">SHOW LOG.."
tail -f "$tomcatPath/logs/catalina.out"