#!/bin/bash # ============================================ # 服务部署脚本 # 用法: ./deploy-service.sh <服务名> [本地tar.gz文件路径] # 示例: ./deploy-service.sh fund-gateway # ./deploy-service.sh fund-gateway /path/to/fund-gateway.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="$SCRIPT_DIR/$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 "文件大小: $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. 备份旧版本lib目录 log_info "备份旧版本lib目录..." remote_exec "cd '$SERVICE_DEPLOY_PATH' && \ mkdir -p backup && \ BACKUP_NAME='lib_backup_\$(date +%Y%m%d_%H%M%S)' && \ if [ -d 'lib' ]; then \ cp -r lib backup/\$BACKUP_NAME; \ echo '备份完成: '\$BACKUP_NAME; \ else \ echo 'lib目录不存在,跳过备份'; \ fi" # 3. 上传tar.gz文件 log_info "上传tar.gz文件..." TEMP_REMOTE_PATH="/tmp/${SERVICE_NAME}-$$.tar.gz" upload_file "$LOCAL_TAR" "$TEMP_REMOTE_PATH" log_info "上传完成" # 4. 解压并更新lib目录 log_info "解压并更新lib目录..." remote_exec " TEMP_DIR=\"/tmp/${SERVICE_NAME}_extract_\$\$\" mkdir -p \$TEMP_DIR cd \$TEMP_DIR tar -xzf '$TEMP_REMOTE_PATH' # 查找解压后的目录(通常是服务名目录) EXTRACTED_DIR=\$(ls -d */ 2>/dev/null | head -1 | tr -d '/') if [ -n \"\$EXTRACTED_DIR\" ] && [ -d \"\$EXTRACTED_DIR/lib\" ]; then # 停止服务(如果存在启动脚本) if [ -f '$SERVICE_DEPLOY_PATH/stop.sh' ]; then cd '$SERVICE_DEPLOY_PATH' && ./stop.sh sleep 2 fi # 删除旧lib目录 rm -rf '$SERVICE_DEPLOY_PATH/lib' # 复制新lib目录 cp -r \"\$EXTRACTED_DIR/lib\" '$SERVICE_DEPLOY_PATH/' echo 'lib目录更新完成' # 启动服务(如果存在启动脚本) if [ -f '$SERVICE_DEPLOY_PATH/start.sh' ]; then cd '$SERVICE_DEPLOY_PATH' && ./start.sh echo '服务已重启' fi else echo '错误: 解压后未找到lib目录' exit 1 fi # 清理临时文件 rm -rf \$TEMP_DIR rm -f '$TEMP_REMOTE_PATH' " log_info "解压完成" # 5. 验证部署 log_info "验证部署..." JAR_COUNT=$(remote_exec "ls '$SERVICE_DEPLOY_PATH/lib/*.jar' 2>/dev/null | wc -l") log_info "lib目录jar文件数: $JAR_COUNT" log_info "============================================" log_info "服务部署完成: $SERVICE_NAME" log_info "============================================"