FPM工具制作RPM包

文章目录

一、fpm工具介绍

1、什么是fpm?

yaml 复制代码
FPM是一个用于快速构建软件包的工具,支持多种源文件格式和输出格式,包括gem、python module、pear、目录、rpm、deb、node packages等等。使用FPM工具,可以将已经编译和安装的软件快速打包成各种格式的安装包,方便在其他机器上进行部署和安装。同时fpm工具采用ruby语言开发,所以使用前需要在机器上安装ruby环境

2、fpm技术分析

yaml 复制代码
FPM 使用 Ruby 编写,其核心机制是对输入的文件和目录进行处理,然后生成符合特定格式的包结构。
它的灵活性体现在支持多种输入类型和输出格式:
	输入类型: 可以是任意文件、目录、tar 包或者已存在的软件包。
	输出格式: 支持包括 Debian(.deb)、Red Hat (.rpm)、Solaris (.pkg)、RubyGems (.gem) 在内的多种包格式。
FPM 使用元数据来描述包的信息,例如作者、版本、依赖关系等。这些信息被嵌入到生成的包中,便于管理和查询

3、fpm应用场景

yaml 复制代码
交付运维: 给甲方快速提供各种安装部署包,实现快捷交付和一键部署
支持多平台构建: 如果你需要在不同的操作系统上分发软件,FPM 可以帮你快速创建不同系统的安装包

4、fpm与rpmbuild的区别

特点 fpm rpmbuild
用途 支持将多种格式构建为RPM等不同的格式包 专用于 构建RPM 包
语言 Ruby C
易用性 简单易用 复杂,需要更多配置
适用场景 DevOps, CI/CD,快速交付 高度定制化的 RPM 打包
支持的格式 多种格式(包括 .deb, .rpm 等) 仅支持 .rpm

二、fpm安装及构建操作

1、安装fpm工具

yaml 复制代码
服务器操作系统 centos7.9
fpm工具安装官网https://fpm.readthedocs.io/en/latest/installing.html
1.1、安装ruby环境
shell 复制代码
[root@python2 ~]# yum -y install ruby-devel gcc make rpm-build rubygems ruby
1.2、Ruby Gems源更换为国内的源
shell 复制代码
RubyGems是Ruby的一个包管理器,功能上类似于apt-get、yum等,所以我们需要通过RubyGems来安装fpm。

由于国外的源很慢,或者直接不能访问,需要将Ruby Gems源更换为国内的源。
[root@python2 ~]# gem sources --add http://mirrors.aliyun.com/rubygems/
1.3、删除官方源
shell 复制代码
[root@python2 ~]# gem sources --remove https://rubygems.org/
1.4、查看当前源列表
shell 复制代码
[root@python2 ~]# gem sources -l
*** CURRENT SOURCES ***
http://mirrors.aliyun.com/rubygems/
1.5、安装fpm版本
shell 复制代码
[root@python2 ~]# gem install fpm
1.5.1、报错解决
yaml 复制代码
在安装fpm时遇到以上错误,提示ruby版本必须大于3.0,因此需要对ruby进行升级操作
shell 复制代码
1、查看当前ruby版本
[root@python2 ~]# ruby -v
ruby 2.0.0p648 (2015-12-16) [x86_64-linux]

2、安装rvm
rvm是用来管理ruby的,而ruby的其中一个"程序"叫rubygems,也就是我们用它装fpm的,手工装各种库用gem。
所以,我们首先安装rvm,这个在线速度很慢,我这里使用离线安装。
2.1、下在rvm安装包
[root@python2 ~]# curl -sSL https://github.com/rvm/rvm/tarball/stable -o rvm-stable.tar.gz
2.2、解压安装rvm
[root@python2 ~]# tar -xzvf rvm-stable.tar.gz
[root@python2 ~]# cd rvm-rvm-6bfc921/
[root@python2 rvm-rvm-6bfc921]# ./install --auto-dotfiles
2.3、加载rvm
[root@python2 rvm-rvm-6bfc921]# source /usr/local/rvm/scripts/rvm
shell 复制代码
2.4、升级ruby
查看rvm可安装版本
[root@python2 rvm-rvm-6bfc921]# rvm list known
安装ruby 3.0.0
[root@python2 rvm-rvm-6bfc921]# rvm install 3.0.0
设置默认使用ruby版本,并验证ruby是否升级成功
[root@python2 rvm-rvm-6bfc921]# rvm use 3.0.0 --default
Using /usr/local/rvm/gems/ruby-3.0.0
[root@python2 rvm-rvm-6bfc921]# ruby -v
ruby 3.0.0p0 (2020-12-25 revision 95aff21468) [x86_64-linux]
shell 复制代码
2.5、再次安装fpm,并验证
[root@python2 rvm-rvm-6bfc921]# gem install fpm
[root@python2 rvm-rvm-6bfc921]# fpm -v
1.15.1

