由于fpm采用Ruby语言开发,因此在使用之前需要先在您的虚拟机上安装Ruby环境。
Ruby环境需要安装:ruby-devel、gcc、make、rpm-build、rubygems、ruby共6个包。命令如下:
联网环境:
yum -y install ruby-devel gcc make rpm-build rubygems ruby
非联网环境,需要在有网络的地方使用repotrack下载全量的安装包,具体使用可以参考这篇文章:linux在非联网、无网络环境下,使用yumdownload、reportrack方法安装rpm包。以下是安装命令:
repotrack --download_path=/opt/temp/ ruby-devel gcc make rpm-build rubygems ruby
该命令的解释如下:
1 repotrack 是一个 Linux 命令行工具,它使用 YUM 源配置文件中的信息,能够将指定的 RPM 包及其依赖关系下载到本地硬盘。
2 --download_path=/opt/temp/ 参数指定了将 RPM 存储的位置为 /opt/temp/ 目录。
3 ruby-devel、gcc、make、rpm-build、rubygems、ruby 是要下载的 RPM 包的名称,它们是 Ruby 语言和其开发的编译环境,用于在 Linux 上运行和构建 Ruby 代码和应用程序。
下载完压缩包后,将全部的压缩包上传到虚拟机,并使用以下命令进行安装:
rpm -Uvh *.rpm --force --nodeps
安装完ruby,就可以使用gem命令了。下面需要安装fpm。
首先,在有网络的地方使用,下载和fpm相关的依赖
gem install fpm
下载完成后,使用以下命令,寻找刚才下载fpm的依赖:
gem environment
通过上图可以看到,依赖存在了/usr/local/share/gems/cache的位置,这个位置可能不固定,但肯定存在于以下三个位置:
- GEM PATHS:
- /usr/local/share/gems
- /root/.gem/ruby
- /usr/share/gems
找到cache文件夹后,将文件夹内的gem文件上传到无法联网的虚拟机上,然后通过gem的–local,进行安装,
gem install --local xxx
上文提到过:cache安装的位置不固定,在内网虚拟机中,cache文件夹的位置变为/usr/share/gems,故执行:
gem install --local /usr/share/gems/cache/*.gem
注意:该命令不一定能将安装包,全部安装成功。因为安装文件之间可能存在依赖关系,剩下未安装成功的文件,需要使用local命令,手动安装。
gem install --local /usr/share/gems/cache/安装包的名字
在fpm安装过程中,就存在这个关系,建议将:
gem install --local /usr/share/gems/cache/pleaserun-0.0.32.gem
gem install --local /usr/share/gems/cache/fpm-1.15.1.gem
这两个文件最后安装即可。全部安装后,可能会出现以下错误:
backports-3.24.1/lib/backports/ractor/cloner.rb:36:in `private': nil is not a symbol (TypeError)
解决方案在:
backports-3.24.1/lib/backports/ractor/cloner.rb:36:in ‘private‘: nil is not a symbol(TypeError)的解决方案
fpm 是一个易于使用的打包工具,只需提供相应的参数值,即可完成打包操作,支持rpm和deb两种主流包格式,这样便可以使用相同的方式在不同的平台下进行打包。
首先,了解下fpm支持的命令参数:
FPM常用参数:
-s:指定源类型
-t:指定目标类型,即想要制作为什么包
-n:指定包的名字
-v:指定包的版本号
-C:指定打包的相对路径
-d:指定依赖于哪些包
-f:第二次包时目录下如果有同名安装包存在,则覆盖它;
-p:制作的rpm安装包存放路径,不想放在当前目录下就需要指定;
–post-install:软件包安装完成之后所要运行的脚本;同–offer-install
–pre-install:软件包安装完成之前所要运行的脚本;同–before-install
–post-uninstall:软件包卸载完成之后所要运行的脚本;同–offer-remove
–pre-uninstall:软件包卸载完成之前所要运行的脚本;同—before-remove
–prefix:制作好的rpm包默认安装路径;
支持的源类型包:
dir: 将目录打包成所需要的类型,可以用于源码编译安装的软件包
rpm: 对rpm进行转换
gem: 对rubygem包进行转换
python: 将Python模块打包成相应的类型
支持的目标类型包:
rpm: 转换为rpm包
deb: 转换为deb包
solaris: 转换为solaris包
puppet: 转换为puppet包
网上可以查到与 fpm 相关的资料。一些参数可能在最新的 fpm 版本中被标记为不推荐使用。如果要了解最新的命令参数,请使用 fpm --help
命令查看相关帮助。
fpm -help
本案例以生成rmp包为例:首先我们需要建立3个目录,和一个shell文件,如下:
具体文件存放情况,如下图所示:
使用fpm打包后,安装的原理,就是将data下的所有文件和文件夹释放到安装目录下。
rpm_install_after.sh该脚本会在rpm安装成功后执行,脚本具体内容如下:
#!/bin/bash
file_path="/usr/fpmFirstDemo/test.txt"
if [ -e "$file_path" ]; then
echo "安装成功"
else
echo "安装失败"
fi
解释如下:
脚本中,定义了一个字符串类型的变量 file_path,它的值是 /usr/fpmFirstDemo/test.txt。
然后使用条件语句,判断文件路径所代表的文件是否存在。
条件语句中的 -e 参数表示测试文件是否存在。
如果文件存在,则输出 安装成功;否则输出 安装失败。
rpm_uninstall_after.sh该脚本会在rpm卸载成功后执行,脚本内容如下:
#!/bin/bash
rm -r /usr/fpmFirstDemo
file_path="/usr/fpmFirstDemo"
if [ -d "$file_path" ]; then
echo "卸载失败"
else
echo "卸载成功"
fi
注意:上述判断条件为文件夹。
解释如下:
脚本中,执行删除目录命令 rm -r /usr/fpmFirstDemo,删除 /usr/fpmFirstDemo 目录及其下的所有文件。
然后定义了一个字符串类型的变量 file_path,它的值是 /usr/fpmFirstDemo。
接下来使用条件语句,判断文件路径所代表的目录是否存在。
条件语句中的 -d 参数表示测试目录是否存在。
如果目录存在,则输出 卸载失败;否则输出 卸载成功。
testRpm.sh中存放了fpm的打包命令,由于fpm的命令比较长,所以个人习惯放在一个sh文件中。脚本内容如下:
fpm -s dir -t rpm -n mytest -v 1.0.0 --iteration 1 -C data -f -p output --prefix /usr/fpmFirstDemo --after-install sh/rpm_install_after.sh --after-remove sh/rpm_uninstall_after.sh
下面是对每个选项的解释:
-s dir: 指定源类型为目录。这表示我们将指定一个目录作为软件包的源。
-t rpm: 指定目标类型为RPM。这表示我们将构建一个RPM格式的软件包。
-n mytest: 指定软件包的名称为"mytest"。这将是生成的RPM包的名称。
-v 1.0.0: 指定软件包的版本号为"1.0.0"。
--iteration 1: 指定软件包的迭代版本号为"1"。迭代版本号通常用于区分同一版本的多个构建。
-C data: 指定需要打包的源目录为"data"。这里的"data"是相对于当前目录的一个子目录。
-f: 强制覆盖现有的输出文件。
-p output: 指定输出文件的路径和名称前缀为"output"。
--prefix /usr/fpmFirstDemo: 指定软件包文件系统层次结构中的目录前缀为"/usr/fpmFirstDemo"。软件包将会在该目录下创建对应的文件结构。
--after-install sh/rpm_install_after.sh: 指定安装软件包后执行的脚本为"sh/rpm_install_after.sh"。
--after-remove sh/rpm_uninstall_after.sh: 指定卸载软件包后执行的脚本为"sh/rpm_uninstall_after.sh"。
这个命令的目标是使用目录中的数据构建一个名为"mytest"的RPM软件包,版本号为1.0.0,迭代版本号为1。构建完成后,输出的RPM包文件将以"output"为前缀,并且在安装和卸载软件包时会执行指定的安装后和卸载后脚本。
进入fpmFirstDemo目录:
cd /opt/fpmFirstDemo
输入如下命令,执行testRpm.sh脚本,使用脚本中的fpm命令将data文件夹下的文件,打包为RPM:
sh testRpm.sh
最后,打包生成的RPM文件在output目录下。如下图所示:
RPM包的组成格式解释如下:
mytest :软件名称
1.0.0 :软件版本号
1 :发布号主要是对软件存在的bug或漏洞进行修补,在软件功能上并没有变化
x86_64 :指64位的PC架构,另外还有'i386' 'i686' 等32位的PC架构
rpm :扩展名
(1)首先,测试RPM的安装,使用-i命令:
cd /opt/fpmFirstDemo/output
rpm -i mytest-1.0.0-1.x86_64.rpm
上图显示安装成功,并且在/usr/fpmFirstDemo指定位置生成了test文件
(2)然后,测试RPM卸载。此时使用的软件包名mytest,就是打包时,通过-n参数指定的名称。
rpm -e mytest
来到usr发现整个fpmFirstDemo文件夹已经删除,卸载成功!
注:无论是修改了rpm_uninstall_after.sh、rpm_uninstall_after.sh文件,都要重新执行一次fpm打包命令。
sh testRpm.sh