Files
happy-life-star/backend-single/deploy.sh
T
2025-12-22 23:40:47 +08:00

181 lines
4.9 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/bin/bash
# 情绪博物馆后端服务部署脚本
# 部署到远程服务器 101.200.208.45
set -e
# 配置变量
APP_NAME="emotion-museum-single"
JAR_NAME="backend-single-1.0.0.jar"
JAR_PATH="./target/${JAR_NAME}"
# 远程服务器配置
REMOTE_HOST="101.200.208.45"
REMOTE_USER="root"
REMOTE_DIR="/data/programs/emotion-museum"
REMOTE_LOG_DIR="/data/logs/emotion-museum"
REMOTE_JAR_NAME="emotion-single-1.0.0.jar"
SPRING_PROFILE="test"
# 颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'
log_info() {
echo -e "${GREEN}[INFO]${NC} $1"
}
log_warn() {
echo -e "${YELLOW}[WARN]${NC} $1"
}
log_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
# 构建项目
build_project() {
log_info "开始构建项目..."
if ! command -v mvn > /dev/null 2>&1; then
log_error "未找到Maven命令,请确保已安装Maven"
exit 1
fi
log_info "执行: mvn clean package -DskipTests"
if ! mvn clean package -DskipTests; then
log_error "项目构建失败"
exit 1
fi
if [ ! -f "$JAR_PATH" ]; then
log_error "项目构建失败,未找到JAR文件: $JAR_PATH"
exit 1
fi
log_info "✅ 项目构建成功: $JAR_PATH"
log_info "文件大小: $(ls -lh $JAR_PATH | awk '{print $5}')"
}
# 检查JAR文件
check_jar() {
if [ ! -f "$JAR_PATH" ]; then
log_error "JAR文件不存在: $JAR_PATH"
log_info "请先执行打包命令: mvn clean package"
exit 1
fi
log_info "JAR文件检查通过: $JAR_PATH"
}
# 显示服务状态
show_status() {
log_info "=== 服务信息 ==="
log_info "服务器地址: $REMOTE_HOST"
log_info "部署目录: $REMOTE_DIR"
log_info "日志目录: $REMOTE_LOG_DIR"
log_info "Spring Profile: $SPRING_PROFILE"
log_info "检查服务状态..."
ssh $REMOTE_USER@$REMOTE_HOST "ps aux | grep $REMOTE_JAR_NAME | grep -v grep" || log_info "服务未运行"
}
# 部署到远程服务器
# 参数: $1 - 可选,指定要上传的额外文件
deploy() {
UPLOAD_SCRIPT="$1"
log_info "开始部署到 $REMOTE_HOST..."
build_project
check_jar
# 创建远程目录
log_info "创建远程目录..."
ssh $REMOTE_USER@$REMOTE_HOST "mkdir -p $REMOTE_DIR" || { log_error "创建远程目录失败"; exit 1; }
ssh $REMOTE_USER@$REMOTE_HOST "mkdir -p $REMOTE_LOG_DIR" || { log_error "创建远程日志目录失败"; exit 1; }
# 上传JAR文件
log_info "上传JAR文件到远程服务器..."
log_info "本地文件: $JAR_PATH"
log_info "远程路径: $REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/$REMOTE_JAR_NAME"
if ! scp "$JAR_PATH" $REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/$REMOTE_JAR_NAME; then
log_error "上传JAR文件失败"
exit 1
fi
log_info "✅ JAR文件上传成功"
# 验证远程文件
log_info "验证远程文件..."
ssh $REMOTE_USER@$REMOTE_HOST "ls -lh $REMOTE_DIR/$REMOTE_JAR_NAME" || { log_error "远程文件验证失败"; exit 1; }
# 上传额外文件
if [ -n "$UPLOAD_SCRIPT" ] && [ -f "$UPLOAD_SCRIPT" ]; then
log_info "上传文件到远程服务器: $UPLOAD_SCRIPT"
if ! scp "$UPLOAD_SCRIPT" $REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/; then
log_error "上传文件失败: $UPLOAD_SCRIPT"
exit 1
fi
log_info "✅ 文件上传成功: $UPLOAD_SCRIPT"
REMOTE_FILENAME=$(basename "$UPLOAD_SCRIPT")
if [[ "$REMOTE_FILENAME" == *.sh ]]; then
ssh $REMOTE_USER@$REMOTE_HOST "chmod +x $REMOTE_DIR/$REMOTE_FILENAME"
fi
fi
# 执行远程部署
log_info "在远程服务器上执行部署..."
if ! ssh $REMOTE_USER@$REMOTE_HOST "cd $REMOTE_DIR && ./deploy-server.sh $SPRING_PROFILE"; then
log_error "远程部署脚本执行失败"
exit 1
fi
log_info "✅ 部署完成!"
show_status
}
# 打印使用说明
print_usage() {
echo "用法: $0 [命令] [参数]"
echo ""
echo "命令:"
echo " (无参数) - 部署到远程服务器(默认)"
echo " [文件名] - 部署并上传指定文件(如 deploy-server.sh"
echo " build - 仅构建项目"
echo " status - 查看远程服务状态"
echo ""
echo "示例:"
echo " $0 # 部署到远程服务器"
echo " $0 deploy-server.sh # 同时上传部署脚本"
echo " $0 build # 仅构建项目"
echo " $0 status # 查看服务状态"
}
# 主逻辑
case "${1:-}" in
"")
deploy
;;
"build")
build_project
;;
"status")
show_status
;;
"help"|"-h"|"--help")
print_usage
;;
*)
# 如果参数是文件,则上传该文件
if [ -f "$1" ]; then
deploy "$1"
else
deploy "$1"
fi
;;
esac