2、fpm常用参数

yaml 复制代码
RPM包的组成格式:
promethues-2.44.0-1.el7.x86_64.rpm
  |        |      |    |     |    |
软件名称    |      |    |     |    |
         版本号    |    |   |    |
                发布号  |     |    |
                    硬件平台  架构  |
                                  扩展名
例子备注:
    promethues: 软件名称
    2.44.0: 软件版本号
    1: 发布号主要是对软件存在的bug或漏洞进行修补,在软件功能上并没有变化
    el7: 发布序号
    x86_64: 指64位的PC架构,另外还有'i386' 'i686' 等32位的PC架构
    rpm: 扩展名
yaml 复制代码
fpm命令常用参数:
    -f: 强制覆盖[覆盖同名rpm包]
    -n: 指定的rpm包名
    -p: 指定的rpm包文件放置位置
    -v: 指定的rpm包版本
    -d: 指定依赖的软件  ([-d 'name'] or [-d 'name > version'] 例子: -d 'libstdc++ >= 4.4.3')
    -a: 指定系统架构,如果是noarch则为'-a all' 或者 '-a native' [x86_64] 当软件不区分64位或32位的时候可以 noarch
    -s: 指定INPUT的数据类型 (["-s dir"] 省略数据类型)
    -m: 指定打包人员[Packager]  ([ -m 'user'])
    -C: 指定打包的相对路径,类似于buildroot. 譬如-C /tmp/apr/ 而打包机器的数据包路径是/tmp/apr/{opt,usr,etc} 那安装这个rpm包后,在本地的数据就是/opt/,/usr/,/etc/
    -t: 指定需要制作成什么包,可选项有(deb,rpm,solaris,etc)
        支持的源类型:
            "dir" "rpm" "gem" "python" "empty" "tar" "deb" "cpan" "npm" "osxpkg" "pear" "pkgin" "virtualenv" "zip"
        支持的目标类型:
            "rpm" "deb" "solaris" "puppet" "dir" "osxpkg" "p5p" "puppet" "sh" "solaris" "tar" "zip"
    --description: 软件包描述
    --conflicts: 指定冲突软件
    --url: 指定站点[惯例都是添加软件的官网 例如: --url "http://www.cnblog.com/roach57" ]
    --verbose: 安装过程详细打印
    --after-install: 包安装之后执行的脚本 也可写作 --post-install FILE
    --before-install: 包安装之前执行的脚本 
    --after-remove: 包卸载之后执行的脚本
    --before-remove: 包卸载之前执行的脚本
    --after-upgrade: 包更新之后执行的脚本[仅支持 deb 和 rpm 这两种包]
    --before-upgrade: 包更新之前执行的脚本
    --iteration: 发布序号[就是rpm包里面的release]
    --epoch: 纪元  [不知道干嘛用的]
    --no-rpm-sign: 不使用rpm签名   Signature
    --license: 证书许可 [可选项有 'BSD(开源软件)' 'GPLv2(自由软件)' 'MIT' 'Public Domain(公共域)' 'Distributable(贡献)' 'commercial(商业)' 'Share(共享)等',一般的开发都写'BSD'或'GPL']
    --vendor: 供应商名称 [ --vendor 'roach57@163.com']
    --no-depends: 代表没有任何依赖包,和-d是对立的,不能共用
    --config-files: 指定配置文件,可以指定目录[递归]
    --directories: 指定包目录
    --category: 软件所属的类别[这是个什么软件]下面有个对应的表格:
        [参考这个文件 /usr/share/doc/rpm-x.x.x/GROUPS ]
    --prefix: 指定RPM安装路径

