在每次都是使用部署的时候都须要一系列的动做(删除多余项、打包、上传、杀进程、解压缩等),是一件很消耗精力的事情。git
因而写了一个自动化脚原本完成这件事。shell
针对的项目格式:bash
欢迎访问原文站点blog.jiehouse.com 转载请注明出处blog.jiehouse.comapp
文件名:deploy,源码见附录一ssh
该文件实现的逻辑:maven
在pom.xml的上级目录运行该命令:deploy [filename] [appkey]ide
文件名:run.sh,源码见附录二idea
实现的逻辑:code
#!/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