Apache Cassandra 源码 RPM 打包构建指南:从 ant artifacts 到 rpmbuild 产出可安装的二进制包
Apache Cassandra 源码 RPM 打包构建指南从 ant artifacts 到 rpmbuild 产出可安装的二进制包【免费下载链接】cassandraOpen source transactional distributed database. Linear scalability and proven fault-tolerance on commodity hardware or cloud infrastructure without compromising performance.项目地址: https://gitcode.com/GitHub_Trending/cassa/cassandra本指南以 redhat/README.md 为核心完整讲解如何在 RHEL/CentOS 系列发行版上从 Apache Cassandra 源码仓库构建出可安装的 RPM 二进制包。你将掌握ant artifacts源码打包与rpmbuild的两步构建流程、version/revision 宏的正确传参方式以及 redhat/cassandra.spec 中安装布局、依赖声明、init 脚本与alternatives配置的底层实现细节从而能够为任意 Cassandra 版本产出带版本号、可复现的 RPM 制品。前置条件与构建环境要求官方 README 明确给出了两条构建前提这决定了打包脚本能跑通的最低环境基线ant 构建依赖齐全构建系统必须已经具备 Apache Cassandraant artifacts构建所需的全部依赖。也就是说这条 RPM 打包流程并不承担源码编译环境搭建的职责它假定你已经在源码目录下能正常执行 Ant 构建任务ant与ant-junit在 spec 中被声明为BuildRequires: ant 1.9。系统版本下限README 说明由于早期 Cassandra 依赖 Python 2.7最早支持的系统为 RHEL/CentOS 7.0。需要留意的是当前仓库的 redhat/cassandra.spec 已经将 Python 切换到 3.x 体系%define __python /usr/bin/python3且Requires: python(abi) 3.6同时运行时 JVM 要求为(java-11-headless or java-17-headless or java-21-headless)。因此在实际打包时应以当前 spec 文件声明的依赖为准并保证打包机上安装有受支持的 JDK 与 Python 3.6。redhat/ 打包目录全景整个 RPM 打包体系集中在仓库根目录下的 redhat/ 目录中除 README 外还包含 5 个关键文件它们分别承担不同职责文件角色redhat/cassandra.specRPM 打包规范定义依赖、构建、安装、文件清单与脚本钩子redhat/cassandraSysV init 启动脚本安装至/etc/rc.d/init.d/cassandraredhat/cassandra.conf进程资源限制配置安装至/etc/security/limits.d/cassandra.confredhat/cassandra.in.sh运行环境注入脚本安装至/usr/share/cassandra/cassandra.in.shredhat/default系统级环境变量文件安装至/etc/default/cassandra其中cassandra.in.sh是运行时环境的核心它负责组装 classpath依次加载$CASSANDRA_CONF、$CASSANDRA_HOME下全部lib/*.jar、JSR223 引擎 jar、平台相关 jar、探测 JAVA_HOME、校验 Java 版本仅接受 11/17/21可通过CASSANDRA_JDK_UNSUPPORTED强制放行并按 JDK 版本读取jvm11/jvm17/jvm21系列的-server.options文件。对于 JDK 17它还会追加--add-exports、--add-opens等模块系统参数对应 CASSANDRA-19001这些细节在从源码手动启动时同样适用。Step 1用 ant artifacts 生成源码与制品打包的第一步是让 Ant 构建出 RPM 所需的源码包与编译产物ant artifacts -Dreleasetrue从源码看artifacts目标定义在 build.xml 中它依赖_artifacts-init、check、sources-jar、sstableloader-sources-jar等前置任务。-Dreleasetrue会触发 release 模式构建产出带版本标识的发布制品。构建完成后build/目录下会生成 spec 后续步骤需要的三类关键输入源码 tarballapache-cassandra-version-src.tar.gz对应 spec 中的Source0: %{relname}-src.tar.gz主 jar 包apache-cassandra-version.jar工具 jartools/lib/stress.jar、tools/lib/fqltool.jar、tools/lib/sstableloader.jar以及html/文档与man/*.7.gz手册页。Step 2用 rpmbuild 构建 RPMspec 文件没有硬编码版本号因此版本必须在rpmbuild调用时通过--define显式传入。官方 README 给出的完整命令如下示例版本为 4.0mkdir -p build/rpmbuild/{BUILD,RPMS,SPECS,SRPMS} rpmbuild --defineversion 4.0 \ --definerevision $(date %Y%m%d)git$(git rev-parse --short HEAD)%{?dist} \ --define _topdir $(pwd)/build/rpmbuild \ --define _sourcedir $(pwd)/build \ -ba redhat/cassandra.spec对命令中的每个参数逐项拆解--defineversion 4.0注入%{version}决定包名、源码包名apache-cassandra-4.0-src.tar.gz以及 jar 名称。spec 内部还会用upstream_version宏把形如~alphaN、~betaN、~rcN的上游版本号统一替换为-alphaN等格式保证与上游源码/jar 的命名一致。--definerevision ...注入%{revision}即 RPM Release 字段。git 快照场景下使用$(date %Y%m%d)git$(git rev-parse --short HEAD)%{?dist}可生成形如20260915git3f2a1b9.el9的日期提交号组合便于追溯来源正式发布非快照场景则按 README 建议改用--definerevision 1。--define _topdir $(pwd)/build/rpmbuild把 RPM 工作根目录指到仓库内的build/rpmbuild使BUILD、RPMS、SPECS、SRPMS四个子目录都落在此处避免污染系统默认的/usr/src/redhat也方便非 root 用户构建。--define _sourcedir $(pwd)/build告诉 rpmbuild 在仓库的build/目录中寻找%{relname}-src.tar.gz源码包。-ba同时构建二进制 RPMRPMS/与源码 RPMSRPMS/。构建完成后产物即可在下述目录中找到ls -l build/rpmbuild/{SRPMS,RPMS}/RPMS/下会产出cassandra-version-revision.noarch.rpm与cassandra-tools-version-revision.noarch.rpm详见下文子包说明。深入解析 cassandra.spec打包的每一层都在做什么redhat/cassandra.spec 是整套打包逻辑的剧本它涵盖了从预处理到安装脚本的全部阶段以下是按阶段展开的核心要点。全局宏与包元数据由于 Cassandra 属于noarch纯 Java 包spec 用%define _binaries_in_noarch_packages_terminate_build 0关闭了对 noarch 包中二进制文件的报错并用%define __jar_repack %{nil}禁止对 jar 进行 repack同时通过__os_install_post裁剪掉brp-python-bytecompile与brp-mangle-shebangs避免 Python 脚本的 shebang 被改写。AutoReqProv: no关闭自动依赖探测所有运行时依赖均为手工声明Requires: (java-11-headless or java-17-headless or java-21-headless)布尔依赖三个 JDK 满足其一即可、python(abi) 3.6、procps-ng 3.3并通过Requires(pre): user(cassandra)、group(cassandra)、shadow-utils与Provides: user(cassandra)、group(cassandra)实现用户/组虚拟依赖。%prep 与 %build%prep使用%setup -q -n %{relname}-src解包源码 tarball。%build阶段执行ant jar -Dversion%{upstream_version} -Dno-checkstyletrue -Drat.skiptrue -Dant.gen-doc.skiptrue跳过 checkstyle、RAT 许可证检查与文档生成只产出主 jar这也是打包构建比完整ant artifacts更精简的原因。%install定义安装布局安装阶段体现了 RPM 包的文件落位规则其中关键动作包括创建目录骨架/etc/cassandra/default.conf默认配置、/etc/rc.d/init.dinit 脚本、/etc/security/limits.d资源限制、/etc/default环境变量、/usr/share/cassandra/lib依赖库、/usr/sbin与/usr/bin可执行文件、/var/lib/cassandra、/var/run/cassandra、/var/log/cassandra数据/运行/日志目录。安装 Python 工具在pylib下执行python3 setup.py install --no-compile --root %{buildroot}将 cqlsh 库安装到%{python_sitelib}。打路径补丁依次应用 debian/patches/cassandra_yaml_dirs.diff激活data_file_directories、commitlog_directory、saved_caches_directory三个指向/var/lib/cassandra/...的配置与 debian/patches/cassandra_logdir_fix.diff把日志目录从$CASSANDRA_HOME/logs改为/var/log/cassandra并额外用sed取消 conf/cassandra.yaml 中hints_directory的注释使 hint 落盘到/var/lib/cassandra/hints。复制配置与脚本conf/*全量拷入/etc/cassandra/default.conf/再分别用 redhat/cassandra.in.sh 覆盖到/usr/share/cassandra/、redhat/cassandra 装入/etc/rc.d/init.d/、redhat/cassandra.conf 装入/etc/security/limits.d/、redhat/default 装入/etc/default/cassandra。装配可执行文件cassandra主程序放入/usr/sbin其余bin/*与tools/bin/*cqlsh、nodetool、sstableloader、cassandra-stress、fqltool 等统一放入/usr/bin。用户创建、alternatives 与 %files%pre阶段用getentgroupadd/useradd创建系统级cassandra用户与组home 为/var/lib/cassandra-M -r表示不建家目录且为系统账号。%post阶段执行alternatives --install /etc/cassandra/conf cassandra /etc/cassandra/default.conf/ 0把默认配置目录注册为 alternatives 槽位%preun在真正卸载而非升级时移除该 alternative。%files清单覆盖了全部二进制、init 脚本、配置%config(noreplace)保护/etc/cassandra升级时不覆盖用户改动、/var/lib/cassandra、/var/log/cassandra*、/var/run/cassandra*后三者归属cassandra:cassandra以及%{python_sitelib}/cqlshlib/与cassandra_pylib*.egg-info。子包 cassandra-toolsspec 通过%package tools产出独立的cassandra-tools子包Requires: cassandra %{version}-%{revision}严格锁定主包版本。该子包收纳sstabledump、sstablemetadata、sstableofflinerelevel、sstablerepairedset、sstablesplit、sstablepartitions、sstableexpiredblockers、sstablelevelreset、compaction-stress、hash_password、cmsofflinetool、offlineclustermetadatadump等 SStable 运维与离线工具适合不需要这些运维工具的轻量部署场景按需安装。安装后的运行时布局RPM 安装完成后Cassandra 以标准发行版布局运行与源码解压版$CASSANDRA_HOME下数据日志混放有明显区别路径用途/usr/share/cassandra主程序目录主 jar、lib/依赖库、cassandra.in.sh/etc/cassandra/conf配置目录alternatives 指向default.conf内含cassandra.yaml、jvm*-server.options、cassandra-env.sh等/var/lib/cassandra数据目录data、commitlog、saved_caches、hints/var/log/cassandra运行日志logback 与 GC 日志/var/run/cassandraPID 文件目录/etc/rc.d/init.d/cassandraSysV init 脚本/etc/default/cassandra系统级环境变量可在此通过EXTRA_CLASSPATH扩展类路径/etc/security/limits.d/cassandra.conf资源限制memlock unlimited、nofile 100000、nproc 32768、as unlimitedredhat/cassandra 这个 init 脚本支持start|stop|status|restart|reload五个动作启动时以runuser -u cassandra降权执行/usr/sbin/cassandra -p $pid_file并写 PID、日志与/var/lock/subsys/cassandra锁文件停止时向 PID 发kill并轮询status -p最多 20 秒等待退出随后额外sleep 5等待 JMX 端口释放注释中引用了 CASSANDRA-4483 的历史背景。脚本会优先读取/etc/default/cassandra未设置JAVA_HOME时依次探测which java对应的 JVM 与/usr/lib/jvm/jre等目录。注意事项与常见问题不要以 root 构建包这是 README 末尾的明确提示。以普通用户执行rpmbuild并配合_topdir指向仓库内目录即可正常工作root 构建既不符合打包惯例也可能因权限与文件属主问题引发意外。版本与 revision 不可省略spec 未内置版本漏传--defineversion ...会导致构建失败revision决定 Release 字段快照构建务必使用带 git 提交号的组合式取值。README 与 spec 的版本差异README 中依赖 Python 2.7的描述属于历史说明当前 spec 已全面切换到 Python 3.6 与 JDK 11/17/21请以 redhat/cassandra.spec 中的Requires为准准备打包机环境。数据目录必须就位由于 spec 通过补丁把data_file_directories、commitlog_directory、saved_caches_directory、hints_directory全部指向/var/lib/cassandra下的子目录首次启动前应确保该目录存在且属主为cassandra用户RPM 安装时%pre与%files的属主设置已处理。【免费下载链接】cassandraOpen source transactional distributed database. Linear scalability and proven fault-tolerance on commodity hardware or cloud infrastructure without compromising performance.项目地址: https://gitcode.com/GitHub_Trending/cassa/cassandra创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考