2026-02-02 19:14:07 +08:00
|
|
|
|
#!/bin/bash
|
|
|
|
|
|
# ============================================================
|
|
|
|
|
|
# 脚本名称:build.sh
|
|
|
|
|
|
# 功能说明:快速编译打包后端项目,支持多线程、增量、模块化编译
|
|
|
|
|
|
# 作 者:湖北新华业务中台研发团队
|
|
|
|
|
|
# 创建时间:2026-02-02
|
2026-02-02 19:14:49 +08:00
|
|
|
|
# ============================================================
|
|
|
|
|
|
#
|
|
|
|
|
|
# 【优化策略】
|
|
|
|
|
|
# - 多线程编译:-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 全量编译确保干净
|
|
|
|
|
|
#
|
2026-02-02 19:14:07 +08:00
|
|
|
|
# ============================================================
|
|
|
|
|
|
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 "重启后端服务..."
|
|
|
|
|
|
|
|
|
|
|
|
# 停止当前运行的服务
|
2026-02-03 20:47:45 +08:00
|
|
|
|
pkill -f "pangu-admin.jar" 2>/dev/null || true
|
2026-02-02 19:14:07 +08:00
|
|
|
|
sleep 2
|
|
|
|
|
|
|
|
|
|
|
|
# 检查 jar 包是否存在
|
2026-02-03 20:47:45 +08:00
|
|
|
|
local jar_file="$PROJECT_DIR/pangu-admin/target/pangu-admin.jar"
|
2026-02-02 19:14:07 +08:00
|
|
|
|
if [ ! -f "$jar_file" ]; then
|
|
|
|
|
|
print_error "找不到 jar 包: $jar_file"
|
|
|
|
|
|
print_warn "请先运行 ./build.sh -p 或 ./build.sh -f 进行打包"
|
|
|
|
|
|
exit 1
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
# 启动服务
|
2026-02-03 20:47:45 +08:00
|
|
|
|
nohup java -jar "$jar_file" > /tmp/pangu-admin.log 2>&1 &
|
2026-02-02 19:14:07 +08:00
|
|
|
|
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
|
|
|
|
|
|
|
2026-02-03 20:47:45 +08:00
|
|
|
|
print_error "后端服务启动超时,请检查日志: /tmp/pangu-admin.log"
|
2026-02-02 19:14:07 +08:00
|
|
|
|
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 "$@"
|