前端后端部署工具

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

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值