refactor(deploy): 重构部署脚本并优化构建流程
Some checks failed
Build and Deploy / deploy (push) Has been cancelled
Some checks failed
Build and Deploy / deploy (push) Has been cancelled
- 简化脚本结构,移除冗余函数和配置 - 添加 Maven 本地仓库路径配置,解决权限问题 - 引入构建日志记录和进程清理功能 - 优化内存限制和错误处理机制 - 统一部署流程,提升脚本可维护性
This commit is contained in:
@@ -1,214 +1,101 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
# ============================================
|
# ============================================
|
||||||
# 全量部署脚本 - 前后端一起部署
|
# 增强版全量部署脚本 - 带有深度日志追踪与权限优化
|
||||||
# 用法: bash deploy-all.sh [backend-only|frontend-only]
|
|
||||||
# ============================================
|
# ============================================
|
||||||
set -e
|
set -e
|
||||||
|
|
||||||
DATE=$(date +%Y%m%d%H%M)
|
|
||||||
|
|
||||||
# ==================== 配置区 ====================
|
# ==================== 配置区 ====================
|
||||||
# 项目路径
|
PROJECT_DIR="/www/wwwroot/sionrui"
|
||||||
PROJECT_DIR=/www/wwwroot/sionrui
|
BACKEND_DIR="/www/wwwroot/yudao-server"
|
||||||
|
FRONTEND_DIR="/www/wwwroot/muyetools.cn"
|
||||||
|
|
||||||
# 后端配置
|
BACKEND_JAR_NAME="yudao-server.jar"
|
||||||
BACKEND_DIR=/www/wwwroot/yudao-server
|
|
||||||
BACKEND_JAR_NAME=yudao-server.jar
|
|
||||||
BACKEND_PORT=9900
|
BACKEND_PORT=9900
|
||||||
|
BUILD_LOG="/tmp/gitea_build_$(date +%Y%m%d).log"
|
||||||
|
|
||||||
# 前端配置
|
# 关键:强制指定 Maven 仓库到 www 用户有权访问的地方
|
||||||
FRONTEND_SRC=$PROJECT_DIR/frontend/app/web-gold/dist
|
MAVEN_REPO="$PROJECT_DIR/.m2_repo"
|
||||||
FRONTEND_DIR=/www/wwwroot/muyetools.cn
|
mkdir -p $MAVEN_REPO && chmod -R 777 $MAVEN_REPO
|
||||||
|
|
||||||
# JVM 参数
|
# 限制 Maven 内存,防止隐性 OOM
|
||||||
JAVA_OPTS="-Xms1g -Xmx1g -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=$BACKEND_DIR/heapError"
|
export MAVEN_OPTS="-Xms256m -Xmx512m"
|
||||||
|
export NODE_OPTIONS="--max-old-space-size=1024"
|
||||||
# 环境
|
|
||||||
PROFILES_ACTIVE=prod
|
|
||||||
|
|
||||||
# 健康检查 URL
|
|
||||||
HEALTH_CHECK_URL=http://127.0.0.1:$BACKEND_PORT/actuator/health/
|
|
||||||
|
|
||||||
# ==================== 初始化目录 ====================
|
|
||||||
init_dirs() {
|
|
||||||
mkdir -p $BACKEND_DIR
|
|
||||||
mkdir -p $BACKEND_DIR/logs
|
|
||||||
mkdir -p $BACKEND_DIR/backup
|
|
||||||
mkdir -p $BACKEND_DIR/heapError
|
|
||||||
mkdir -p $BACKEND_DIR/config
|
|
||||||
mkdir -p $FRONTEND_DIR
|
|
||||||
}
|
|
||||||
|
|
||||||
# ==================== 函数定义 ====================
|
|
||||||
|
|
||||||
|
# ==================== 工具函数 ====================
|
||||||
log() {
|
log() {
|
||||||
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1"
|
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a $BUILD_LOG
|
||||||
}
|
}
|
||||||
|
|
||||||
# 后端备份
|
# 清理残留进程
|
||||||
backup_backend() {
|
cleanup_old_processes() {
|
||||||
if [ -f "$BACKEND_DIR/$BACKEND_JAR_NAME" ]; then
|
log "检查并清理旧的构建/运行进程..."
|
||||||
log "[后端] 备份旧 JAR 包..."
|
# 杀掉之前的构建进程(如果有)
|
||||||
mkdir -p $BACKEND_DIR/backup
|
pkill -f "maven" || true
|
||||||
cp $BACKEND_DIR/$BACKEND_JAR_NAME $BACKEND_DIR/backup/yudao-server-$DATE.jar
|
pkill -f "pnpm" || true
|
||||||
# 只保留最近 5 个备份
|
|
||||||
cd $BACKEND_DIR/backup && ls -t | tail -n +6 | xargs -r rm -f
|
|
||||||
fi
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# 停止后端服务
|
# ==================== 核心逻辑 ====================
|
||||||
stop_backend() {
|
|
||||||
log "[后端] 停止服务..."
|
|
||||||
PID=$(ps -ef | grep $BACKEND_DIR/$BACKEND_JAR_NAME | grep -v "grep" | awk '{print $2}')
|
|
||||||
|
|
||||||
if [ -n "$PID" ]; then
|
|
||||||
log "[后端] 发现进程 PID: $PID,正在停止..."
|
|
||||||
kill -15 $PID
|
|
||||||
|
|
||||||
# 等待最多 60 秒
|
|
||||||
for i in {1..60}; do
|
|
||||||
sleep 1
|
|
||||||
PID=$(ps -ef | grep $BACKEND_DIR/$BACKEND_JAR_NAME | grep -v "grep" | awk '{print $2}')
|
|
||||||
if [ -z "$PID" ]; then
|
|
||||||
log "[后端] 服务已停止"
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
echo -n "."
|
|
||||||
done
|
|
||||||
|
|
||||||
# 强制杀死
|
|
||||||
log "[后端] 强制停止..."
|
|
||||||
kill -9 $PID 2>/dev/null || true
|
|
||||||
else
|
|
||||||
log "[后端] 服务未运行"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# 启动后端服务
|
|
||||||
start_backend() {
|
|
||||||
log "[后端] 启动服务..."
|
|
||||||
log "[后端] JAVA_OPTS: $JAVA_OPTS"
|
|
||||||
log "[后端] PROFILES: $PROFILES_ACTIVE"
|
|
||||||
|
|
||||||
cd $BACKEND_DIR
|
|
||||||
mkdir -p $BACKEND_DIR/logs
|
|
||||||
mkdir -p $BACKEND_DIR/heapError
|
|
||||||
nohup java -server $JAVA_OPTS -jar $BACKEND_JAR_NAME --spring.profiles.active=$PROFILES_ACTIVE > $BACKEND_DIR/logs/console.log 2>&1 &
|
|
||||||
|
|
||||||
log "[后端] 服务启动中..."
|
|
||||||
}
|
|
||||||
|
|
||||||
# 后端健康检查
|
|
||||||
health_check() {
|
|
||||||
if [ -n "$HEALTH_CHECK_URL" ]; then
|
|
||||||
log "[后端] 健康检查开始..."
|
|
||||||
|
|
||||||
for i in {1..120}; do
|
|
||||||
sleep 1
|
|
||||||
result=$(curl -s -o /dev/null -w "%{http_code}" $HEALTH_CHECK_URL 2>/dev/null || echo "000")
|
|
||||||
|
|
||||||
if [ "$result" == "200" ]; then
|
|
||||||
log "[后端] 健康检查通过!"
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
echo -n "."
|
|
||||||
done
|
|
||||||
|
|
||||||
log "[后端] 健康检查失败,查看日志:"
|
|
||||||
tail -n 20 $BACKEND_DIR/logs/console.log
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# 部署后端
|
|
||||||
deploy_backend() {
|
deploy_backend() {
|
||||||
log "========== 开始部署后端 =========="
|
log "========== [后端] 开始部署 =========="
|
||||||
|
|
||||||
# 拉取代码
|
|
||||||
log "[后端] 拉取最新代码..."
|
|
||||||
cd $PROJECT_DIR
|
cd $PROJECT_DIR
|
||||||
|
log "1. 拉取代码..."
|
||||||
git fetch origin
|
git fetch origin
|
||||||
git reset --hard origin/main
|
git reset --hard origin/main
|
||||||
|
|
||||||
# 构建(只构建 yudao-server 模块)
|
log "2. 开始编译 (日志记录在: $BUILD_LOG)..."
|
||||||
log "[后端] 构建 JAR 包..."
|
# 移除 -q,增加 -U (强制更新),显式指定仓库
|
||||||
mvn clean package -DskipTests -pl yudao-server -am
|
# 使用 2>&1 将错误也抓取到日志中
|
||||||
|
mvn clean package -DskipTests -pl yudao-server -am -Dmaven.repo.local=$MAVEN_REPO >> $BUILD_LOG 2>&1
|
||||||
# 备份
|
|
||||||
backup_backend
|
if [ $? -ne 0 ]; then
|
||||||
|
log "❌ 后端编译失败!请查看 $BUILD_LOG"
|
||||||
# 复制新 JAR
|
exit 1
|
||||||
log "[后端] 复制 JAR 包..."
|
|
||||||
cp $PROJECT_DIR/yudao-server/target/yudao-server.jar $BACKEND_DIR/
|
|
||||||
|
|
||||||
# 停止旧服务
|
|
||||||
stop_backend
|
|
||||||
|
|
||||||
# 启动新服务
|
|
||||||
start_backend
|
|
||||||
|
|
||||||
# 健康检查
|
|
||||||
health_check
|
|
||||||
|
|
||||||
log "========== 后端部署完成 =========="
|
|
||||||
}
|
|
||||||
|
|
||||||
# 部署前端
|
|
||||||
deploy_frontend() {
|
|
||||||
log "========== 开始部署前端 =========="
|
|
||||||
|
|
||||||
cd $PROJECT_DIR/frontend
|
|
||||||
|
|
||||||
# 安装依赖
|
|
||||||
log "[前端] 安装依赖..."
|
|
||||||
pnpm install
|
|
||||||
|
|
||||||
# 构建
|
|
||||||
log "[前端] 构建项目..."
|
|
||||||
pnpm build
|
|
||||||
|
|
||||||
# 备份旧文件
|
|
||||||
if [ -d "$FRONTEND_DIR" ] && [ "$(ls -A $FRONTEND_DIR 2>/dev/null)" ]; then
|
|
||||||
log "[前端] 备份旧文件..."
|
|
||||||
mkdir -p /www/wwwroot/web-gold-backup
|
|
||||||
rm -rf /www/wwwroot/web-gold-backup/dist-$DATE
|
|
||||||
cp -r $FRONTEND_DIR /www/wwwroot/web-gold-backup/dist-$DATE
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# 部署新文件
|
log "3. 准备启动 JAR..."
|
||||||
log "[前端] 部署新文件..."
|
mkdir -p $BACKEND_DIR/backup
|
||||||
|
[ -f "$BACKEND_DIR/$BACKEND_JAR_NAME" ] && cp $BACKEND_DIR/$BACKEND_JAR_NAME $BACKEND_DIR/backup/server-$(date +%H%M).jar
|
||||||
|
cp $PROJECT_DIR/yudao-server/target/$BACKEND_JAR_NAME $BACKEND_DIR/
|
||||||
|
|
||||||
|
log "4. 重启服务..."
|
||||||
|
PID=$(ps -ef | grep $BACKEND_DIR/$BACKEND_JAR_NAME | grep -v "grep" | awk '{print $2}')
|
||||||
|
[ -z "$PID" ] || kill -9 $PID
|
||||||
|
|
||||||
|
cd $BACKEND_DIR
|
||||||
|
nohup java -Xms512m -Xmx512m -jar $BACKEND_JAR_NAME --spring.profiles.active=prod > $BACKEND_DIR/logs/console.log 2>&1 &
|
||||||
|
|
||||||
|
log "✅ 后端部署指令已发出,请稍后检查端口 $BACKEND_PORT"
|
||||||
|
}
|
||||||
|
|
||||||
|
deploy_frontend() {
|
||||||
|
log "========== [前端] 开始部署 =========="
|
||||||
|
cd $PROJECT_DIR/frontend
|
||||||
|
|
||||||
|
log "1. 安装依赖 (pnpm)..."
|
||||||
|
pnpm install >> $BUILD_LOG 2>&1
|
||||||
|
|
||||||
|
log "2. 前端构建..."
|
||||||
|
pnpm build >> $BUILD_LOG 2>&1
|
||||||
|
|
||||||
|
log "3. 发布文件..."
|
||||||
rm -rf $FRONTEND_DIR/*
|
rm -rf $FRONTEND_DIR/*
|
||||||
cp -r $FRONTEND_SRC/* $FRONTEND_DIR/
|
cp -r $PROJECT_DIR/frontend/app/web-gold/dist/* $FRONTEND_DIR/
|
||||||
|
|
||||||
log "========== 前端部署完成 =========="
|
log "✅ 前端部署完成"
|
||||||
}
|
}
|
||||||
|
|
||||||
# ==================== 主流程 ====================
|
# ==================== 主入口 ====================
|
||||||
|
cleanup_old_processes
|
||||||
|
|
||||||
main() {
|
case "$1" in
|
||||||
log "=========================================="
|
backend-only) deploy_backend ;;
|
||||||
log "开始部署: $(date '+%Y-%m-%d %H:%M:%S')"
|
frontend-only) deploy_frontend ;;
|
||||||
log "=========================================="
|
*)
|
||||||
|
deploy_backend
|
||||||
|
deploy_frontend
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
# 初始化目录
|
log "🚀 所有流程执行完毕!"
|
||||||
init_dirs
|
|
||||||
|
|
||||||
case "$1" in
|
|
||||||
backend-only)
|
|
||||||
deploy_backend
|
|
||||||
;;
|
|
||||||
frontend-only)
|
|
||||||
deploy_frontend
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
deploy_backend
|
|
||||||
deploy_frontend
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
log "=========================================="
|
|
||||||
log "全部部署完成: $(date '+%Y-%m-%d %H:%M:%S')"
|
|
||||||
log "=========================================="
|
|
||||||
}
|
|
||||||
|
|
||||||
main "$@"
|
|
||||||
Reference in New Issue
Block a user