文章目录
一、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