blob: ec564845087e7f393efad3f9cca09a3091ff85ff [file] [log] [blame]
#!/bin/bash
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# Linkis 混合编译脚本 (Linux/macOS)
#
# 解决方案:分阶段编译
# Stage 1: 并行编译基础模块 (跳过 hbase 和 linkis-dist)
# Stage 2: 串行编译 hbase 模块 (依赖基础模块)
# Stage 3: 并行编译剩余模块和 linkis-dist
#
# 预期效果:性能提升 40-50%,产物与串行编译完全一致
#
# 用法:./quick-build.sh [选项]
# -t, --threads <N> 并行线程数,默认为 1C (CPU 核心数)
# -s, --skip-tests 跳过测试 (默认)
# -r, --run-tests 运行测试
# --v2 编译默认版本 (Hadoop 2.7.2 + Spark 2.4.3 + Scala 2.11 + Hive 2.3.3), 同默认
# --v3 编译 Apache 发布版本 (Hadoop 3.3.4 + Spark 3.2.1 + Scala 2.12 + Hive 3.1.3), 同 -Papache
# --hadoop <VER> 指定 Hadoop 完整版本号 (如 3.3.4, 2.7.2)
# --spark <VER> 指定 Spark 完整版本号 (如 3.4.4, 3.2.1, 2.4.3)
# --hive <VER> 指定 Hive 完整版本号 (如 3.1.3, 2.3.3)
# --scala <VER> 指定 Scala 完整版本号 (如 2.12.17, 2.11.12)
# --revision <VER> 指定 revision 版本号 (默认:1.8.0)
# -h, --help 显示帮助
#
# 版本说明:
# 默认版本:Hadoop 2.7.2 + Spark 2.4.3 + Scala 2.11.12 + Hive 2.3.3
# -Pspark-3: Spark 3.4.4 + Scala 2.12.17 (Hadoop/Hive 保持默认)
# -Papache / --v3: Hadoop 3.3.4 + Spark 3.2.1 + Scala 2.12.17 + Hive 3.1.3
#
# 示例:
# ./quick-build.sh 使用默认版本编译 (Hadoop 2.7.2 + Spark 2.4.3 + Scala 2.11 + Hive 2.3.3)
# ./quick-build.sh --v2 同默认版本 (仅用于明确指定 v2)
# ./quick-build.sh --v3 编译 Apache 发布版本 (同 -Papache)
# ./quick-build.sh -Pspark-3 只升级 Spark 到 3.4.4 + Scala 2.12.17
# ./quick-build.sh --revision 1.8.0-spark2 指定 revision 编译 (用于区分不同版本)
# ./quick-build.sh --spark 3.4.4 指定 Spark 3.4.4 编译
# ./quick-build.sh --hadoop 3.3.4 --spark 3.4.4 --hive 3.1.3 指定完整版本组合
# ./quick-build.sh --spark 3.4.4 --scala 2.12.17 --hadoop 3.3.1 自定义版本组合
# ./quick-build.sh -t 4 使用 4 线程编译
# ./quick-build.sh -r 运行测试
#
# 注意:--hadoop/--spark/--hive/--scala 参数优先级高于 --v2/--v3,可覆盖 Profile 中的版本
#
set -e
# 默认参数
THREADS="1C"
SKIP_TESTS=true
V2_MODE=false
V3_MODE=false
CUSTOM_VERSION_MODE=false
HADOOP_VERSION=""
SPARK_VERSION=""
HIVE_VERSION=""
SCALA_VERSION=""
REVISION=""
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'
# 获取脚本所在目录
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_DIR="$SCRIPT_DIR"
# 帮助信息
show_help() {
echo "用法:$0 [选项]"
echo ""
echo "选项:"
echo " -t, --threads <N> 并行线程数,默认为 1C (CPU 核心数)"
echo " -s, --skip-tests 跳过测试 (默认)"
echo " -r, --run-tests 运行测试"
echo " --v2 编译默认版本 (Hadoop 2.7.2 + Spark 2.4.3 + Scala 2.11 + Hive 2.3.3), 同默认"
echo " --v3 编译 Apache 发布版本 (Hadoop 3.3.4 + Spark 3.2.1 + Scala 2.12 + Hive 3.1.3), 同 -Papache"
echo " --hadoop <VER> 指定 Hadoop 完整版本号 (如 3.3.4, 2.7.2)"
echo " --spark <VER> 指定 Spark 完整版本号 (如 3.4.4, 3.2.1, 2.4.3)"
echo " --hive <VER> 指定 Hive 完整版本号 (如 3.1.3, 2.3.3)"
echo " --scala <VER> 指定 Scala 完整版本号 (如 2.12.17, 2.11.12)"
echo " --revision <VER> 指定 revision 版本号 (默认:1.8.0)"
echo " -h, --help 显示帮助"
echo ""
echo "版本参数说明:"
echo " --hadoop/--spark/--hive/--scala 可单独使用,也可与 --v2/--v3 组合使用"
echo " 当与 --v2/--v3 同时使用时,指定的版本会覆盖对应预设版本的默认值"
echo ""
echo "编译方式说明:"
echo " 默认/-Pspark-2: Hadoop 2.7.2 + Spark 2.4.3 + Scala 2.11.12 + Hive 2.3.3"
echo " -Pspark-3: Spark 3.4.4 + Scala 2.12.17 (Hadoop/Hive 保持默认)"
echo " -Papache / --v3: Hadoop 3.3.4 + Spark 3.2.1 + Scala 2.12.17 + Hive 3.1.3"
echo ""
echo "示例:"
echo " ./quick-build.sh 默认版本 (Hadoop 2.7.2 + Spark 2.4.3)"
echo " ./quick-build.sh --v2 同默认版本"
echo " ./quick-build.sh --v3 Apache 发布版本 (同 -Papache)"
echo " ./quick-build.sh --spark 3.4.4 只升级 Spark 到 3.4.4"
echo " ./quick-build.sh --v3 --spark 3.4.4 --hadoop 3.3.1 Apache 基础上修改 Spark 和 Hadoop"
echo " ./quick-build.sh --hadoop 3.3.4 --spark 3.2.1 --hive 3.1.3 指定完整版本组合"
echo " ./quick-build.sh --revision 1.8.0-spark2 指定 revision 编译"
echo " ./quick-build.sh -t 4 使用 4 线程编译"
echo " ./quick-build.sh -r 运行测试编译"
echo ""
echo "双版本编译 (分别执行两次,避免 Maven 仓库覆盖):"
echo " ./quick-build.sh # 编译默认版本 (Spark 2.4.3)"
echo " ./quick-build.sh --v3 --revision 1.8.0-apache # 编译 Apache 版本 (Spark 3.2.1)"
}
# 解析参数
while [[ $# -gt 0 ]]; do
case $1 in
-t|--threads)
THREADS="$2"
shift 2
;;
-s|--skip-tests)
SKIP_TESTS=true
shift
;;
-r|--run-tests)
SKIP_TESTS=false
shift
;;
--v2)
V2_MODE=true
shift
;;
--v3)
V3_MODE=true
shift
;;
--hadoop)
CUSTOM_VERSION_MODE=true
HADOOP_VERSION="$2"
shift 2
;;
--spark)
CUSTOM_VERSION_MODE=true
SPARK_VERSION="$2"
shift 2
;;
--hive)
CUSTOM_VERSION_MODE=true
HIVE_VERSION="$2"
shift 2
;;
--scala)
CUSTOM_VERSION_MODE=true
SCALA_VERSION="$2"
shift 2
;;
--revision)
REVISION="$2"
shift 2
;;
-h|--help)
show_help
exit 0
;;
*)
echo "未知选项:$1"
show_help
exit 1
;;
esac
done
# 构建 Maven 参数
SKIP_TESTS_ARG=""
if [ "$SKIP_TESTS" = true ]; then
SKIP_TESTS_ARG="-DskipTests"
fi
# Profile 参数
PROFILE_ARG=""
if [ "$V3_MODE" = true ]; then
# --v3 模式:使用 -Papache profile (Hadoop 3.3.4 + Spark 3.2.1 + Scala 2.12 + Hive 3.1.3)
PROFILE_ARG="-Papache"
else
# 默认模式 (包括 --v2): 使用默认配置 (Hadoop 2.7.2 + Spark 2.4.3 + Scala 2.11 + Hive 2.3.3)
# 不需要额外指定 profile
PROFILE_ARG=""
fi
# 自定义版本参数(优先级高于 --v2/--v3)
CUSTOM_VERSION_ARGS=""
if [ -n "$HADOOP_VERSION" ]; then
CUSTOM_VERSION_ARGS="$CUSTOM_VERSION_ARGS -Dhadoop.version=$HADOOP_VERSION"
fi
if [ -n "$SPARK_VERSION" ]; then
CUSTOM_VERSION_ARGS="$CUSTOM_VERSION_ARGS -Dspark.version=$SPARK_VERSION"
fi
if [ -n "$HIVE_VERSION" ]; then
CUSTOM_VERSION_ARGS="$CUSTOM_VERSION_ARGS -Dhive.version=$HIVE_VERSION"
fi
if [ -n "$SCALA_VERSION" ]; then
CUSTOM_VERSION_ARGS="$CUSTOM_VERSION_ARGS -Dscala.version=$SCALA_VERSION"
fi
# Revision 参数
REVISION_ARG=""
if [ -n "$REVISION" ]; then
REVISION_ARG="-Drevision=$REVISION"
fi
# 格式化时间
format_duration() {
local seconds=$1
local minutes=$((seconds / 60))
local secs=$((seconds % 60))
if [ $minutes -gt 0 ]; then
echo "${minutes}分${secs}秒"
else
echo "${secs}秒"
fi
}
# 确定显示的版本信息
if [ "$CUSTOM_VERSION_MODE" = true ]; then
# 自定义版本模式
VERSION_DISPLAY="自定义版本 ("
[ -n "$HADOOP_VERSION" ] && VERSION_DISPLAY="$VERSION_DISPLAY Hadoop $HADOOP_VERSION"
[ -n "$SPARK_VERSION" ] && VERSION_DISPLAY="$VERSION_DISPLAY Spark $SPARK_VERSION"
[ -n "$HIVE_VERSION" ] && VERSION_DISPLAY="$VERSION_DISPLAY Hive $HIVE_VERSION"
[ -n "$SCALA_VERSION" ] && VERSION_DISPLAY="$VERSION_DISPLAY Scala $SCALA_VERSION"
VERSION_DISPLAY="$VERSION_DISPLAY )"
DEFAULT_REVISION="1.8.0"
elif [ "$V3_MODE" = true ]; then
# --v3 模式:Apache 发布版本
VERSION_DISPLAY="Apache 发布版本 (Hadoop 3.3.4 + Spark 3.2.1 + Scala 2.12.17 + Hive 3.1.3)"
DEFAULT_REVISION="1.8.0-apache"
else
# 默认模式 (包括 --v2)
VERSION_DISPLAY="默认版本 (Hadoop 2.7.2 + Spark 2.4.3 + Scala 2.11.12 + Hive 2.3.3)"
DEFAULT_REVISION="1.8.0"
fi
# 如果未指定 revision,使用默认值
if [ -z "$REVISION" ]; then
REVISION_ARG="-Drevision=$DEFAULT_REVISION"
fi
echo ""
echo -e "${BLUE}╔════════════════════════════════════════════════════════╗${NC}"
echo -e "${BLUE}║ Linkis 混合编译模式 (Hybrid Build) ║${NC}"
echo -e "${BLUE}╚════════════════════════════════════════════════════════╝${NC}"
echo ""
echo -e "${YELLOW}📋 编译策略:${NC}"
echo " [1/3] 并行编译基础模块 (跳过 hbase 和 linkis-dist) - 使用 -T $THREADS"
echo " [2/3] 串行编译 hbase 模块 (依赖基础模块)"
echo " [3/3] 并行编译剩余模块和 linkis-dist"
echo ""
echo -e "${YELLOW}🔧 版本:${VERSION_DISPLAY}${NC}"
echo -e "${YELLOW}📦 Revision: ${REVISION_ARG#-Drevision=}${NC}"
echo ""
echo -e "${YELLOW}⏱️ 开始时间:$(date '+%Y-%m-%d %H:%M:%S')${NC}"
echo ""
# 记录开始时间
START_TIME=$(date +%s)
# ============================================================
# Step 1: 并行编译基础模块(跳过 hbase 和 linkis-dist)
# ============================================================
echo -e "${GREEN}[1/3] 🚀 并行编译基础模块...${NC}"
echo "执行:mvn clean install -T $THREADS $SKIP_TESTS_ARG $PROFILE_ARG $CUSTOM_VERSION_ARGS $REVISION_ARG -pl '!org.apache.linkis:linkis-engineconn-plugin-hbase','!org.apache.linkis:linkis-engineconn-plugin-hbase-module','!org.apache.linkis:hbase-shims-1.2.1','!org.apache.linkis:hbase-shims-1.4.3','!org.apache.linkis:hbase-shims-2.2.6','!org.apache.linkis:hbase-shims-2.5.3','!org.apache.linkis:linkis-dist'"
echo ""
cd "$PROJECT_DIR"
STEP1_START=$(date +%s)
mvn clean install -T $THREADS $SKIP_TESTS_ARG $PROFILE_ARG $CUSTOM_VERSION_ARGS $REVISION_ARG -pl '!org.apache.linkis:linkis-engineconn-plugin-hbase','!org.apache.linkis:linkis-engineconn-plugin-hbase-module','!org.apache.linkis:hbase-shims-1.2.1','!org.apache.linkis:hbase-shims-1.4.3','!org.apache.linkis:hbase-shims-2.2.6','!org.apache.linkis:hbase-shims-2.5.3','!org.apache.linkis:linkis-dist'
STEP1_END=$(date +%s)
STEP1_TIME=$((STEP1_END - STEP1_START))
echo ""
echo -e "${GREEN}✅ 步骤 1 完成!耗时:${STEP1_TIME} 秒 ($(format_duration $STEP1_TIME))${NC}"
echo ""
# ============================================================
# Step 2: 串行编译 hbase 模块(依赖基础模块)
# ============================================================
echo -e "${GREEN}[2/3] 📦 串行编译 hbase 模块...${NC}"
echo "执行:mvn install -pl org.apache.linkis:linkis-engineconn-plugin-hbase-module -am $SKIP_TESTS_ARG $PROFILE_ARG $CUSTOM_VERSION_ARGS $REVISION_ARG"
echo ""
STEP2_START=$(date +%s)
# 编译 hbase 模块(使用 -am 确保依赖也被编译,但基础模块已编译会直接跳过)
mvn install -pl org.apache.linkis:linkis-engineconn-plugin-hbase-module -am $SKIP_TESTS_ARG $PROFILE_ARG $CUSTOM_VERSION_ARGS $REVISION_ARG
STEP2_END=$(date +%s)
STEP2_TIME=$((STEP2_END - STEP2_START))
echo ""
echo -e "${GREEN}✅ 步骤 2 完成!耗时:${STEP2_TIME} 秒 ($(format_duration $STEP2_TIME))${NC}"
echo ""
# ============================================================
# Step 3: 并行编译剩余模块和 linkis-dist
# ============================================================
echo -e "${GREEN}[3/3] 🚀 并行编译 linkis-dist...${NC}"
echo "执行:mvn install -T $THREADS -pl :linkis-dist $SKIP_TESTS_ARG $PROFILE_ARG $CUSTOM_VERSION_ARGS $REVISION_ARG"
echo ""
STEP3_START=$(date +%s)
mvn install -T $THREADS -pl :linkis-dist $SKIP_TESTS_ARG $PROFILE_ARG $CUSTOM_VERSION_ARGS $REVISION_ARG
STEP3_END=$(date +%s)
STEP3_TIME=$((STEP3_END - STEP3_START))
echo ""
echo -e "${GREEN}✅ 步骤 3 完成!耗时:${STEP3_TIME} 秒 ($(format_duration $STEP3_TIME))${NC}"
echo ""
# ============================================================
# 显示结果
# ============================================================
END_TIME=$(date +%s)
TOTAL_TIME=$((END_TIME - START_TIME))
CURRENT_REVISION=${REVISION_ARG#-Drevision=}
DIST_DIR="$PROJECT_DIR/linkis-dist/target/apache-linkis-${CURRENT_REVISION}-bin"
echo -e "${BLUE}╔════════════════════════════════════════════════════════╗${NC}"
echo -e "${BLUE}║ 编译完成! ║${NC}"
echo -e "${BLUE}╚════════════════════════════════════════════════════════╝${NC}"
echo ""
echo -e "${YELLOW}📊 耗时统计:${NC}"
echo " 步骤 1 (并行编译基础模块): ${STEP1_TIME} 秒 ($(format_duration $STEP1_TIME))"
echo " 步骤 2 (串行编译 hbase): ${STEP2_TIME} 秒 ($(format_duration $STEP2_TIME))"
echo " 步骤 3 (并行编译剩余模块): ${STEP3_TIME} 秒 ($(format_duration $STEP3_TIME))"
echo " ──────────────────────────────────"
echo -e " ${GREEN}总耗时:${TOTAL_TIME} 秒 ($(format_duration $TOTAL_TIME))${NC}"
echo ""
# 检查产物
if [ -d "$DIST_DIR" ]; then
FILE_COUNT=$(find "$DIST_DIR" -type f 2>/dev/null | wc -l)
DIR_SIZE=$(du -sh "$DIST_DIR" 2>/dev/null | cut -f1)
echo -e "${YELLOW}📦 产物信息:${NC}"
echo " 目录:$DIST_DIR"
echo " 文件数:$FILE_COUNT"
echo " 总大小:$DIR_SIZE"
echo ""
# 检查关键目录
echo -e "${YELLOW}🔍 关键模块检查:${NC}"
for module in "linkis-cg-engineconnmanager" "linkis-cg-entrance" "linkis-cg-linkismanager"; do
module_path="$DIST_DIR/linkis-package/lib/linkis-computation-governance/$module"
if [ -d "$module_path" ]; then
echo -e " ${GREEN}✅ $module${NC}"
else
echo -e " ${RED}❌ $module (缺失!)${NC}"
fi
done
echo ""
else
echo -e "${YELLOW}⚠️ 产物目录不存在:$DIST_DIR${NC}"
echo ""
fi
echo -e "${GREEN}🎉 混合编译完成!${NC}"
echo " 结束时间:$(date '+%Y-%m-%d %H:%M:%S')"
echo ""