This commit is contained in:
2026-03-21 23:50:11 +08:00
parent 056a72291d
commit 088159d437

View File

@@ -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 "🚀 所有流程执行完毕!"
esac