在每次都是使用部署的時候都須要一系列的動做(刪除多餘項、打包、上傳、殺進程、解壓縮等),是一件很消耗精力的事情。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