背景
在每次都是使用部署的时候都需要一系列的动作(删除多余项、打包、上传、杀进程、解压缩等),是一件很消耗精力的事情。
于是写了一个自动化脚本来完成这件事。
针对的项目格式:
- pom.xml
- bin
- run.sh
- src
- others
欢迎访问原文站点blog.jiehouse.com
转载请注明出处blog.jiehouse.com
打包上传
文件名:deploy,源码见附录一
该文件实现的逻辑:
- 拷贝源代码到临时目录
- 将临时目录中的无用文件删除(例如:.git|.idea|target等)
- 将临时目录中的文件归档,并删除临时文件
- 将归档后的文件scp到目的主机的固定目录中(保存了每次上传的历史,以后如果磁盘空间不足可以删除)
- 删除部署目录原有的代码
- 解压缩到部署目录,然后运行其中的run.sh脚本
在pom.xml的上级目录运行该命令:deploy [filename] [appkey]
运行脚本
文件名:run.sh,源码见附录二
实现的逻辑:
- 杀死原有的进程
- 通过mvn启动新进程
需要注意的坑点
- scp以及ssh命令运行的时候需要输入密码
- 解决方案:使用公钥认证(至于什么是公钥认证,请自觉百度)
- deploy与run.sh需要有执行权限
- chmod u+x [filename]
附录
附录一
#!/bin/bash
set -e
function __help(){
echo "usage: illegal arg [dirname] [appkey]."
exit
}
if [[ $# < 2 ]]; then
__help
fi
# echo "脚本所在文件夹:"$(cd `dirname $0`; pwd)
# 目标文件夹
TAR_DIR=$1
# 目标appkey
APP_KEY=$2
# 当前目录
NOW_DIR=`pwd`
# 当前日期
NOW_DATE=`date "+%Y_%m_%d_%H_%M_%S"`
# 中间临时文件夹
TMP_DIR="$NOW_DIR/"$TAR_DIR"-"$NOW_DATE
# 远程部署主机
REMOTE_HOST="jiehouse"
# 最后生成的tar
FINAL_TAR=$TMP_DIR".tar"
# 远程目标目录
REMOTE_TARGET_DIR="~/package/$APP_KEY"
# 远程目标文件
REMOTE_TARGET_FILE="$REMOTE_TARGET_DIR/`basename $FINAL_TAR`"
# 远程部署根目录
REMOTE_DEPLOY_ROOT_DIR="~/deploy"
# 远程部署app目录
REMOTE_DEPLOY_DIR="$REMOTE_DEPLOY_ROOT_DIR/$APP_KEY"
echo "目标文件:"$TAR_DIR
echo "appkey:"$APP_KEY
echo "当前日期:"$NOW_DATE
echo "当前目录:"$NOW_DIR
echo "中间临时文件夹:"$TMP_DIR
echo "最后生成的tar:"$FINAL_TAR
echo "远程目标目录:"$REMOTE_TARGET_DIR
echo "远程目标文件:"$REMOTE_TARGET_FILE
echo "远程部署主机:"$REMOTE_HOST
echo "远程部署根目录:"$REMOTE_DEPLOY_ROOT_DIR
echo "远程部署app目录:"$REMOTE_DEPLOY_DIR
function __check(){
if [ ! -d "$TAR_DIR" ]; then
echo "ERROR: not exist dir: $TAR_DIR."
exit
fi
if [ -d "$TMP_DIR" ]; then
echo "ERROR: tmp_dir:$TMP_DIR has existed."
exit
fi
echo "check done !"
}
function __init(){
echo "init done !"
}
function __package(){
cp -R $TAR_DIR $TMP_DIR
cd $TMP_DIR
rm -rf target
rm -rf .git
rm -rf .idea
rm -rf *.iml
rm -rf .gitignore
tar cf $FINAL_TAR *
cd -
rm -rf $TMP_DIR
echo "run done !"
}
function __remote(){
ssh $REMOTE_HOST "[ -d $REMOTE_TARGET_DIR ] && echo package_ok || mkdir -p $REMOTE_TARGET_DIR"
scp $FINAL_TAR jiehouse:$REMOTE_TARGET_DIR
ssh $REMOTE_HOST "[ -d $REMOTE_DEPLOY_DIR ] && echo deploy_ok || mkdir -p $REMOTE_DEPLOY_DIR"
ssh $REMOTE_HOST "rm -rf $REMOTE_DEPLOY_DIR/*;tar xf $REMOTE_TARGET_FILE -C $REMOTE_DEPLOY_DIR;bash $REMOTE_DEPLOY_DIR/bin/run.sh $APP_KEY 2>&1 &"
}
__check
__init
__package
__remote
附录二
#!/bin/bash
set -e
function __help(){
echo "usage: illegal arg [appkey]."
exit
}
if [[ $# < 1 ]]; then
__help
fi
# 脚本appkey
APP_KEY=$1
GREP_KEY="-Dapp.key=$APP_KEY"
# 脚本所在文件夹
SHELL_DIR=$(cd `dirname $0`; pwd)
echo "脚本所在文件夹:$SHELL_DIR"
echo "此次appkey:$APP_KEY"
cd $SHELL_DIR
cd ..
# 由于部署方式是maven,所以对pom.xml文件的存在性进行检测
if [ ! -f "pom.xml" ]; then
echo "ERROR: not exist filename: pom.xml."
exit
fi
# 停止原有的进程
PID=`ps -ef | grep "\s$GREP_KEY\s" | grep -v grep | awk '{print $2}'`
if [ "$PID" != "" ]; then
kill $PID
sleep 1
fi
PID=`ps -ef | grep "\s$GREP_KEY\s" | grep -v grep | awk '{print $2}'`
if [ "$PID" != "" ]; then
sleep 3
PID=`ps -ef | grep "\s$GREP_KEY\s" | grep -v grep | awk '{print $2}'`
if [ "$PID" != "" ]; then
sleep 8
PID=`ps -ef | grep "\s$GREP_KEY\s" | grep -v grep | awk '{print $2}'`
if [ "$PID" != "" ]; then
sleep 30
PID=`ps -ef | grep "\s$GREP_KEY\s" | grep -v grep | awk '{print $2}'`
if [ "$PID" != "" ]; then
echo 'cannot shutdown normally, so use kill -9'
kill -9 $PID
sleep 30
fi
fi
fi
fi
PID=`ps -ef | grep "\s$GREP_KEY\s" | grep -v grep | awk '{print $2}'`
if [ "$PID" != "" ]; then
echo "停止失败...PID:$PID"
exit
fi
mvn clean jetty:run -Dapp.key=$APP_KEY -Dmaven.test.skip=true > ../std.$APP_KEY.log