#!/bin/bash # ============================================ # 服务部署脚本 # 用法: ./deploy-service.sh <服务名> [本地tar.gz文件路径] # 示例: ./deploy-service.sh fund-gateway # ./deploy-service.sh fund-gateway /path/to/fund-gateway.tar.gz # 注意: 只上传服务jar和fund-common*.jar,不上传整个tar.gz # ============================================ SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" source "$SCRIPT_DIR/deploy-config.sh" # 检查参数 if [ -z "$1" ]; then log_error "请指定服务名称" echo "可用服务:" for svc in "${SERVICES[@]}"; do echo " - $svc" done exit 1 fi SERVICE_NAME="$1" # 获取本地tar.gz文件路径 if [ -n "$2" ]; then LOCAL_TAR="$2" else # 默认使用deploy目录下的服务tar.gz文件 LOCAL_TAR="$LOCAL_DEPLOY_DIR/${SERVICE_NAME}.tar.gz" fi SERVICE_DEPLOY_PATH="$SERVICE_DEPLOY_BASE/$SERVICE_NAME" log_info "============================================" log_info "服务部署开始: $SERVICE_NAME" log_info "============================================" log_info "本地文件: $LOCAL_TAR" log_info "远程路径: $SERVICE_DEPLOY_PATH" log_info "" # 检查sshpass check_sshpass # 检查本地文件是否存在 if [ ! -f "$LOCAL_TAR" ]; then log_error "本地tar.gz文件不存在: $LOCAL_TAR" exit 1 fi # 显示文件大小 FILE_SIZE=$(ls -lh "$LOCAL_TAR" | awk '{print $5}') log_info "tar.gz文件大小: $FILE_SIZE" # 1. 检查远程服务目录是否存在 log_info "检查远程服务目录..." DIR_EXISTS=$(remote_exec "if [ -d '$SERVICE_DEPLOY_PATH' ]; then echo 'yes'; else echo 'no'; fi") if [ "$DIR_EXISTS" != "yes" ]; then log_error "远程服务目录不存在: $SERVICE_DEPLOY_PATH" log_error "请先完整部署服务" exit 1 fi # 2. 本地解压tar.gz,提取jar文件 log_info "本地解压并提取jar文件..." TEMP_LOCAL_DIR="/tmp/${SERVICE_NAME}_extract_$$" mkdir -p "$TEMP_LOCAL_DIR" cd "$TEMP_LOCAL_DIR" tar -xzf "$LOCAL_TAR" # 查找解压后的目录 EXTRACTED_DIR=$(ls -d */ 2>/dev/null | head -1 | tr -d '/') if [ -z "$EXTRACTED_DIR" ] || [ ! -d "$EXTRACTED_DIR/lib" ]; then log_error "解压后未找到lib目录" rm -rf "$TEMP_LOCAL_DIR" exit 1 fi # 查找服务jar SERVICE_JAR=$(ls $EXTRACTED_DIR/lib/${SERVICE_NAME}*.jar 2>/dev/null | head -1) COMMON_JAR=$(ls $EXTRACTED_DIR/lib/fund-common*.jar 2>/dev/null | head -1) if [ -z "$SERVICE_JAR" ]; then log_error "未找到服务jar: ${SERVICE_NAME}*.jar" rm -rf "$TEMP_LOCAL_DIR" exit 1 fi log_info "服务jar: $(basename $SERVICE_JAR)" if [ -n "$COMMON_JAR" ]; then log_info "fund-common jar: $(basename $COMMON_JAR)" fi # 3. 备份远程旧版本jar文件 log_info "备份远程旧版本jar文件..." remote_exec "cd '$SERVICE_DEPLOY_PATH/lib' && \ mkdir -p ../backup && \ BACKUP_NAME='jar_backup_\$(date +%Y%m%d_%H%M%S)' && \ mkdir -p ../backup/\$BACKUP_NAME && \ if ls ${SERVICE_NAME}*.jar 1>/dev/null 2>&1; then \ cp ${SERVICE_NAME}*.jar ../backup/\$BACKUP_NAME/; \ fi && \ if ls fund-common*.jar 1>/dev/null 2>&1; then \ cp fund-common*.jar ../backup/\$BACKUP_NAME/; \ fi && \ echo '备份完成: '\$BACKUP_NAME" # 4. 停止服务 log_info "停止服务..." remote_exec "if [ -f '$SERVICE_DEPLOY_PATH/bin/stop.sh' ]; then \ cd '$SERVICE_DEPLOY_PATH/bin' && ./stop.sh; \ sleep 2; \ echo '服务已停止'; \ else \ echo '未找到stop.sh脚本'; \ fi" # 5. 上传jar文件(只上传变更的文件) log_info "上传jar文件..." # 上传服务jar SERVICE_JAR_NAME=$(basename "$SERVICE_JAR") log_info "上传 $SERVICE_JAR_NAME ($(ls -lh "$SERVICE_JAR" | awk '{print $5}'))..." upload_file "$SERVICE_JAR" "$SERVICE_DEPLOY_PATH/lib/$SERVICE_JAR_NAME" log_info "服务jar上传完成" # 上传fund-common jar(如果存在) if [ -n "$COMMON_JAR" ]; then COMMON_JAR_NAME=$(basename "$COMMON_JAR") log_info "上传 $COMMON_JAR_NAME ($(ls -lh "$COMMON_JAR" | awk '{print $5}'))..." # 先删除远程旧的fund-common*.jar remote_exec "rm -f '$SERVICE_DEPLOY_PATH/lib/fund-common'*.jar 2>/dev/null" upload_file "$COMMON_JAR" "$SERVICE_DEPLOY_PATH/lib/$COMMON_JAR_NAME" log_info "fund-common jar上传完成" fi # 清理本地临时目录 rm -rf "$TEMP_LOCAL_DIR" # 6. 启动服务 log_info "启动服务..." remote_exec "if [ -f '$SERVICE_DEPLOY_PATH/bin/start.sh' ]; then \ cd '$SERVICE_DEPLOY_PATH/bin' && ./start.sh; \ echo '服务已启动'; \ else \ echo '未找到start.sh脚本,请手动启动'; \ fi" # 7. 验证部署 log_info "验证部署..." SERVICE_JAR_COUNT=$(remote_exec "ls '$SERVICE_DEPLOY_PATH/lib/${SERVICE_NAME}*.jar' 2>/dev/null | wc -l") COMMON_JAR_COUNT=$(remote_exec "ls '$SERVICE_DEPLOY_PATH/lib/fund-common*.jar' 2>/dev/null | wc -l") log_info "服务jar数: $SERVICE_JAR_COUNT, fund-common jar数: $COMMON_JAR_COUNT" log_info "============================================" log_info "服务部署完成: $SERVICE_NAME" log_info "============================================"