fundplatform/scripts/deploy/deploy-service.sh
zhangjf 112a970563 fix: 服务部署脚本优化,不再上传整个tar.gz
- 本地解压tar.gz提取jar文件
- 只上传服务jar和fund-common*.jar
- 大幅减少上传时间和带宽消耗
2026-02-23 15:35:17 +08:00

161 lines
5.0 KiB
Bash
Executable File
Raw Permalink 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
# ============================================
# 服务部署脚本
# 用法: ./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 "============================================"