150 lines
4.8 KiB
Bash
Executable File
150 lines
4.8 KiB
Bash
Executable File
#!/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. 备份旧版本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 [ -f '${SERVICE_NAME}*.jar' ]; then \
|
||
cp ${SERVICE_NAME}*.jar ../backup/\$BACKUP_NAME/ 2>/dev/null; \
|
||
fi && \
|
||
if ls fund-common*.jar 1>/dev/null 2>&1; then \
|
||
cp fund-common*.jar ../backup/\$BACKUP_NAME/ 2>/dev/null; \
|
||
fi && \
|
||
echo '备份完成: '\$BACKUP_NAME"
|
||
|
||
# 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. 解压并更新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. 验证部署
|
||
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 "============================================"
|