#!/bin/bash # 情感博物馆 - Jenkins构建脚本 # 作者: emotion-museum # 日期: 2025-07-18 # 用途: 在Jenkins服务器上构建所有微服务jar包 set -e # 配置变量 PROFILE="${DEPLOY_ENV:-test}" PROJECT_NAME="${PROJECT_NAME:-emotion-museum}" # Jenkins构建信息 BUILD_NUMBER="${BUILD_NUMBER:-manual}" JOB_NAME="${JOB_NAME:-local-build}" BUILD_URL="${BUILD_URL:-}" # 颜色输出 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # 日志函数 log_info() { echo -e "${BLUE}[INFO]${NC} $(date '+%Y-%m-%d %H:%M:%S') - $1" } log_success() { echo -e "${GREEN}[SUCCESS]${NC} $(date '+%Y-%m-%d %H:%M:%S') - $1" } log_warning() { echo -e "${YELLOW}[WARNING]${NC} $(date '+%Y-%m-%d %H:%M:%S') - $1" } log_error() { echo -e "${RED}[ERROR]${NC} $(date '+%Y-%m-%d %H:%M:%S') - $1" } # 服务列表 SERVICES=( "emotion-gateway:19000" "emotion-user:19001" "emotion-ai:19002" "emotion-record:19003" "emotion-growth:19004" "emotion-explore:19005" "emotion-reward:19006" "emotion-websocket:19007" "emotion-auth:19008" "emotion-stats:19009" ) # 检查构建环境 check_build_environment() { log_info "检查构建环境..." # 检查Java版本 if command -v java &> /dev/null; then local java_version=$(java -version 2>&1 | head -1 | cut -d'"' -f2) log_info "Java版本: $java_version" else log_error "Java未安装" exit 1 fi # 检查Maven版本 if command -v mvn &> /dev/null; then local maven_version=$(mvn -version | head -1 | awk '{print $3}') log_info "Maven版本: $maven_version" else log_error "Maven未安装" exit 1 fi # 检查是否在Jenkins环境中 if [ -n "$JENKINS_HOME" ] || [ -n "$BUILD_NUMBER" ]; then log_info "检测到Jenkins环境" log_info "构建编号: $BUILD_NUMBER" log_info "任务名称: $JOB_NAME" else log_info "本地构建环境" fi log_success "构建环境检查通过" } # 清理旧的构建产物 clean_old_artifacts() { log_info "清理旧的构建产物..." # 清理父项目 mvn clean -q # 清理各个子模块 for service_info in "${SERVICES[@]}"; do service_name=$(echo $service_info | cut -d':' -f1) if [ -d "$service_name" ]; then log_info "清理模块: $service_name" cd $service_name mvn clean -q cd .. fi done log_success "构建产物清理完成" } # 构建所有服务 build_all_services() { log_info "开始构建所有微服务..." # 先构建父项目 log_info "构建父项目..." if mvn install -DskipTests -q; then log_success "父项目构建成功" else log_error "父项目构建失败" exit 1 fi # 构建各个微服务 local build_success=0 local build_failed=0 for service_info in "${SERVICES[@]}"; do service_name=$(echo $service_info | cut -d':' -f1) log_info "构建服务: $service_name" if [ ! -d "$service_name" ]; then log_warning "服务目录不存在: $service_name" continue fi cd $service_name if mvn 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)" build_success=$((build_success + 1)) else log_error "❌ $service_name jar包未生成" build_failed=$((build_failed + 1)) fi else log_error "❌ $service_name 构建失败" build_failed=$((build_failed + 1)) fi cd .. done log_info "构建统计: 成功 $build_success, 失败 $build_failed" if [ $build_failed -eq 0 ]; then log_success "所有服务构建成功" return 0 else log_error "部分服务构建失败" return 1 fi } # 生成构建报告 generate_build_report() { local total_time=$1 echo "" echo "========================================" echo " 构建完成报告" echo "========================================" echo "项目名称: $PROJECT_NAME" echo "构建环境: $PROFILE" echo "构建时间: $(date '+%Y-%m-%d %H:%M:%S')" echo "总耗时: ${total_time}s" if [ "$BUILD_NUMBER" != "manual" ]; then echo "Jenkins构建: #$BUILD_NUMBER" echo "Jenkins任务: $JOB_NAME" [ -n "$BUILD_URL" ] && echo "构建链接: $BUILD_URL" fi echo "========================================" echo "" echo "📦 构建产物详情:" printf "%-20s %-10s %-10s %s\n" "服务名称" "状态" "大小" "路径" echo "----------------------------------------" local total_size=0 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) # 兼容macOS和Linux的文件大小获取 if [[ "$OSTYPE" == "darwin"* ]]; then jar_bytes=$(stat -f%z "$jar_file" 2>/dev/null || echo "0") else jar_bytes=$(stat -c%s "$jar_file" 2>/dev/null || echo "0") fi total_size=$((total_size + jar_bytes)) printf "%-20s ${GREEN}%-10s${NC} %-10s %s\n" "$service_name" "✅ 成功" "$jar_size" "$jar_file" else printf "%-20s ${RED}%-10s${NC} %-10s %s\n" "$service_name" "❌ 失败" "N/A" "未生成" fi done echo "" echo "📊 构建统计:" echo " 总产物大小: $(echo $total_size | awk '{printf "%.1fMB", $1/1024/1024}')" echo " 构建工作空间: $(pwd)" echo "" echo "========================================" echo "🎉 构建任务完成!" } # 主函数 main() { local start_time=$(date +%s) log_info "🔨 开始Jenkins构建任务..." log_info "构建环境: $PROFILE" log_info "项目名称: $PROJECT_NAME" # 检查构建环境 check_build_environment # 清理旧产物 clean_old_artifacts # 构建所有服务 if build_all_services; then log_success "所有服务构建成功" build_result=0 else log_error "部分服务构建失败" build_result=1 fi # 计算总耗时 local end_time=$(date +%s) local total_time=$((end_time - start_time)) # 生成构建报告 generate_build_report $total_time # 返回构建结果 if [ $build_result -eq 0 ]; then log_success "🎉 Jenkins构建任务完成!" exit 0 else log_error "⚠️ 构建任务部分失败,请检查错误日志" exit 1 fi } # 执行主函数 main "$@"