#!/bin/bash # ============================================ # 增强版全量部署脚本 - 带有深度日志追踪与权限优化 # ============================================ set -e # ==================== 配置区 ==================== PROJECT_DIR="/www/wwwroot/sionrui" BACKEND_DIR="/www/wwwroot/yudao-server" FRONTEND_DIR="/www/wwwroot/muyetools.cn" 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" export JAVA_HOME="/www/server/java/jdk-17.0.8" export PATH=$JAVA_HOME/bin:$PATH # ==================== 工具函数 ==================== 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 "========== [后端] 开始部署 ==========" cd $PROJECT_DIR log "1. 拉取代码..." git fetch origin git reset --hard origin/main log "2. 开始编译 (日志记录在: $BUILD_LOG)..." # 移除 -q,增加 -U (强制更新),显式指定仓库 # 使用 2>&1 将错误也抓取到日志中 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 fi log "3. 准备启动 JAR..." 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/* cp -r $PROJECT_DIR/frontend/app/web-gold/dist/* $FRONTEND_DIR/ log "✅ 前端部署完成" } # ==================== 主入口 ==================== cleanup_old_processes case "$1" in backend-only) deploy_backend ;; frontend-only) deploy_frontend ;; *) deploy_backend deploy_frontend ;; esac log "🚀 所有流程执行完毕!"