
从源码到 .deb/.rpmFullstaq Ruby 如何用 FPM 打包预编译 Ruby 二进制本地构建完全教程【免费下载链接】server-editionA server-optimized Ruby distribution: less memory, faster, easy to install and security-patch via APT/YUM项目地址: https://gitcode.com/gh_mirrors/se/server-editionFullstaq Ruby 是一个为服务器场景优化的 Ruby 发行版通过预编译的 Ruby 二进制 原生 .deb/.rpm 系统包让 Ruby 安装、安全补丁和内存优化变得极其简单。本文将从源码出发讲解它如何用 FPM 这个 Ruby 打包工具把编译好的 Ruby 二进制打成本地可用的 .deb 和 .rpm 安装包并附上一份可在自己机器上跑通的本地构建完全教程 ️为什么选择 FPM 打包预编译 Ruby在介绍流程之前先理解一个关键设计Fullstaq Ruby 不直接编译安装包而是把「编译出的二进制目录」整体交给 FPM 封装。FPMEffing Package Management是一个 Ruby gem可以用一条命令把任意目录打包成.deb、.rpm等格式避免了手写 Debian/RPM spec 文件的繁琐。项目遵循最小依赖原则你本机只需要安装 Bash、Ruby 和 Docker 三样东西FPM 就运行在官方的 Docker 容器里不需要你在本地gem install任何打包工具详见dev-handbook/minimal-dependencies-principle.md。这样带来的好处是在任何操作系统上都能构建出任意发行版的 .deb/.rpm 包构建结果完全可复现。构建流程总览下载源码 → 编译二进制 → FPM 打包整个流程分为三层如下图所示Download sources下载源码Ruby 源码、Rbenv 源码、Jemalloc 源码仅 jemalloc 变体需要。Build binaries编译二进制build-ruby对每个「发行版 × 变体」组合编译 Ruby 二进制产出ruby-bin.tar.gzbuild-jemalloc可选先编译 Jemalloc 二进制供 Ruby 链接。Build packagesFPM 打包六条打包通道全部位于container-entrypoints/目录build-ruby-deb/build-ruby-rpm把 Ruby 二进制打成fullstaq-ruby-版本包build-rbenv-deb/build-rbenv-rpm打fullstaq-rbenv包与发行版无关的 noarch 包build-common-deb/build-common-rpm打fullstaq-ruby-common粘合包。各脚本的完整说明见dev-handbook/package-organization.md分步教程见dev-handbook/building-packages-locally.md。最小依赖原则FPM 藏在 Docker 容器里这是新手最容易困惑的一点根目录的build-ruby-deb等脚本其实只是包装器。它们解析命令行参数后把真正的工作交给 Docker 容器里的container-entrypoints/build-ruby-deb执行。FPM 声明在environments/utility/Gemfile其中只有一行核心依赖gem fpm预装进environments/utility工具镜像因此你永远不需要在本机安装 rpmbuild、dpkg 或 FPM 本身——这就是最小依赖的设计哲学。本地构建六步走完整实操教程 第一步下载三个源码包需要下载Ruby 源码任选版本、fullstaq-rbenv支持系统级 Ruby 的 Rbenv 分支、Jemalloc 3.x 源码仅构建 jemalloc 变体时需要。第二步可选编译 Jemalloc 二进制构建 jemalloc 变体时先运行build-jemalloc脚本参数含义-n目标发行版如centos-8-sJemalloc 源码包路径-o输出的二进制 tar.gz 路径-j并发编译数建议设为 CPU 核数以加速编译。第三步编译 Ruby 二进制核心步骤运行build-ruby脚本把 Ruby 编译成一个自包含的二进制目录tar.gz。关键参数-m传入第二步的 Jemalloc 二进制包构建 jemalloc 变体时-t启用malloc_trim支持构建 malloctrim 变体时二选一-v版本号。构建小版本包时只写如3.1构建特定小版本包时写全如3.1.2——这正是 Fullstaq Ruby 小版本包自动跟进安全补丁 机制的根源。第四步用 FPM 打出 Ruby 安装包拿到ruby-bin.tar.gz后分别运行# 打 Debian 包 ./build-ruby-deb -b ruby-bin.tar.gz -o fullstaq-ruby-3.1.2-jemalloc_0-debian-11_amd64.deb # 打 RPM 包 ./build-ruby-rpm -b ruby-bin.tar.gz -o fullstaq-ruby-3.1.2-jemalloc-rev0-centos8.x86_64.rpm-b是二进制包路径-o是输出的 .deb/.rpm 文件名记得按发行版和变体修改。第五步 第六步打 Rbenv 包和 common 粘合包build-rbenv-deb/build-rbenv-rpm把 fullstaq-rbenv 源码打成包Rbenv 只是 shell 脚本无系统依赖因此是 noarch 包build-common-deb/build-common-rpm打出不含文件的fullstaq-ruby-common粘合包它负责声明推荐依赖让用户一次性装齐。深入 FPMbuild-ruby-deb 到底做了什么打开container-entrypoints/build-ruby-debRPM 版逻辑相同可以看到一条完整的bundle exec fpm命令几个设计细节值得学习-s dir -t debFPM 以目录源模式工作把usr目录整体打包——预编译二进制零修改地进入安装包--iteration $ENVIRONMENT自动检测二进制构建所用的发行版并写入包元数据使同一版本号能区分不同发行版--depends $DEPS依赖来自shlib-deps.txt由internal-scripts/autodetect-shlib-dependencies脚本扫描二进制自动推导避免手写依赖--deb-recommends fullstaq-ruby-common声明推荐依赖用户装 Ruby 包时会顺带装齐 Rbenv元数据嵌入描述字段变体名、发行版名写进--description供上传发布脚本internal-scripts/解析使用。三类包如何协同工作构建完成后你会得到三类协同工作的包包名作用特点fullstaq-ruby-版本预编译 Ruby 二进制安装到/usr/lib/fullstaq-ruby/versions/版本并注册到系统级 Rbenvfullstaq-rbenv支持系统级 Ruby 的 Rbenv纯 shell 脚本noarch跨发行版通用fullstaq-ruby-common粘合包不含文件仅声明推荐依赖三者可并行安装、互不冲突这正是多版本 Ruby 共存的基础。CI/CD同样的 FPM 流程全自动执行 以上步骤在持续集成中被完全自动化下图展示了 CI 工作流的实际检查项构建各发行版 Docker 镜像、下载各版本 Ruby 源码、按矩阵构建包、最后发布与测试工作流 YAML 由internal-scripts/generate-ci-cd-yaml.rb自动生成配置集中在config.yml发布环节由internal-scripts/ci-cd/publish/publish-debs.rb和publish-rpms.rb把 FPM 产物推送到 APT/YUM 仓库架构见dev-handbook/apt-yum-repo.md。构建完成后先测试再使用 ✅打包成功后强烈建议先跑一遍本地测试test-debs和test-rpms脚本会在容器里安装你刚打的包并执行测试套件原理见dev-handbook/testing-packages-locally.md。测试通过后再用dpkg -i或rpm -i安装然后用rbenv versions确认版本已注册即大功告成。小结Fullstaq Ruby 用 FPM 把预编译二进制目录直接封装为原生 .deb/.rpm 包配合最小依赖的 Docker 构建环境与自动化的依赖检测让任何人只需三步——装 Docker、改配置、跑脚本——就能构建出可发布质量的 Ruby 二进制安装包 【免费下载链接】server-editionA server-optimized Ruby distribution: less memory, faster, easy to install and security-patch via APT/YUM项目地址: https://gitcode.com/gh_mirrors/se/server-edition创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考