个人部署maven项目

背景

在每次都是使用部署的时候都需要一系列的动作(删除多余项、打包、上传、杀进程、解压缩等),是一件很消耗精力的事情。

于是写了一个自动化脚本来完成这件事。

针对的项目格式:

  • 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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值