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
相关推荐
翻斗包菜16 分钟前
Nginx 四大核心功能实战:正向代理 + 反向代理 + 缓存 + Rewrite 正则
运维·nginx·缓存
阿望要努力上研究生24 分钟前
Docker入门常用指令和Docker概念
运维·docker·容器
蜜獾云26 分钟前
从linux内核理解Java怎样实现Socket通信
java·linux·运维
战南诚29 分钟前
docker的使用技巧
运维·docker·容器
pupudawang40 分钟前
使用 Nginx 搭建代理服务器(正向代理 HTTPS 网站)指南
运维·nginx·https
痴心阿文1 小时前
Nextjs用法整理
运维·服务器
getapi1 小时前
FinalShell 连接 CentOS 7 文件管理失败修复教程
linux·运维·centos
小峰编程2 小时前
二进制安装Nginx——详细
linux·运维·服务器·nginx·云原生
刚入坑的新人编程2 小时前
Linux-cgdb
linux·运维·服务器
九硕智慧建筑一体化厂家2 小时前
什么是楼宇自控?全面解析楼宇自控与楼宇自控系统的作用
大数据·运维·人工智能·网络协议·制造