Bigtop 构建过程中 RPM 打包路径解析
在 Apache Bigtop 的组件打包体系中,每个服务(如 Ranger、Kafka、HDFS)都会通过 Gradle 脚本构建成 RPM 包,而其中最关键的打包中间路径便是:
build/<component>/rpm/SOURCES/
这里汇聚了源码 tar 包、启动模板、构建脚本、补丁文件、配置元信息等所有用于 .spec
文件构建的内容。
理解这些路径的来源与组织方式,有助于我们在修改源码、补丁或打包脚本时做到有的放矢、快速定位。
# 1. packages.gradle 中的路径收集逻辑解析
Bigtop 使用 packages.gradle
文件统一管理各组件的构建任务。以下是拷贝资源到构建目录的完整逻辑片段。
# 📥 代码分析
// 复制组件 rpm 目录下的 spec 文件和其他资源
copy {
from fileTree("${BASE_DIR}/bigtop-packages/src/rpm/$NAME") {
include '**/*'
}
into "$PKG_BUILD_DIR/rpm"
}
2
3
4
5
6
7
.spec
文件就是在这里被收集到 $PKG_BUILD_DIR/rpm
目录的,后续会由 rpmbuild
使用。
// 种子源码包(通常为 .tar.gz)
copy {
from SEED_TAR
into "$PKG_BUILD_DIR/rpm/SOURCES"
}
2
3
4
5
这部分是打包的核心来源,构建系统会默认在 .spec
中声明 Source0
指向它。
// init 脚本模板
copy {
from "${BASE_DIR}/bigtop-packages/src/templates/init.d.tmpl"
into "$PKG_BUILD_DIR/rpm/SOURCES"
}
2
3
4
5
对应的是各服务的 systemd / init 脚本模版。
// 拷贝扩展补丁等附加脚本
copy {
from "${BASE_DIR}/bigtop-packages/src/extensions"
into "$PKG_BUILD_DIR/rpm/SOURCES"
include "*"
}
2
3
4
5
6
所有 patch 文件、postinstall/postuninstall 脚本都可以放在 extensions/
目录中。
// 通用脚本文件(install.sh、deploy.sh)
copy {
from "${BASE_DIR}/bigtop-packages/src/scripts"
into "$PKG_BUILD_DIR/rpm/SOURCES"
include "*"
}
2
3
4
5
6
这些文件常用于服务初始化或外部部署集成(如部署 Ambari 服务 XML 等)。
// 每个组件下的通用配置文件,如 bom、xml、env
copy {
from fileTree("$BASE_DIR/bigtop-packages/src/common/$NAME") {
include '**/*'
}
into "$PKG_BUILD_DIR/rpm/SOURCES"
}
2
3
4
5
6
7
这段是核心扩展:将每个组件的配置项(如 bigtop.bom
、aws-maven.xml
)归档至构建路径内,确保 .spec
能引用到。
这些资源最终都会被集中写入到 rpm/SOURCES 中统一管理。
# 2. 构建输出结构一览(含实际截图)
执行构建任务后,会生成如下标准化 RPM 打包目录:
build/ranger/rpm/
├── BUILD/
├── BUILDROOT/
├── SOURCES/
│ ├── release-ranger-2.4.0.tar.gz
│ ├── patch0-RANGER-4201.diff
│ ├── init.d.tmpl
│ ├── install_ranger.sh
│ ├── bigtop.bom
│ └── ...
├── SPECS/
│ └── ranger.spec
└── SRPMS/
2
3
4
5
6
7
8
9
10
11
12
13
📷 实际视图如下所示:
可以看到:
.tar.gz
为主源码包,.spec 中用作Source0
patch*.diff
会在构建中自动依次打入(通过%patch0
,%patch1
)- 各种脚本、bom、模板全部归档在同一目录,避免路径冲突
这些组织方式是为了配合 RPM 的构建机制,其中 .spec
文件就是读取这些 打包原材料
来完成解压、打补丁、安装等一系列构建动作。
# 3. 典型路径归类总结表
类型 | 来源路径 | 用途说明 |
---|---|---|
Spec 文件 | src/rpm/<component> | 被 rpmbuild 使用生成 rpm 包 |
源码包 | ${SEED_TAR} | 指定为 Source0 ,用于 %setup |
脚本工具 | src/scripts/ | install/deploy 脚本,供 %install 使用 |
补丁扩展 | src/extensions/ | .diff 文件被用于 %patch 语句 |
启动模板 | src/templates/ | 生成 systemd/init 脚本 |
组件通用配置 | src/common/<component> | 如 bigtop.bom、maven.xml 等基础配置 |
所有路径最终都必须出现在 SOURCES/
中,否则在 .spec
文件中无法引用。重要提示
# 4. 小结与构建建议
Bigtop 的打包体系通过 Gradle 构建逻辑,将一切资源集中在统一结构中管理,这为构建可复现、维护可控打下了基础。
- 如果你希望添加新的资源文件,只需将其放入指定路径
.spec
文件不需要硬编码路径,构建时会自动从SOURCES/
中获取- 所有引用统一后,构建流程会变得稳定、清晰、可预期
提示
你可以通过 build/<component>/rpm/SPECS/<component>.spec
来检查实际构建使用了哪些资源。
如后续需自定义构建行为(添加 patch、新增配置等),只需修改上述路径对应文件即可,构建框架已完成自动注入,无需手动干预路径引用。