diff --git a/script/deploy/deploy-all.sh b/script/deploy/deploy-all.sh index a86cc1f7cd..726bba5946 100644 --- a/script/deploy/deploy-all.sh +++ b/script/deploy/deploy-all.sh @@ -1,11 +1,9 @@ #!/bin/bash # ============================================ -# 增强版全量部署脚本 - 带有深度日志追踪与权限优化 +# 芋道源码全量部署脚本 - 生产环境专用版 # ============================================ set -e - - # ==================== 配置区 ==================== PROJECT_DIR="/www/wwwroot/sionrui" BACKEND_DIR="/www/wwwroot/yudao-server" @@ -15,82 +13,91 @@ BACKEND_JAR_NAME="yudao-server.jar" BACKEND_PORT=9900 BUILD_LOG="/tmp/gitea_build_$(date +%Y%m%d).log" -# 关键:强制指定 Maven 仓库到 www 用户有权访问的地方 -MAVEN_REPO="$PROJECT_DIR/.m2_repo" -mkdir -p $MAVEN_REPO && chmod -R 777 $MAVEN_REPO - -# 限制 Maven 内存,防止隐性 OOM -export MAVEN_OPTS="-Xms256m -Xmx512m" -export NODE_OPTIONS="--max-old-space-size=1024" +# 强制指定 JDK 17 (根据你的截图路径) export JAVA_HOME="/www/server/java/jdk-17.0.8" export PATH=$JAVA_HOME/bin:$PATH +# Maven 仓库与内存优化 +MAVEN_REPO="$PROJECT_DIR/.m2_repo" +mkdir -p $MAVEN_REPO && chmod -R 777 $MAVEN_REPO +export MAVEN_OPTS="-Xms256m -Xmx512m" # ==================== 工具函数 ==================== log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a $BUILD_LOG } -# 清理残留进程 -cleanup_old_processes() { - log "检查并清理旧的构建/运行进程..." - # 杀掉之前的构建进程(如果有) - pkill -f "maven" || true - pkill -f "pnpm" || true -} - # ==================== 核心逻辑 ==================== deploy_backend() { log "========== [后端] 开始部署 ==========" + # 1. 代码同步 cd $PROJECT_DIR - log "1. 拉取代码..." + log "1.1 拉取最新代码..." git fetch origin git reset --hard origin/main - log "2. 开始编译 (日志记录在: $BUILD_LOG)..." - # 移除 -q,增加 -U (强制更新),显式指定仓库 - # 使用 2>&1 将错误也抓取到日志中 + # 2. 编译打包 + log "1.2 开始 Maven 编译 (详情见 $BUILD_LOG)..." + # 显式使用项目内的 yudao-server 模块进行构建 mvn clean package -DskipTests -pl yudao-server -am -Dmaven.repo.local=$MAVEN_REPO >> $BUILD_LOG 2>&1 - if [ $? -ne 0 ]; then - log "❌ 后端编译失败!请查看 $BUILD_LOG" - exit 1 + # 3. 进程清理 (解决文件占用问题) + log "1.3 正在清理旧进程..." + # 强制杀掉占用 9900 端口或运行该 JAR 的进程 + PID=$(ps -ef | grep "$BACKEND_JAR_NAME" | grep -v "grep" | awk '{print $2}') + if [ -n "$PID" ]; then + kill -9 $PID || true + sleep 2 fi - log "3. 复制 JAR 包..." - cp $PROJECT_DIR/yudao-server/target/$BACKEND_JAR_NAME $BACKEND_DIR/ + # 4. 安全复制 (先删再拷) + log "1.4 复制 JAR 包到运行目录..." + mkdir -p $BACKEND_DIR/logs + + # 检查源文件是否存在 + SOURCE_JAR="$PROJECT_DIR/yudao-server/target/$BACKEND_JAR_NAME" + if [ ! -f "$SOURCE_JAR" ]; then + log "❌ 错误:未找到生成的 JAR 包:$SOURCE_JAR" + exit 1 + fi + + rm -f "$BACKEND_DIR/$BACKEND_JAR_NAME" + cp -f "$SOURCE_JAR" "$BACKEND_DIR/" + log "JAR 包复制完成: $(ls -lh $BACKEND_DIR/$BACKEND_JAR_NAME | awk '{print $5}')" - log "4. 重启服务..." - PID=$(ps -ef | grep $BACKEND_DIR/$BACKEND_JAR_NAME | grep -v "grep" | awk '{print $2}') - [ -z "$PID" ] || kill -9 $PID - + # 5. 启动服务 (完全脱离终端) + log "1.5 启动后端服务..." cd $BACKEND_DIR - nohup java -Xms512m -Xmx512m -jar $BACKEND_JAR_NAME --spring.profiles.active=prod > $BACKEND_DIR/logs/console.log 2>&1 & + # 关键:通过重定向所有输出到 /dev/null 防止脚本挂起 + nohup java -Xms512m -Xmx512m -jar $BACKEND_JAR_NAME --spring.profiles.active=prod > ./logs/console.log 2>&1 & - log "✅ 后端部署指令已发出,请稍后检查端口 $BACKEND_PORT" + log "✅ 后端启动指令已发送" } deploy_frontend() { log "========== [前端] 开始部署 ==========" cd $PROJECT_DIR/frontend - log "1. 安装依赖 (pnpm)..." + log "2.1 安装依赖 (pnpm)..." pnpm install >> $BUILD_LOG 2>&1 - log "2. 前端构建..." + log "2.2 前端构建 (Build)..." pnpm build >> $BUILD_LOG 2>&1 - log "3. 发布文件..." + log "2.3 部署静态文件..." + # 确保目标目录干净 rm -rf $FRONTEND_DIR/* cp -r $PROJECT_DIR/frontend/app/web-gold/dist/* $FRONTEND_DIR/ log "✅ 前端部署完成" } -# ==================== 主入口 ==================== -cleanup_old_processes +# ==================== 主流程 ==================== + +# 运行前清理可能的构建残留 +pkill -f "maven" || true case "$1" in backend-only) deploy_backend ;; @@ -99,6 +106,4 @@ case "$1" in deploy_backend deploy_frontend ;; -esac - -log "🚀 所有流程执行完毕!" \ No newline at end of file +esac \ No newline at end of file