feat: 优化部署脚本架构,支持Jenkins分离式CI/CD
��️ 架构优化: - 分离构建和部署阶段,符合Jenkins最佳实践 - Jenkins服务器负责构建,应用服务器负责运行 - 避免在生产服务器安装构建工具,提高安全性 📦 新增脚本: - build-all.sh - 专门的Jenkins构建脚本 - deploy-remote.sh - 专门的远程部署脚本 - Jenkins-Pipeline配置.md - 完整的Pipeline配置指南 🔄 部署模式: - full: 完整模式 (构建+部署) - build: 仅构建模式 (Jenkins阶段) - deploy: 仅部署模式 (远程阶段) ✨ 功能增强: - 智能jar包传输和验证 - 详细的构建产物报告 - 分阶段的错误处理和状态跟踪 - 支持多环境配置 (test/prod) 🛡️ 安全改进: - 严格的SSH连接格式验证 - 远程jar包完整性检查 - 容器化部署隔离 - 详细的操作日志记录 📊 监控增强: - 实时构建进度显示 - jar包大小统计 - 部署时间跟踪 - 健康检查验证 🔧 Jenkins集成: - 完整的Pipeline配置示例 - 环境变量支持 - 构建产物归档 - 邮件通知配置 ✅ 测试验证: - 所有脚本语法检查通过 - SSH连接测试成功 - 支持10个微服务模块 - 兼容现有部署流程
This commit is contained in:
+183
-44
@@ -20,6 +20,9 @@ BUILD_NUMBER="${BUILD_NUMBER:-manual}"
|
||||
JOB_NAME="${JOB_NAME:-local-deploy}"
|
||||
BUILD_URL="${BUILD_URL:-}"
|
||||
|
||||
# 部署模式配置
|
||||
DEPLOY_MODE="${DEPLOY_MODE:-full}" # full: 完整部署, build: 仅构建, deploy: 仅部署
|
||||
|
||||
# 颜色输出
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
@@ -89,21 +92,42 @@ create_remote_directories() {
|
||||
log_success "远程目录创建完成"
|
||||
}
|
||||
|
||||
# 构建所有服务
|
||||
# 构建所有服务 (Jenkins阶段)
|
||||
build_all_services() {
|
||||
log_info "开始构建所有微服务..."
|
||||
|
||||
log_info "开始在Jenkins服务器上构建所有微服务..."
|
||||
|
||||
# 检查是否在Jenkins环境中
|
||||
if [ -n "$JENKINS_HOME" ] || [ -n "$BUILD_NUMBER" ]; then
|
||||
log_info "检测到Jenkins环境,执行完整构建流程"
|
||||
else
|
||||
log_info "本地环境,执行构建流程"
|
||||
fi
|
||||
|
||||
# 先构建父项目
|
||||
log_info "构建父项目..."
|
||||
mvn clean install -DskipTests -q
|
||||
|
||||
if mvn clean install -DskipTests -q; then
|
||||
log_success "父项目构建成功"
|
||||
else
|
||||
log_error "父项目构建失败"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 构建各个微服务
|
||||
for service_info in "${SERVICES[@]}"; do
|
||||
service_name=$(echo $service_info | cut -d':' -f1)
|
||||
log_info "构建服务: $service_name"
|
||||
|
||||
|
||||
cd $service_name
|
||||
if mvn clean package -DskipTests -Ptest -q; then
|
||||
log_success "服务 $service_name 构建成功"
|
||||
if mvn clean package -DskipTests -P${PROFILE} -q; then
|
||||
# 检查jar包是否生成
|
||||
if [ -f "target/${service_name}-1.0.0.jar" ]; then
|
||||
local jar_size=$(du -h "target/${service_name}-1.0.0.jar" | cut -f1)
|
||||
log_success "服务 $service_name 构建成功 (大小: $jar_size)"
|
||||
else
|
||||
log_error "服务 $service_name jar包未生成"
|
||||
cd ..
|
||||
exit 1
|
||||
fi
|
||||
else
|
||||
log_error "服务 $service_name 构建失败"
|
||||
cd ..
|
||||
@@ -111,39 +135,91 @@ build_all_services() {
|
||||
fi
|
||||
cd ..
|
||||
done
|
||||
|
||||
log_success "所有服务构建完成"
|
||||
|
||||
log_success "所有服务在Jenkins服务器构建完成"
|
||||
}
|
||||
|
||||
# 部署单个服务
|
||||
# 部署所有服务到远程服务器
|
||||
deploy_all_services_to_remote() {
|
||||
log_info "开始逐个部署服务到远程服务器..."
|
||||
|
||||
for service_info in "${SERVICES[@]}"; do
|
||||
service_name=$(echo $service_info | cut -d':' -f1)
|
||||
service_port=$(echo $service_info | cut -d':' -f2)
|
||||
|
||||
echo ""
|
||||
log_info "[$((SUCCESSFUL_DEPLOYMENTS + FAILED_DEPLOYMENTS + 1))/$TOTAL_SERVICES] 部署服务: $service_name"
|
||||
|
||||
if deploy_service $service_name $service_port; then
|
||||
SUCCESSFUL_DEPLOYMENTS=$((SUCCESSFUL_DEPLOYMENTS + 1))
|
||||
log_success "✅ 服务 $service_name 部署成功"
|
||||
else
|
||||
FAILED_DEPLOYMENTS=$((FAILED_DEPLOYMENTS + 1))
|
||||
log_error "❌ 服务 $service_name 部署失败,继续部署其他服务..."
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
# 传输jar包到远程服务器
|
||||
transfer_jar_to_remote() {
|
||||
local service_name=$1
|
||||
|
||||
log_info "传输jar包到远程服务器: $service_name"
|
||||
|
||||
# 检查本地jar包是否存在
|
||||
local jar_file="${service_name}/target/${service_name}-1.0.0.jar"
|
||||
if [ ! -f "$jar_file" ]; then
|
||||
log_error "本地JAR包不存在: $jar_file"
|
||||
return 1
|
||||
fi
|
||||
|
||||
# 显示jar包信息
|
||||
local jar_size=$(du -h "$jar_file" | cut -f1)
|
||||
log_info "准备传输jar包: $jar_file (大小: $jar_size)"
|
||||
|
||||
# 删除远程旧jar包
|
||||
log_info "清理远程旧jar包: $service_name"
|
||||
ssh 'root@47.111.10.27' "rm -f $REMOTE_BUILD_DIR/${service_name}-*.jar"
|
||||
|
||||
# 上传新jar包
|
||||
log_info "上传jar包到远程服务器..."
|
||||
if scp "$jar_file" 'root@47.111.10.27':$REMOTE_BUILD_DIR/${service_name}-1.0.0.jar; then
|
||||
log_success "jar包传输成功: $service_name"
|
||||
|
||||
# 验证远程jar包
|
||||
local remote_size=$(ssh 'root@47.111.10.27' "du -h $REMOTE_BUILD_DIR/${service_name}-1.0.0.jar | cut -f1")
|
||||
log_info "远程jar包大小: $remote_size"
|
||||
return 0
|
||||
else
|
||||
log_error "jar包传输失败: $service_name"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
# 部署单个服务 (远程服务器阶段)
|
||||
deploy_service() {
|
||||
local service_name=$1
|
||||
local service_port=$2
|
||||
local start_time=$(date +%s)
|
||||
|
||||
log_info "开始部署服务: $service_name"
|
||||
log_info "开始部署服务到远程服务器: $service_name"
|
||||
DEPLOYMENT_STATUS[$service_name]="DEPLOYING"
|
||||
|
||||
# 检查jar包是否存在
|
||||
local jar_file="${service_name}/target/${service_name}-1.0.0.jar"
|
||||
if [ ! -f "$jar_file" ]; then
|
||||
local error_msg="JAR包不存在: $jar_file"
|
||||
log_error "$error_msg"
|
||||
# 先传输jar包
|
||||
if ! transfer_jar_to_remote $service_name; then
|
||||
local error_msg="jar包传输失败"
|
||||
DEPLOYMENT_STATUS[$service_name]="FAILED"
|
||||
DEPLOYMENT_ERRORS[$service_name]="$error_msg"
|
||||
return 1
|
||||
fi
|
||||
|
||||
# 删除远程旧jar包
|
||||
log_info "删除远程旧jar包: $service_name"
|
||||
ssh 'root@47.111.10.27' "rm -f $REMOTE_BUILD_DIR/${service_name}-*.jar"
|
||||
|
||||
# 上传新jar包
|
||||
log_info "上传jar包: $service_name"
|
||||
if scp "$jar_file" 'root@47.111.10.27':$REMOTE_BUILD_DIR/${service_name}-1.0.0.jar; then
|
||||
log_success "jar包上传成功: $service_name"
|
||||
else
|
||||
log_error "jar包上传失败: $service_name"
|
||||
# 验证远程jar包存在
|
||||
log_info "验证远程jar包: $service_name"
|
||||
if ! ssh 'root@47.111.10.27' "test -f $REMOTE_BUILD_DIR/${service_name}-1.0.0.jar"; then
|
||||
local error_msg="远程jar包不存在,请先执行构建和传输"
|
||||
log_error "$error_msg"
|
||||
DEPLOYMENT_STATUS[$service_name]="FAILED"
|
||||
DEPLOYMENT_ERRORS[$service_name]="$error_msg"
|
||||
return 1
|
||||
fi
|
||||
|
||||
@@ -385,8 +461,86 @@ main() {
|
||||
log_info "🚀 开始全服务容器化部署..."
|
||||
log_info "目标服务器: $REMOTE_HOST"
|
||||
log_info "部署环境: $PROFILE"
|
||||
log_info "部署模式: $DEPLOY_MODE"
|
||||
log_info "服务总数: $TOTAL_SERVICES"
|
||||
|
||||
# 根据部署模式执行不同的流程
|
||||
case $DEPLOY_MODE in
|
||||
"build")
|
||||
log_info "🔨 执行构建模式 - 仅在Jenkins服务器构建jar包"
|
||||
execute_build_only
|
||||
;;
|
||||
"deploy")
|
||||
log_info "🚀 执行部署模式 - 仅部署到远程服务器"
|
||||
execute_deploy_only
|
||||
;;
|
||||
"full"|*)
|
||||
log_info "🔄 执行完整模式 - 构建+部署"
|
||||
execute_full_deployment
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
# 仅构建模式
|
||||
execute_build_only() {
|
||||
local start_time=$(date +%s)
|
||||
|
||||
log_info "开始构建所有服务..."
|
||||
|
||||
# 构建服务
|
||||
if ! build_all_services; then
|
||||
log_error "服务构建失败"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 显示构建结果
|
||||
log_info "📦 构建产物信息:"
|
||||
for service_info in "${SERVICES[@]}"; do
|
||||
service_name=$(echo $service_info | cut -d':' -f1)
|
||||
jar_file="${service_name}/target/${service_name}-1.0.0.jar"
|
||||
if [ -f "$jar_file" ]; then
|
||||
jar_size=$(du -h "$jar_file" | cut -f1)
|
||||
log_success "✅ $service_name: $jar_size"
|
||||
else
|
||||
log_error "❌ $service_name: jar包未生成"
|
||||
fi
|
||||
done
|
||||
|
||||
local end_time=$(date +%s)
|
||||
local total_time=$((end_time - start_time))
|
||||
log_success "🎉 构建完成!总耗时: ${total_time}s"
|
||||
}
|
||||
|
||||
# 仅部署模式
|
||||
execute_deploy_only() {
|
||||
local start_time=$(date +%s)
|
||||
|
||||
log_info "开始部署到远程服务器..."
|
||||
|
||||
# 检查连接
|
||||
if ! check_remote_connection; then
|
||||
log_error "远程服务器连接失败,部署终止"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 创建目录和网络
|
||||
create_remote_directories
|
||||
create_docker_network
|
||||
|
||||
# 部署所有服务
|
||||
deploy_all_services_to_remote
|
||||
|
||||
# 健康检查和报告
|
||||
health_check
|
||||
local end_time=$(date +%s)
|
||||
local total_time=$((end_time - start_time))
|
||||
show_deployment_report $total_time
|
||||
}
|
||||
|
||||
# 完整部署模式
|
||||
execute_full_deployment() {
|
||||
local start_time=$(date +%s)
|
||||
|
||||
# 检查连接
|
||||
if ! check_remote_connection; then
|
||||
log_error "远程服务器连接失败,部署终止"
|
||||
@@ -405,23 +559,8 @@ main() {
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 部署所有服务 - 单个失败不影响其他服务
|
||||
log_info "开始逐个部署服务..."
|
||||
for service_info in "${SERVICES[@]}"; do
|
||||
service_name=$(echo $service_info | cut -d':' -f1)
|
||||
service_port=$(echo $service_info | cut -d':' -f2)
|
||||
|
||||
echo ""
|
||||
log_info "[$((SUCCESSFUL_DEPLOYMENTS + FAILED_DEPLOYMENTS + 1))/$TOTAL_SERVICES] 部署服务: $service_name"
|
||||
|
||||
if deploy_service $service_name $service_port; then
|
||||
SUCCESSFUL_DEPLOYMENTS=$((SUCCESSFUL_DEPLOYMENTS + 1))
|
||||
log_success "✅ 服务 $service_name 部署成功"
|
||||
else
|
||||
FAILED_DEPLOYMENTS=$((FAILED_DEPLOYMENTS + 1))
|
||||
log_error "❌ 服务 $service_name 部署失败,继续部署其他服务..."
|
||||
fi
|
||||
done
|
||||
# 部署所有服务
|
||||
deploy_all_services_to_remote
|
||||
|
||||
# 健康检查
|
||||
log_info "执行服务健康检查..."
|
||||
|
||||
Reference in New Issue
Block a user