fix: 服务部署脚本优化,不再上传整个tar.gz

- 本地解压tar.gz提取jar文件
- 只上传服务jar和fund-common*.jar
- 大幅减少上传时间和带宽消耗
This commit is contained in:
zhangjf 2026-02-23 15:35:17 +08:00
parent 2a74f237df
commit 112a970563

View File

@ -4,6 +4,7 @@
# 用法: ./deploy-service.sh <服务名> [本地tar.gz文件路径] # 用法: ./deploy-service.sh <服务名> [本地tar.gz文件路径]
# 示例: ./deploy-service.sh fund-gateway # 示例: ./deploy-service.sh fund-gateway
# ./deploy-service.sh fund-gateway /path/to/fund-gateway.tar.gz # ./deploy-service.sh fund-gateway /path/to/fund-gateway.tar.gz
# 注意: 只上传服务jar和fund-common*.jar不上传整个tar.gz
# ============================================ # ============================================
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
@ -49,7 +50,7 @@ fi
# 显示文件大小 # 显示文件大小
FILE_SIZE=$(ls -lh "$LOCAL_TAR" | awk '{print $5}') FILE_SIZE=$(ls -lh "$LOCAL_TAR" | awk '{print $5}')
log_info "文件大小: $FILE_SIZE" log_info "tar.gz文件大小: $FILE_SIZE"
# 1. 检查远程服务目录是否存在 # 1. 检查远程服务目录是否存在
log_info "检查远程服务目录..." log_info "检查远程服务目录..."
@ -60,85 +61,95 @@ if [ "$DIR_EXISTS" != "yes" ]; then
exit 1 exit 1
fi fi
# 2. 备份旧版本jar文件 # 2. 本地解压tar.gz提取jar文件
log_info "备份旧版本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' && \ remote_exec "cd '$SERVICE_DEPLOY_PATH/lib' && \
mkdir -p ../backup && \ mkdir -p ../backup && \
BACKUP_NAME='jar_backup_\$(date +%Y%m%d_%H%M%S)' && \ BACKUP_NAME='jar_backup_\$(date +%Y%m%d_%H%M%S)' && \
mkdir -p ../backup/\$BACKUP_NAME && \ mkdir -p ../backup/\$BACKUP_NAME && \
if [ -f '${SERVICE_NAME}*.jar' ]; then \ if ls ${SERVICE_NAME}*.jar 1>/dev/null 2>&1; then \
cp ${SERVICE_NAME}*.jar ../backup/\$BACKUP_NAME/ 2>/dev/null; \ cp ${SERVICE_NAME}*.jar ../backup/\$BACKUP_NAME/; \
fi && \ fi && \
if ls fund-common*.jar 1>/dev/null 2>&1; then \ if ls fund-common*.jar 1>/dev/null 2>&1; then \
cp fund-common*.jar ../backup/\$BACKUP_NAME/ 2>/dev/null; \ cp fund-common*.jar ../backup/\$BACKUP_NAME/; \
fi && \ fi && \
echo '备份完成: '\$BACKUP_NAME" echo '备份完成: '\$BACKUP_NAME"
# 3. 上传tar.gz文件 # 4. 停止服务
log_info "上传tar.gz文件..." log_info "停止服务..."
TEMP_REMOTE_PATH="/tmp/${SERVICE_NAME}-$$.tar.gz" remote_exec "if [ -f '$SERVICE_DEPLOY_PATH/bin/stop.sh' ]; then \
upload_file "$LOCAL_TAR" "$TEMP_REMOTE_PATH" cd '$SERVICE_DEPLOY_PATH/bin' && ./stop.sh; \
log_info "上传完成" sleep 2; \
echo '服务已停止'; \
else \
echo '未找到stop.sh脚本'; \
fi"
# 4. 解压并更新jar文件 # 5. 上传jar文件只上传变更的文件
log_info "解压并更新jar文件..." log_info "上传jar文件..."
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
# 停止服务使用bin目录下的脚本
if [ -f '$SERVICE_DEPLOY_PATH/bin/stop.sh' ]; then
cd '$SERVICE_DEPLOY_PATH/bin' && ./stop.sh
sleep 2
echo '服务已停止'
fi
# 只更新当前服务的jar和fund-common*.jar
echo '更新jar文件...'
# 删除旧的fund-common*.jar
rm -f '$SERVICE_DEPLOY_PATH/lib/fund-common'*.jar 2>/dev/null
# 复制新的fund-common*.jar
if ls \$EXTRACTED_DIR/lib/fund-common*.jar 1>/dev/null 2>&1; then
cp \$EXTRACTED_DIR/lib/fund-common*.jar '$SERVICE_DEPLOY_PATH/lib/'
echo 'fund-common jar 已更新'
fi
# 删除旧的服务jar
rm -f '$SERVICE_DEPLOY_PATH/lib/${SERVICE_NAME}'*.jar 2>/dev/null
# 复制新的服务jar
if ls \$EXTRACTED_DIR/lib/${SERVICE_NAME}*.jar 1>/dev/null 2>&1; then
cp \$EXTRACTED_DIR/lib/${SERVICE_NAME}*.jar '$SERVICE_DEPLOY_PATH/lib/'
echo '${SERVICE_NAME} jar 已更新'
fi
echo 'jar文件更新完成'
# 启动服务使用bin目录下的脚本
if [ -f '$SERVICE_DEPLOY_PATH/bin/start.sh' ]; then
cd '$SERVICE_DEPLOY_PATH/bin' && ./start.sh
echo '服务已启动'
fi
else
echo '错误: 解压后未找到lib目录'
exit 1
fi
# 清理临时文件
rm -rf \$TEMP_DIR
rm -f '$TEMP_REMOTE_PATH'
"
log_info "解压完成"
# 5. 验证部署 # 上传服务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 "验证部署..." log_info "验证部署..."
SERVICE_JAR_COUNT=$(remote_exec "ls '$SERVICE_DEPLOY_PATH/lib/${SERVICE_NAME}*.jar' 2>/dev/null | wc -l") 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") COMMON_JAR_COUNT=$(remote_exec "ls '$SERVICE_DEPLOY_PATH/lib/fund-common*.jar' 2>/dev/null | wc -l")