springboot项目部署脚本
Springboot部署脚本
该脚本可用于jenkins自动执行,具有以下功能
- 适配所有以内嵌tomcat容器springboot项目jar包
- 可根据参数选择环境,基于profiles
- 可自动识别并关闭已存在进程
- 第一个参数是指定jar包所在绝对路径(该路径下必须有且仅有一个.jar文件) 第二个参数是spring.profiles标识
用法 sh deploy.sh /app/yourdir/ dev
#!/bin/bash
# 部署Spring Boot应用的Shell脚本
# 检查参数是否正确
if [ $# -lt 1 ] || [ $# -gt 2 ]; then
echo "用法: $0 <应用目录> [环境名称]"
exit 1
fi
APP_DIR=$1
# 检查应用目录是否存在
if [ ! -d "$APP_DIR" ]; then
echo "错误:应用目录不存在:$APP_DIR"
exit 1
fi
# 查找目录中的JAR文件
JAR_FILES=("$APP_DIR"/*.jar)
JAR_COUNT=${#JAR_FILES[@]}
echo "找到Jar包 $JAR_FILES"
# 验证JAR文件数量
if [ $JAR_COUNT -eq 0 ]; then
echo "错误:在目录 $APP_DIR 中未找到任何JAR文件。"
exit 1
elif [ $JAR_COUNT -gt 1 ]; then
echo "错误:在目录 $APP_DIR 中找到多个JAR文件,请确保只有一个。"
echo "找到的JAR文件:"
printf '%s\n' "${JAR_FILES[@]}"
exit 1
fi
APP_JAR=${JAR_FILES[0]}
APP_NAME=$(basename $APP_JAR)
echo "准备执行jar包 $APP_NAME "
PROFILE=${2:-""}
# 函数:停止正在运行的应用
stop_application() {
echo "正在检查应用是否正在运行..."
# 使用jps查找包含指定jar包名称的Java进程
jps -l | grep "$APP_NAME" | while read pid app
do
echo "正在停止应用 [PID: $pid, APP: $app]"
kill $pid
# 等待最多5秒直到进程终止
for i in {1..5}; do
if ps -p $pid > /dev/null; then
sleep 1
else
break
fi
done
# 如果仍然存在则强制终止
if ps -p $pid > /dev/null; then
echo "强制终止应用 [PID: $pid]"
kill -9 $pid
fi
done
}
# 函数:启动应用
start_application() {
if [ -n "$PROFILE" ]; then
JAVA_OPTS="--spring.profiles.active=$PROFILE"
else
JAVA_OPTS=""
fi
echo "准备执行jar包 $APP_JAR"
echo "正在启动应用,当前运行环境为 [$PROFILE]"
nohup java -jar $APP_JAR $JAVA_OPTS > /dev/null 2>&1 &
echo "应用已启动,输出重定向到nohup.out"
}
# 主执行流程
stop_application
# 等待2秒确保进程完全停止
sleep 2
start_application
# 验证启动结果
sleep 10
echo "启动验证:"
jps -l | grep "$APP_NAME" | while read npid napp
do
echo "应用启动成功 [PID: $npid,APP: $napp]"
done