我的部署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