deploy-dev.sh 4.9 KB
#!/bin/bash

# SMF Core 开发环境部署脚本
# 此脚本用于将应用部署到开发环境服务器

# 错误时退出
set -e

echo "========================================"
echo "开始部署 SMF Core 到开发环境"
echo "========================================"

# 项目根目录
PROJECT_ROOT=$(dirname "$(dirname "$0")")
cd "$PROJECT_ROOT"

# 部署配置
DEPLOY_HOST="dev-server.example.com"  # 开发服务器主机名或IP
DEPLOY_USER="deploy"                  # 部署用户名
DEPLOY_PATH="/opt/smf-core"           # 部署路径
APP_NAME="smf-core"                   # 应用名称

# 构建配置
BUILD_PROFILE="dev"                   # Maven 构建配置
JAR_PATH="target/*.jar"               # JAR 文件路径

# 检查是否存在构建好的 JAR 文件
if [ ! "$(ls -A $JAR_PATH 2>/dev/null)" ]; then
  echo "未找到构建好的 JAR 文件,开始构建项目..."
  mvn clean package -DskipTests -P$BUILD_PROFILE
fi

# 获取最新的 JAR 文件
JAR_FILE=$(ls -t $JAR_PATH | head -n 1)
JAR_FILENAME=$(basename "$JAR_FILE")
TIMESTAMP=$(date +"%Y%m%d%H%M%S")
DEPLOY_JAR_NAME="${APP_NAME}-${TIMESTAMP}.jar"

echo "\n准备部署: $JAR_FILENAME"
echo "部署目标: $DEPLOY_USER@$DEPLOY_HOST:$DEPLOY_PATH"

# 检查 SSH 连接
echo "\n检查 SSH 连接..."
if ! ssh -q -o BatchMode=yes -o ConnectTimeout=5 "$DEPLOY_USER@$DEPLOY_HOST" 'echo 2>/dev/null'; then
  echo "错误: 无法连接到 $DEPLOY_HOST"
  echo "请确保您有正确的 SSH 密钥并已添加到 authorized_keys"
  exit 1
fi

# 创建远程目录
echo "\n创建远程目录..."
ssh "$DEPLOY_USER@$DEPLOY_HOST" "mkdir -p $DEPLOY_PATH $DEPLOY_PATH/logs $DEPLOY_PATH/backups"

# 备份当前部署
echo "\n备份当前部署..."
ssh "$DEPLOY_USER@$DEPLOY_HOST" "\
  if [ -f '$DEPLOY_PATH/${APP_NAME}.jar' ]; then \
    cp '$DEPLOY_PATH/${APP_NAME}.jar' '$DEPLOY_PATH/backups/${APP_NAME}-$(date +\"%Y%m%d%H%M%S\").jar.bak'; \
  fi"

# 上传 JAR 文件
echo "\n上传应用到服务器..."
scp "$JAR_FILE" "$DEPLOY_USER@$DEPLOY_HOST:$DEPLOY_PATH/$DEPLOY_JAR_NAME"

# 创建符号链接指向最新版本
echo "\n更新符号链接..."
ssh "$DEPLOY_USER@$DEPLOY_HOST" "\
  ln -sf '$DEPLOY_PATH/$DEPLOY_JAR_NAME' '$DEPLOY_PATH/${APP_NAME}.jar'; \
  ls -la '$DEPLOY_PATH/${APP_NAME}.jar'"

# 创建或更新启动脚本
echo "\n更新启动脚本..."
cat > start.sh << 'EOF'
#!/bin/bash

# SMF Core 启动脚本

APP_NAME="smf-core"
APP_HOME="'"$DEPLOY_PATH"'"
JAR_FILE="$APP_HOME/${APP_NAME}.jar"
LOG_FILE="$APP_HOME/logs/${APP_NAME}.log"

# 设置 Java 选项
JAVA_OPTS="-Xms512m -Xmx1024m -Dspring.profiles.active=$BUILD_PROFILE"

# 检查是否已在运行
if pgrep -f "$JAR_FILE" &> /dev/null; then
  echo "$APP_NAME 已经在运行,请先停止它"
  exit 1
fi

# 启动应用
echo "启动 $APP_NAME..."
nohup java $JAVA_OPTS -jar "$JAR_FILE" > "$LOG_FILE" 2>&1 &

# 输出进程信息
echo "$APP_NAME 已启动,PID: $!"
EOF

# 上传启动脚本
scp start.sh "$DEPLOY_USER@$DEPLOY_HOST:$DEPLOY_PATH/"
ssh "$DEPLOY_USER@$DEPLOY_HOST" "chmod +x $DEPLOY_PATH/start.sh"
rm start.sh

# 创建或更新停止脚本
echo "\n更新停止脚本..."
cat > stop.sh << 'EOF'
#!/bin/bash

# SMF Core 停止脚本

APP_NAME="smf-core"
APP_HOME="'"$DEPLOY_PATH"'"
JAR_FILE="$APP_HOME/${APP_NAME}.jar"

# 查找进程 ID
PID=$(pgrep -f "$JAR_FILE")

if [ -z "$PID" ]; then
  echo "$APP_NAME 未在运行"
  exit 1
fi

# 停止进程
echo "停止 $APP_NAME,PID: $PID..."
kill $PID

# 等待进程结束
count=0
max_count=30  # 最多等待 30 秒
while pgrep -f "$JAR_FILE" &> /dev/null; do
  if [ $count -eq $max_count ]; then
    echo "强制终止进程..."
    kill -9 $PID
    break
  fi
  count=$((count+1))
  sleep 1
done

echo "$APP_NAME 已停止"
EOF

# 上传停止脚本
scp stop.sh "$DEPLOY_USER@$DEPLOY_HOST:$DEPLOY_PATH/"
ssh "$DEPLOY_USER@$DEPLOY_HOST" "chmod +x $DEPLOY_PATH/stop.sh"
rm stop.sh

# 停止当前运行的实例
echo "\n停止当前运行的实例..."
ssh "$DEPLOY_USER@$DEPLOY_HOST" "$DEPLOY_PATH/stop.sh || true"

# 启动新实例
echo "\n启动新实例..."
ssh "$DEPLOY_USER@$DEPLOY_HOST" "$DEPLOY_PATH/start.sh"

echo "\n等待应用启动..."
sleep 5

# 检查部署状态
echo "\n检查部署状态..."
DEPLOY_STATUS=$(ssh "$DEPLOY_USER@$DEPLOY_HOST" "pgrep -f '$DEPLOY_PATH/${APP_NAME}.jar' &> /dev/null; echo \$?")

if [ "$DEPLOY_STATUS" -eq "0" ]; then
  echo "\n========================================"
  echo "部署成功!"
  echo "========================================"
  echo "应用名称: $APP_NAME"
  echo "部署路径: $DEPLOY_PATH"
  echo "应用文件: $DEPLOY_PATH/${APP_NAME}.jar"
  echo "日志文件: $DEPLOY_PATH/logs/${APP_NAME}.log"
  echo "启动命令: $DEPLOY_PATH/start.sh"
  echo "停止命令: $DEPLOY_PATH/stop.sh"
else
  echo "\n========================================"
  echo "部署失败!"
  echo "========================================"
  echo "请检查日志文件: $DEPLOY_PATH/logs/${APP_NAME}.log"
  exit 1
fi