我的部署maven項目

背景

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

因而寫了一個自動化腳原本完成這件事。shell

針對的項目格式:bash

  • pom.xml
  • bin
    • run.sh
  • src
  • others

歡迎訪問原文站點blog.jiehouse.com 轉載請註明出處blog.jiehouse.comapp

打包上傳

文件名:deploy,源碼見附錄一ssh

該文件實現的邏輯:maven

  • 拷貝源代碼到臨時目錄
  • 將臨時目錄中的無用文件刪除(例如:.git|.idea|target等)
  • 將臨時目錄中的文件歸檔,並刪除臨時文件
  • 將歸檔後的文件scp到目的主機的固定目錄中(保存了每次上傳的歷史,之後若是磁盤空間不足能夠刪除)
  • 刪除部署目錄原有的代碼
  • 解壓縮到部署目錄,而後運行其中的run.sh腳本

在pom.xml的上級目錄運行該命令:deploy [filename] [appkey]ide

運行腳本

文件名:run.sh,源碼見附錄二idea

實現的邏輯:code

  • 殺死原有的進程
  • 經過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
相關文章
相關標籤/搜索