pangu-user-platform/backend/build.sh

254 lines
7.2 KiB
Bash
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
# ============================================================
# 脚本名称build.sh
# 功能说明:快速编译打包后端项目,支持多线程、增量、模块化编译
# 作 者:湖北新华业务中台研发团队
# 创建时间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 "ruoyi-admin.jar" 2>/dev/null || true
sleep 2
# 检查 jar 包是否存在
local jar_file="$PROJECT_DIR/ruoyi-admin/target/ruoyi-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/ruoyi-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/ruoyi-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 "$@"