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 ]; thenecho "用法: $0 <應用目錄> [環境名稱]"exit 1
fiAPP_DIR=$1# 檢查應用目錄是否存在
if [ ! -d "$APP_DIR" ]; thenecho "錯誤:應用目錄不存在:$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 ]; thenecho "錯誤:在目錄 $APP_DIR 中未找到任何JAR文件。"exit 1
elif [ $JAR_COUNT -gt 1 ]; thenecho "錯誤:在目錄 $APP_DIR 中找到多個JAR文件,請確保只有一個。"echo "找到的JAR文件:"printf '%s\n' "${JAR_FILES[@]}"exit 1
fiAPP_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 appdoecho "正在停止應用 [PID: $pid, APP: $app]"kill $pid# 等待最多5秒直到進程終止for i in {1..5}; doif ps -p $pid > /dev/null; thensleep 1elsebreakfidone# 如果仍然存在則強制終止if ps -p $pid > /dev/null; thenecho "強制終止應用 [PID: $pid]"kill -9 $pidfidone
}# 函數:啟動應用
start_application() {if [ -n "$PROFILE" ]; thenJAVA_OPTS="--spring.profiles.active=$PROFILE"elseJAVA_OPTS=""fiecho "準備執行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
doecho "應用啟動成功 [PID: $npid,APP: $napp]"
done