166 lines
5.7 KiB
Bash
166 lines
5.7 KiB
Bash
#!/bin/bash
|
||
set -e
|
||
|
||
# 基础
|
||
# export JAVA_HOME=/work/programs/jdk/jdk1.8.0_181
|
||
# export PATH=PATH=$PATH:$JAVA_HOME/bin
|
||
# export CLASSPATH=$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
|
||
|
||
DATE=$(date +%Y%m%d%H%M)
|
||
# 基础路径
|
||
BASE_PATH=/media/pi/KINGTON/data/work/projects/yudao-admin-server
|
||
# 编译后 jar 的地址。部署时,Jenkins 会上传 jar 包到该目录下
|
||
SOURCE_PATH=$BASE_PATH/build
|
||
# 服务名称。同时约定部署服务的 jar 包名字也为它。
|
||
SERVER_NAME=yudao-admin-server
|
||
# 环境
|
||
PROFILES_ACTIVE=dev
|
||
# 健康检查 URL
|
||
HEALTH_CHECK_URL=http://127.0.0.1:48080/actuator/health/
|
||
|
||
# heapError 存放路径
|
||
HEAP_ERROR_PATH=$BASE_PATH/heapError
|
||
# JVM 参数
|
||
JAVA_OPS="-Xms512m -Xmx512m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=$HEAP_ERROR_PATH"
|
||
|
||
# SkyWalking Agent 配置
|
||
#export SW_AGENT_NAME=$SERVER_NAME
|
||
#export SW_AGENT_COLLECTOR_BACKEND_SERVICES=192.168.0.84:11800
|
||
#export SW_GRPC_LOG_SERVER_HOST=192.168.0.84
|
||
#export SW_AGENT_TRACE_IGNORE_PATH="Redisson/PING,/actuator/**,/admin/**"
|
||
#export JAVA_AGENT=-javaagent:/work/skywalking/apache-skywalking-apm-bin/agent/skywalking-agent.jar
|
||
|
||
# 备份
|
||
function backup() {
|
||
# 如果不存在,则无需备份
|
||
if [ ! -f "$BASE_PATH/$SERVER_NAME.jar" ]; then
|
||
echo "[backup] $BASE_PATH/$SERVER_NAME.jar 不存在,跳过备份"
|
||
# 如果存在,则备份到 backup 目录下,使用时间作为后缀
|
||
else
|
||
echo "[backup] 开始备份 $SERVER_NAME ..."
|
||
cp $BASE_PATH/$SERVER_NAME.jar $BASE_PATH/backup/$SERVER_NAME-$DATE.jar
|
||
echo "[backup] 备份 $SERVER_NAME 完成"
|
||
fi
|
||
}
|
||
|
||
# 最新构建代码 移动到项目环境
|
||
function transfer() {
|
||
echo "[transfer] 开始转移 $SERVER_NAME.jar"
|
||
|
||
# 删除原 jar 包
|
||
if [ ! -f "$BASE_PATH/$SERVER_NAME.jar" ]; then
|
||
echo "[transfer] $BASE_PATH/$SERVER_NAME.jar 不存在,跳过删除"
|
||
else
|
||
echo "[transfer] 移除 $BASE_PATH/$SERVER_NAME.jar 完成"
|
||
rm $BASE_PATH/$SERVER_NAME.jar
|
||
fi
|
||
|
||
# 复制新 jar 包
|
||
echo "[transfer] 从 $SOURCE_PATH 中获取 $SERVER_NAME.jar 并迁移至 $BASE_PATH ...."
|
||
cp $SOURCE_PATH/$SERVER_NAME.jar $BASE_PATH
|
||
|
||
echo "[transfer] 转移 $SERVER_NAME.jar 完成"
|
||
}
|
||
|
||
# 停止
|
||
function stop() {
|
||
echo "[stop] 开始停止 $BASE_PATH/$SERVER_NAME"
|
||
PID=$(ps -ef | grep $BASE_PATH/$SERVER_NAME | grep -v "grep" | awk '{print $2}')
|
||
# 如果 Java 服务启动中,则进行关闭
|
||
if [ -n "$PID" ]; then
|
||
# 正常关闭
|
||
echo "[stop] $BASE_PATH/$SERVER_NAME 运行中,开始 kill [$PID]"
|
||
kill -15 $PID
|
||
# 等待最大 60 秒,直到关闭完成。
|
||
for ((i = 0; i < 60; i++))
|
||
do
|
||
sleep 1
|
||
PID=$(ps -ef | grep $BASE_PATH/$SERVER_NAME | grep -v "grep" | awk '{print $2}')
|
||
if [ -n "$PID" ]; then
|
||
echo -e ".\c"
|
||
else
|
||
echo '[stop] 停止 $BASE_PATH/$SERVER_NAME 成功'
|
||
break
|
||
fi
|
||
done
|
||
|
||
# 如果正常关闭失败,那么进行强制 kill -9 进行关闭
|
||
if [ -n "$PID" ]; then
|
||
echo "[stop] $BASE_PATH/$SERVER_NAME 失败,强制 kill -9 $PID"
|
||
kill -9 $PID
|
||
fi
|
||
# 如果 Java 服务未启动,则无需关闭
|
||
else
|
||
echo "[stop] $BASE_PATH/$SERVER_NAME 未启动,无需停止"
|
||
fi
|
||
}
|
||
|
||
# 启动
|
||
function start() {
|
||
# 开启启动前,打印启动参数
|
||
echo "[start] 开始启动 $BASE_PATH/$SERVER_NAME"
|
||
echo "[start] JAVA_OPS: $JAVA_OPS"
|
||
echo "[start] JAVA_AGENT: $JAVA_AGENT"
|
||
echo "[start] PROFILES: $PROFILES_ACTIVE"
|
||
|
||
# 开始启动
|
||
BUILD_ID=dontKillMe nohup java -server $JAVA_OPS $JAVA_AGENT -jar $BASE_PATH/$SERVER_NAME.jar --spring.profiles.active=$PROFILES_ACTIVE &
|
||
echo "[start] 启动 $BASE_PATH/$SERVER_NAME 完成"
|
||
}
|
||
|
||
# 健康检查
|
||
function healthCheck() {
|
||
# 如果配置健康检查,则进行健康检查
|
||
if [ -n "$HEALTH_CHECK_URL" ]; then
|
||
# 健康检查最大 60 秒,直到健康检查通过
|
||
echo "[healthCheck] 开始通过 $HEALTH_CHECK_URL 地址,进行健康检查";
|
||
for ((i = 0; i < 60; i++))
|
||
do
|
||
# 请求健康检查地址,只获取状态码。
|
||
result=`curl -I -m 10 -o /dev/null -s -w %{http_code} $HEALTH_CHECK_URL || echo "000"`
|
||
# 如果状态码为 200,则说明健康检查通过
|
||
if [ "$result" == "200" ]; then
|
||
echo "[healthCheck] 健康检查通过";
|
||
break
|
||
# 如果状态码非 200,则说明未通过。sleep 1 秒后,继续重试
|
||
else
|
||
echo -e ".\c"
|
||
sleep 1
|
||
fi
|
||
done
|
||
|
||
# 健康检查未通过,则异常退出 shell 脚本,不继续部署。
|
||
if [ ! "$result" == "200" ]; then
|
||
echo "[healthCheck] 健康检查不通过,可能部署失败。查看日志,自行判断是否启动成功";
|
||
tail -n 10 nohup.out
|
||
exit 1;
|
||
# 健康检查通过,打印最后 10 行日志,可能部署的人想看下日志。
|
||
else
|
||
tail -n 10 nohup.out
|
||
fi
|
||
# 如果未配置健康检查,则 slepp 60 秒,人工看日志是否部署成功。
|
||
else
|
||
echo "[healthCheck] HEALTH_CHECK_URL 未配置,开始 sleep 60 秒";
|
||
sleep 60
|
||
echo "[healthCheck] sleep 60 秒完成,查看日志,自行判断是否启动成功";
|
||
tail -n 50 nohup.out
|
||
fi
|
||
}
|
||
|
||
# 部署
|
||
function deploy() {
|
||
cd $BASE_PATH
|
||
# 备份原 jar
|
||
backup
|
||
# 停止 Java 服务
|
||
stop
|
||
# 部署新 jar
|
||
transfer
|
||
# 启动 Java 服务
|
||
start
|
||
# 健康检查
|
||
# healthCheck
|
||
}
|
||
|
||
deploy
|