三、fpm构建RPM包示例

shell 复制代码
fpm构建prometheus RPM包示例
1、下载Prometheus二进制包
[root@python1 ~]# wget https://github.com/prometheus/prometheus/releases/download/v2.44.0/prometheus-2.44.0.linux-amd64.tar.gz
2、解压安装包并重新授权
[root@python1 ~]# mkdir /opt/monitor
[root@python1 ~]# tar xf prometheus-2.44.0.linux-amd64.tar.gz -C /opt/monitor/
[root@python1 monitor]# mv prometheus-2.44.0.linux promethues
[root@python1 monitor]# chown -R root.root prometheus
[root@python1 prometheus]# chmod 755 prometheus.yml 
[root@python1 prometheus]# mkdir data                           #该目录用于存储数据至磁盘
[root@python1 monitor]# ll
total 0
drwxr-xr-x 6 root root 269 Oct 11 16:55 prometheus
3、添加RPM安装前、安装后、卸载前、卸载后执行脚本
4、执行fpm构建
[root@python1 prometheus]# fpm -f -s dir -t rpm -n prometheus -v 2.44.0 --iteration 1.el7 \
-C /opt/monitor/prometheus \
--prefix /opt/monitor/prometheus \ 
-p /tmp/ \
--description 'prometheus_2.44.0_rpm' \
--after-remove /opt/monitor/prometheus/remove_after.sh \
--before-remove /opt/monitor/prometheus/stop.sh \
--before-install /opt/monitor/prometheus/install_before.sh \
--after-install  /opt/monitor/prometheus/start.sh
Force flag given. Overwriting package at /tmp/prometheus-2.44.0-1.el7.x86_64.rpm {:level=>:warn}
Created package {:path=>"/tmp/prometheus-2.44.0-1.el7.x86_64.rpm"}
5、安装构建好的RPM包,如下图所示

四、验证构建的RPM包

shell 复制代码
[root@python2 ~]# rpm -K prometheus-2.44.0-1.el7.x86_64.rpm 
prometheus-2.44.0-1.el7.x86_64.rpm: sha1 md5 OK
[root@python2 ~]# rpm -qpi prometheus-2.44.0-1.el7.x86_64.rpm 
Name        : prometheus
Version     : 2.44.0
Release     : 1.el7
Architecture: x86_64
Install Date: (not installed)
Group       : default
Size        : 231295049
License     : unknown
Signature   : (none)
Source RPM  : prometheus-2.44.0-1.el7.src.rpm
Build Date  : Fri 11 Oct 2024 09:31:48 PM CST
Build Host  : python1
Relocations : /opt/monitor/prometheus 
Packager    : <root@python1>
Vendor      : none
URL         : http://example.com/no-uri-given
Summary     : prometheus_2.44.0_rpm
Description : prometheus_2.44.0_rpm
相关推荐
petaexpress12 分钟前
云存储的费用是多少?2024年最新价格表
运维·服务器·云存储·云存储的费用是多少·云存储的费用是多少最新·云存储费用
taolichao301 小时前
架设一台NFS服务器,按照要求配置
linux·运维·服务器
程序员yt1 小时前
2025秋招八股文--服务器篇
linux·运维·服务器·c++·后端·面试
2301_810730101 小时前
RHCSA基础命令整理1
linux·运维·服务器
稳重的大王1 小时前
如何使用 NetBak PC Agent 备份和恢复 Windows 计算机或服务器?
运维·服务器
纪伊路上盛名在1 小时前
服务器与服务器之间文件上传下载
运维·服务器
云围1 小时前
Soanrquber集成Gitlab 之 导入Gitlab项目
运维·ci/cd·gitlab·devops
lishing61 小时前
Linux驱动开发(2):第一个内核模块
linux·运维·驱动开发
从后端到QT2 小时前
ubuntu编译ffmpeg
linux·运维·ubuntu
IT-民工211102 小时前
LVS Nginx HAProxy的优缺点
运维·nginx·lvs