例子:
一、FPMapp开发定制公司工具进行打包
1. app开发定制公司更新软件源
yum update
- 1
2. 安装fpm模块依赖
yum -y install ruby rubygems ruby-devel
- 1
3. 更换rubygems仓库
- app开发定制公司查看当前源
gem source list
- 1
2. app开发定制公司更换阿里源
gem sources -a http://mirrors.aliyun.com/rubygems/
- 1
3. app开发定制公司移除原生源
gem sources --remove https://rubygems.org/
- 1
4. 安装fpm工具
gem install fpm
- 1
app开发定制公司可能会出现的问题:
原因:在centos7中yumapp开发定制公司最高支持到2.0.0,而fpm安装需要ruby支持到2.3.0
解决办法:
- 安装RAM密钥(二选一,app开发定制公司失败重复尝试)
命令一:
gpg2 --keyserver hkp://pool.sks-keyservers.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB
- 1
命令二:
command curl -sSL https://rvm.io/mpapis.asc | gpg2 --import -
- 1
command curl -sSL https://rvm.io/pkuczynski.asc | gpg2 --import -
- 1
- 安装RAM(app开发定制公司经常会失败,app开发定制公司重复尝试直到成功)
curl -L get.rvm.io | bash -s stable
- 1
- 更新配置文件
source /etc/profile.d/rvm.sh
- 1
- 查看可安装脚本
rvm list known | grep ruby
- 1
- 安装ruby 2.6
rvm install 2.6
- 1
- 查看当前ruby版本
ruby -v
- 1
5. 检查是否正确安装
fpm --help
- 1
6. fpm参数
常用参数
1.-s 指定源类型
2.-t 指定目标类型,即想要制作为什么包
3.-n 指定包的名字
4.-v 指定包的版本号
5.-C 指定打包的相对路径 Change directory to here before searchingforfiles
6.-d 指定依赖于哪些包
7.-f 第二次打包时目录下如果有同名安装包存在,则覆盖它
8.-p 输出的安装包的目录,不想放在当前目录下就需要指定
9.–post-install 软件包安装完成之后所要运行的脚本;同–after-install
10.–pre-install 软件包安装完成之前所要运行的脚本;同–before-install
11.–post-uninstall 软件包卸载完成之后所要运行的脚本;同–after-remove
12.–pre-uninstall 软件包卸载完成之前所要运行的脚本;同–before-remove
7. 安装软件
将源代码软件进行编译安装。具体看软件。建议将一个编译后的软件存放到指定地方。
8. 编写shell脚本
以Nginx为例子:
#!/bin/bash# 源码编译一般都要添加执行用户useradd nginx -M -s /sbin/nologin
- 1
- 2
- 3
- 4
- 5
9.打包
打包格式:
fpm -s 源文件类型 -t 目标文件类型 -n 打包后名称 -v 打包后版本号 -d 所需要依赖 --post-install 安装完后执行的脚本 -f 源文件地址
以Nginx为例子:
fpm -s dir -t rpm -n nginx -v 1.20.1 -d 'pcre-devel,openssl-devel' --post-install /root/rpm_building/ngnix_rpm.sh -f /opt/nginx/
- 1
参数说明:
1.-s 指定源类型
2.-t 指定目标类型,即想要制作为什么包
3.-n 指定包的名字
4.-v 指定包的版本号
5.-d 指定依赖于哪些包
6.-f 第二次打包时目录下如果有同名安装包存在,则覆盖它
7.–post-install 软件包安装完成之后所要运行的脚本;同–after-install
可能会出现的错误:
- Need executable ‘rpmbuild’ to convert dir to rpm {:level=>:error}
解决办法:安装rpm-build
yum install rpm-build -y
- 1
10.安装rpm包
方法一:rpm命令安装(离线麻烦)
使用rpm命令安装
rpm -ivh nginx-1.20.1-1.x86_64.rpm
- 1
这种方法直接安装会出现依赖错误,需要先 yum 或手动安装依赖才能安装 rpm 包。
方法二:yum命令安装(在线简单)
yum -y localinstall nginx-1.20.1-1.x86_64.rpm
- 1
这种方法会先安装依赖,再安装rpm包
11.注意点
- 测试centos7环境下编译的软件,在centos8下能运行;centos8下编译软件无法在centos7上运行。
二、原生rpmbuild打包rpm包
1.打包流程
- 源代码放到%_sourcedir中
- 源代码解压到%_builddir中,并进行编译
- 将编译好的软件安装到%_buildrootdir中
- 编写SPEC文件,并存放到其他目录
- 执行打包程序,将打包好的二进制rpm包存放在%_rpmdir中,源码rpm包文件存放在%_srcrpmdir中。
默认位置 | 宏代码 | 名称 | 用途 |
---|---|---|---|
~/rpmbuild | %_topdir | 工作空间目录 | 保存rpmbuild时的相关文件 |
~/rpmbuild/SPECS | %_specdir | Spec 文件目录 | 保存 RPM 包配置(.spec)文件 |
~/rpmbuild/SOURCES | %_sourcedir | 源代码目录 | 保存源码包(如 .tar 包)和所有 patch 补丁 |
~/rpmbuild/BUILD | %_builddir | 构建目录 | 源码包被解压至此,并在该目录的子目录完成编译 |
~/rpmbuild/BUILDROOT | %_buildrootdir | 最终安装目录 | 保存 %install 阶段安装的文件 |
~/rpmbuild/RPMS | %_rpmdir | 标准 RPM 包目录 | 生成/保存二进制 RPM 包 |
~/rpmbuild/SRPMS | %_srcrpmdir | 源代码 RPM 包目录 | 生成/保存源码 RPM 包(SRPM) |
源码rpm包和二进制rpm包区别:
- 源码rpm包运行后是出现源码文件,要运行程序还要进行make进行编译。打包原理:压缩源码文件目录,跟压缩包一样。
- 二进制rpm包解压后直接就可以运行文件。打包原理:先进行源码包的编译和安装,然后将安装好的文件进行打包。
2.SPEC文件
SPEC文件说明:
阶段 | 读取的目录 | 写入的目录 | 具体动作 |
---|---|---|---|
%prep | %_sourcedir | %_builddir | 读取位于%_sourcedir 目录的源代码和 patch。之后,解压源代码至%_builddir 的子目录并应用所有 patch。 |
%build | %_builddir | %_builddir | 编译位于%_builddir 构建目录下的文件。通过执行类似./configure && make 的命令实现。 |
%install | %_builddir | %_buildrootdir | 读取位于%_builddir 构建目录下的文件并将其安装至%_buildrootdir 目录。这些文件就是用户安装 RPM 后,最终得到的文件。注意一个奇怪的地方: 最终安装目录 不是 构建目录。通过执行类似make install 的命令实现。 |
%check | %_builddir | %_builddir | 检查软件是否正常运行。通过执行类似make test 的命令实现。很多软件包都不需要此步。 |
bin | %_buildrootdir | %_rpmdir | 读取位于%_buildrootdir 最终安装目录下的文件,以便最终在%_rpmdir 目录下创建 RPM 包。在该目录下,不同架构的 RPM 包会分别保存至不同子目录,noarch 目录保存适用于所有架构的 RPM 包。这些 RPM 文件就是用户最终安装的 RPM 包。 |
src | %_sourcedir | %_srcrpmdirb | 创建源码 RPM 包(简称 SRPM,以.src.rpm 作为后缀名),并保存至%_srcrpmdir 目录。SRPM 包通常用于审核和升级软件包。 |
3.宏定义文件
宏定义:
宏的格式–> %_topdir
宏表示一个变量,如环境变量。这个变量指向一个路径或者其他含义。
查找rpmbuild定义文件
rpmbuild --showrc | grep Macro
- 1
从这张图中看出很多地方都可以定义宏。
查询宏命令路径
rpmbuild --showrc | grep _mandir
- 1
常用宏文件的定义
%{_sysconfdir} /etc
%{_prefix} /usr
%{_exec_prefix} %{_prefix}
%{_bindir} %{_exec_prefix}/bin
%{_libdir} %{_exec_prefix}/%{_lib}
%{_libexecdir} %{_exec_prefix}/libexec
%{_sbindir} %{_exec_prefix}/sbin
%{_sharedstatedir} /var/lib
%{_datarootdir} %{_prefix}/share
%{_datadir} %{_datarootdir}
%{_includedir} %{_prefix}/include
%{_infodir} /usr/share/info
%{_mandir} /usr/share/man
%{_localstatedir} /var
%{_initddir} %{_sysconfdir}/rc.d/init.d
%{_var} /var
%{_tmppath} %{_var}/tmp
%{_usr} /usr
%{_usrsrc} %{_usr}/src
%{_lib} lib (lib64 on 64bit multilib systems)
%{_docdir} %{_datadir}/doc
%{buildroot} %{_buildrootdir}/%{name}-%{version}-%{release}.%{_arch}
$RPM_BUILD_ROOT %{buildroot}
4.安装rpmbuild工具
yum install rpm-build -y
- 1
5.建立工作路径
在家目录下分别创建rpmbuild/BUILD、rpmbuild/RPMS、rpmbuild/SOURCES、rpmbuild/SPECS、rpmbuild/SRPMS目录。
mkdir -p ~/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}
- 1
文件夹含义:
默认位置 | 宏代码 | 名称 | 用途 |
---|---|---|---|
~/rpmbuild | %_topdir | 工作空间目录 | 保存rpmbuild时的相关文件 |
~/rpmbuild/SPECS | %_specdir | Spec 文件目录 | 保存 RPM 包配置(.spec)文件 |
~/rpmbuild/SOURCES | %_sourcedir | 源代码目录 | 保存源码包(如 .tar 包)和所有 patch 补丁 |
~/rpmbuild/BUILD | %_builddir | 构建目录 | 源码包被解压至此,并在该目录的子目录完成编译 |
~/rpmbuild/BUILDROOT | %_buildrootdir | 最终安装目录 | 保存 %install 阶段安装的文件 |
~/rpmbuild/RPMS | %_rpmdir | 标准 RPM 包目录 | 生成/保存二进制 RPM 包 |
~/rpmbuild/SRPMS | %_srcrpmdir | 源代码 RPM 包目录 | 生成/保存源码 RPM 包(SRPM) |
6.下载源码
cd ~/rpmbuild/SOURCESwget http://ftp.gnu.org/gnu/hello/hello-2.10.tar.gz
- 1
- 2
7.编写SPEC文件
cd ~/rpmbuild/SPECSvim hello.spec
- 1
- 2
spec文件进去后会自动加载模板,模板初始样子如下:
编写好的文件如下:
# 软件名Name: hello# 版本号Version: 2.10# 发布编号Release: 1%{?dist}# 软件说明Summary: The "Hello World" program from GNUSummary(zh_CN): GUN "Hello Word" 程序# 包所属类别,但目前基本已经被弃用,直接删除即可Group: Applications/Productivity# 软件包的版权协议License: GPLv3+URL: http://ftp.gnu.org/gnu/helloSource0: http://ftp.gnu.org/gnu/hello/%{name}-%{version}.tar.gz# 编译需要的依赖BuildRequires: gettext# 本软件需要的依赖#Requires: # 安装后的依赖Requires(post): info# 卸载前的依赖Requires(preun): info# 描述%descriptionThe "Hello World" program, done with all bells and whistles of a proper FOSSproject, including configuration, build, internationalization, help files, etc.%description -l zh_CN"Hello World" 程序, 包含 FOSS 项目所需的所有部分, 包括配置, 构建, 国际化, 帮助文件等.%prep%setup -q# 编译阶段执行的命令%build%configuremake %{?_smp_mflags}# 安装阶段执行的命令%installmake install DESTDIR=%{buildroot}# 查找 install 中的语言文件%find_lang %{name}rm -f %{buildroot}/%{_infodir}/dir# 安装后执行的命令%post/sbin/install-info %{_infodir}/%{name}.info %{_infodir}/dir || :# 卸载前执行的命令%preunif [ $1 = 0 ] ; then/sbin/install-info --delete %{_infodir}/%{name}.info %{_infodir}/dir || :fi# 将所需要打包的文件都存放到这边中;-f %{name}.lang 加上后的意思为声明找到的文件%files -f %{name}.lang# doc添加的是说明文档%doc AUTHORS ChangeLog NEWS README THANKS TODO%license COPYING%{_mandir}/man1/hello.1.*%{_infodir}/hello.info.*%{_bindir}/hello# 软件更新说明%changelog* Sun Dec 4 2016 Your Name <youremail@xxx.xxx> - 2.10-1- Update to 2.10* Sat Dec 3 2016 Your Name <youremail@xxx.xxx> - 2.9-1- Update to 2.9
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
8.检查SPEC文件正确性
rpmlint hello.spec
- 1
9.构建rpm包
cd ~/rpmbuild/SPECSrpmbuild -ba hello.spec
- 1
- 2
查看下输出的内容:
tree ~/rpmbuild/*RPMS
- 1