pangu-user-platform/backend/build.sh

254 lines
7.2 KiB
Bash
Raw Normal View History

#!/bin/bash
# ============================================================
# 脚本名称build.sh
# 功能说明:快速编译打包后端项目,支持多线程、增量、模块化编译
# 作 者pangu
# 创建时间2026-02-02
# ============================================================
#
# 【优化策略】
# - 多线程编译:-T 1C 使用全部CPU核心并行编译
# - 增量编译:不执行 clean复用已编译的 class 文件
# - 模块化编译:-pl :module -am 仅编译指定模块及其依赖
# - 静默模式:-q 减少日志输出,加快速度
# - JVM优化-XX:TieredStopAtLevel=1 编译器快速模式
#
# 【使用方法】
# ./build.sh [选项]
#
# 【选项说明】
# -q, --quick 快速编译(仅 compile检查语法错误最快
# -p, --package 增量打包package不 clean默认选项
# -f, --full 全量编译clean + package
# -m, --module 指定模块编译(如: -m pangu-business
# -r, --restart 编译后重启后端服务
# -c, --clean 仅清理 target 目录
# -h, --help 显示帮助信息
#
# 【常用示例】
# ./build.sh -q # 快速编译仅检查语法约4秒
# ./build.sh -p # 增量打包约4秒
# ./build.sh -f # 全量编译约30秒
# ./build.sh -m pangu-business # 仅编译业务模块
# ./build.sh -m pangu-business -r # 编译业务模块并重启约27秒
# ./build.sh -r # 增量打包并重启
#
# 【开发建议】
# 1. 日常开发:修改代码后用 -q 快速检查语法错误
# 2. 本地测试:用 -r 编译并重启服务
# 3. 仅改某模块:用 -m 指定模块,加快编译速度
# 4. 部署前:用 -f 全量编译确保干净
#
# ============================================================
set -e
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# 项目根目录
PROJECT_DIR="$(cd "$(dirname "$0")" && pwd)"
cd "$PROJECT_DIR"
# Maven 通用参数
MAVEN_OPTS="-Xmx1024m -XX:+TieredCompilation -XX:TieredStopAtLevel=1"
# 多线程编译CPU核心数
THREADS="1C"
# 通用参数:跳过测试、静默模式
COMMON_ARGS="-DskipTests -q"
# 打印带颜色的消息
print_info() { echo -e "${BLUE}[INFO]${NC} $1"; }
print_success() { echo -e "${GREEN}[SUCCESS]${NC} $1"; }
print_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
print_error() { echo -e "${RED}[ERROR]${NC} $1"; }
# 显示帮助信息
show_help() {
echo "用法: ./build.sh [选项]"
echo ""
echo "选项:"
echo " -f, --full 全量编译clean + package"
echo " -q, --quick 快速编译(仅 compile最快"
echo " -p, --package 打包package不 clean"
echo " -m, --module 指定模块编译(如: -m pangu-business"
echo " -r, --restart 编译并重启后端服务"
echo " -c, --clean 仅清理"
echo " -h, --help 显示帮助信息"
echo ""
echo "示例:"
echo " ./build.sh -q # 快速编译检查语法"
echo " ./build.sh -p # 增量打包"
echo " ./build.sh -f # 全量编译"
echo " ./build.sh -m pangu-business -r # 编译业务模块并重启"
echo " ./build.sh -r # 全量编译并重启"
}
# 快速编译(仅 compile
quick_compile() {
local module=$1
print_info "快速编译中(仅检查语法)..."
local start_time=$(date +%s)
if [ -n "$module" ]; then
print_info "目标模块: $module"
mvn compile -T $THREADS $COMMON_ARGS -pl :$module -am
else
mvn compile -T $THREADS $COMMON_ARGS
fi
local end_time=$(date +%s)
print_success "编译完成,耗时: $((end_time - start_time))"
}
# 增量打包(不 clean
incremental_package() {
local module=$1
print_info "增量打包中..."
local start_time=$(date +%s)
if [ -n "$module" ]; then
print_info "目标模块: $module"
mvn package -T $THREADS $COMMON_ARGS -pl :$module -am
else
mvn package -T $THREADS $COMMON_ARGS
fi
local end_time=$(date +%s)
print_success "打包完成,耗时: $((end_time - start_time))"
}
# 全量编译
full_build() {
print_info "全量编译中clean + package..."
local start_time=$(date +%s)
mvn clean package -T $THREADS $COMMON_ARGS
local end_time=$(date +%s)
print_success "全量编译完成,耗时: $((end_time - start_time))"
}
# 仅清理
clean_only() {
print_info "清理中..."
mvn clean -q
print_success "清理完成"
}
# 重启后端服务
restart_backend() {
print_info "重启后端服务..."
# 停止当前运行的服务
pkill -f "pangu-admin.jar" 2>/dev/null || true
sleep 2
# 检查 jar 包是否存在
local jar_file="$PROJECT_DIR/pangu-admin/target/pangu-admin.jar"
if [ ! -f "$jar_file" ]; then
print_error "找不到 jar 包: $jar_file"
print_warn "请先运行 ./build.sh -p 或 ./build.sh -f 进行打包"
exit 1
fi
# 启动服务
nohup java -jar "$jar_file" > /tmp/pangu-admin.log 2>&1 &
print_info "后端启动中,等待服务就绪..."
# 等待服务启动
local retry=0
local max_retry=30
while [ $retry -lt $max_retry ]; do
if lsof -i :8080 >/dev/null 2>&1; then
print_success "后端服务启动成功!端口: 8080"
return 0
fi
sleep 1
retry=$((retry + 1))
done
print_error "后端服务启动超时,请检查日志: /tmp/pangu-admin.log"
exit 1
}
# 主逻辑
main() {
local action=""
local module=""
local need_restart=false
# 解析参数
while [[ $# -gt 0 ]]; do
case $1 in
-f|--full)
action="full"
shift
;;
-q|--quick)
action="quick"
shift
;;
-p|--package)
action="package"
shift
;;
-m|--module)
module="$2"
shift 2
;;
-r|--restart)
need_restart=true
shift
;;
-c|--clean)
action="clean"
shift
;;
-h|--help)
show_help
exit 0
;;
*)
print_error "未知选项: $1"
show_help
exit 1
;;
esac
done
# 默认操作:增量打包
if [ -z "$action" ] && [ "$need_restart" = true ]; then
action="package"
elif [ -z "$action" ]; then
action="package"
fi
# 执行操作
case $action in
full)
full_build
;;
quick)
quick_compile "$module"
;;
package)
incremental_package "$module"
;;
clean)
clean_only
;;
esac
# 重启服务
if [ "$need_restart" = true ]; then
restart_backend
fi
}
# 执行主函数
main "$@"