liunx环境中前端和后端jar包部署工具
liunx环境中前端和后端jar包部署工具
本脚本用于部署前端到Nginx web目录中,或者部署后端jar的工具。
1、脚本(deploy.sh)
#!/bin/sh
# set -e
set -o pipefail
# ***************************** INIT *******************
OPERATION=$1
APP_FILE=$2
OPERATION=${OPERATION:="NULL"}
APP_FILE=${APP_FILE:="NULL"}
BASE_PATH=$(cd $(dirname $0); pwd)
# 日志目录
LOG_PATH="${BASE_PATH}/logs"
[ ! -d ${LOG_PATH} ] && mkdir -p ${LOG_PATH}
# -- 命令行输出日志
LOG_NAME="${LOG_PATH}/sh_operation_$(hostname).log"
# ***************************** INIT END *******************
# web nginx 部署:“部署名称” “部署目录” “上一版备份目录前缀”
function deployWeb {
echo "==========$1=========="
echo "$(log_info)1/3开始备份 ......"
sleep 2s;
WWW=$2
WWW_B="/ccips-web/backup/$3_$(date '+%Y%m%d%H%M%S')"
if [ -f ${WWW}/index.html ]; then
[ ! -d ${WWW_B} ] && mkdir -p ${WWW_B}
echo "$(log_info)已创建备份文件夹:${WWW_B}"
mv -f ${WWW}/* ${WWW_B}/
echo "$(log_info)备份完成!!!"
else
echo "$(log_info)!当前服务未部署,无需备份!"
fi
[ ! -d ${WWW} ] && mkdir -p ${WWW}
echo "$(log_info)2/3开始解压程序 ......"
sleep 2s;
unzip ${APP_FILE} -d ${WWW}
echo "$(log_info)3/3清理缓存 ......"
sleep 1s;
rm -rvf ${WWW}/__*
echo "$(log_info)部署完成!!"
}
# 进程ID
function getPid() {
APP_NAME=$1
PID_FILE=$2
declare -a FLAG
count=0
SERVER_PID=$(ps -ef | { grep "${APP_NAME}" || true; } | { grep -v "deploy.sh" || true; } | { grep -v "grep" || true; } | awk '{print $2}')
echo "$(log_info)服务文件名: ${APP_NAME}"
if [ ! "${SERVER_PID}" == "" ]; then
echo "$(log_info)服务进程PID: ${SERVER_PID}"
fi
for pro in ${SERVER_PID}; do
FLAG[$count]=$pro
let count++
done
if [ ${#FLAG[*]} -gt 0 ]; then
echo ${SERVER_PID} > ${PID_FILE}
else
[ -f ${PID_FILE} ] && { rm -f ${PID_FILE}; }
fi
}
# 停止
function stop(){
SERVER_NAME=$1
PID_FILE=$2
getPid $3 ${PID_FILE}
if [ -f ${PID_FILE} ]; then
APP_PID=$(cat ${PID_FILE})
echo "$(log_info)准备停止服务 ${SERVER_NAME} ,PID:${APP_PID}..."
kill -9 ${APP_PID}
sleep 3
[ $? -eq 0 ] && rm -f ${PID_FILE} && echo "$(log_info)${SERVER_NAME}已停止。" || { echo "$(log_error)${SERVER_NAME}停止失败。" && exit 13; }
else
echo "$(log_info)${SERVER_NAME}服务已经停止..."
fi
}
# 启动
function start(){
SERVER_NAME=$1
PID_FILE=$2
APP_LOGS="/work/enh_back/logs"
echo "$(log_info)${SERVER_NAME} 服务准备启动..."
[ ! -d ${APP_LOGS} ] && mkdir -p ${APP_LOGS}
APP_LOGS="${APP_LOGS}/${SERVER_NAME}.log"
nohup java -jar /work/enh_back/$3 > ${APP_LOGS} 2>&1 &
echo "$(log_info)日志输出到:${APP_LOGS}"
sleep 3
# 获取服务进程ID写入pid文件
getPid ${PID_FILE}
[ ! -f ${PID_FILE} ] && echo "$(log_error)${SERVER_NAME}启动失败!" && exit 12 || echo "$(log_info)${SERVER_NAME}启动成功,进程ID为${SERVER_PID}."
}
# jar包部署
function deployJar {
echo "==========后端服务部署=========="
echo "$(log_info)1/3 初始化 ......"
# jar包路文件名
APP_NAME="$(basename ${APP_FILE})"
# 服务名
SERVER_NAME=$(echo "${APP_NAME}" | grep -o ".*[^0-9.jar]" | sed -r "s/-$//g")
# pid
PID_FILE="/work/enh_back/pid"
[ ! -d ${PID_FILE} ] && mkdir -p ${PID_FILE}
PID_FILE="${PID_FILE}/${SERVER_NAME}.pid"
echo "$(log_info)本次部署服务包名:${APP_NAME}"
echo "$(log_info)查询并停止服务:${SERVER_NAME}"
echo "$(log_info)"
echo "$(log_info)2/3 开始停止服务 ......"
stop ${SERVER_NAME} ${PID_FILE} ${APP_NAME}
sleep 1s;
echo "$(log_info)"
echo "$(log_info)3/3 启动服务 ......"
mv -f ./${APP_NAME} /work/enh_back/
start ${SERVER_NAME} ${PID_FILE} ${APP_NAME}
sleep 1s;
echo "$(log_info)"
echo "$(log_info)后端服务署完成!!"
sleep 1s;
read -t 7 -p "是否立即打印启动日志?y/n" SHOW
if [ "${SHOW}" == "y" ]; then
tail -f ${APP_LOGS}
fi
}
# ************************** CHECK *******************
function checkInput() {
echo ""
if [ ${OPERATION} == "NULL" ]; then
echo "$(log_error)操作类型不能为空,请重新输入!例如:‘m’‘t’‘p’‘s’中的一个字符"
defaults
exit 10
elif [ ${APP_FILE} == "NULL" ]; then
echo "$(log_error)所输入程序包路径错误,请重新输入!"
defaults
exit 10
fi
if [ ! -f ${APP_FILE} ]; then
echo "$(log_error)程序包文件不存在,请检查!"
exit 10
fi
echo ""
}
# ************************** CHECK END *******************
# ************************** DEFAULTS USEAGE *******************
function defaults() {
echo ""
echo "eg: sh deploy.sh <m|t|p|s> <./ccips-base.jar|./dist-20230101.zip>"
echo ""
echo "提示第一个参数4个字符可选:m:移动端页面;t:其他页面;p:PC端web页面;s:后端java服务!"
echo "提示第二个参数指的是要部署的程序包:前端例如“./dist-20230101.zip”;jar包例如:“./enh-ccips-base.jar”!"
echo ""
echo ""
}
# ***************************** DEFAULTS USEAGE *******************
# ******************** FUNCTION log_info BEGIN **************************
function log_info() {
echo "[$(date +'%Y-%m-%d %H:%M:%S')][INFO]:"
}
# ******************** FUNCTION log_info END ***************************
# ******************** FUNCTION log_info BEGIN **************************
function log_error() {
echo "[$(date +'%Y-%m-%d %H:%M:%S')][ERROR]:"
}
# ******************** FUNCTION log_info END ***************************
function main() {
case $OPERATION in
# 移动端
"m")
checkInput
deployWeb "移动端web页面部署" "/ccips-web/moble" "moble"
;;
# 客户协同
"t")
checkInput
deployWeb "内部端部署" "/ccips-web/company" "company"
;;
# PC系统
"p")
checkInput
deployWeb "移动端web页面部署" "/ccips-web/enh_web" "enh_web"
;;
# 后端服务
"s")
checkInput
deployJar
;;
*)
echo "$(log_error)操作名输入错误,请重新输入!"
defaults
exit 12
;;
esac
}
main | tee -a ${LOG_NAME}
注意:
1、注意:脚本在使用时需要据情况修改固定目录地址,这里只是示例。
2、脚本文件名称修改需要同时修改脚本内容中的对应名称。
2、使用说明
# 使用方法
sh deploy.sh <m|t|p|s> <./ccips-base.jar|./dist-20230101.zip>
# 直接执行指令可以看到使用提示
[root@openEuler ~]# sh deploy.sh
[2023-08-14 12:20:52][ERROR]:操作名输入错误,请重新输入!
eg: sh deploy.sh <m|t|p|s> <./ccips-base.jar|./ibas-mes.jar>
提示第一个参数4个字符可选:m:移动端页面;t:客户协同页面;p:PC端web页面;s:后端java服务!
提示第二个参数指的是要部署的程序包:前端例如“./dist-20230101.zip”;jar包例如:“./enh-ccips-base.jar”!
后端部署示例:
sh deploy.sh s ./enh_eureka-230802.jar