赞
踩
Centos/Redhat 封装RPM包/编译构建RPM包
接到一个项目需求,需要将 XXX 后台程序 封装成RPM 包,提供给客户进行安装。
不多解释,直接上教程。
安装需要用到的工具
yum -y install rpm-build
yum -y install rpmdevtools
yum -y install rpmlint
安装完成后,你会得到一个这样的目录
默认位置 | 宏代码 | 名称 | 用途 |
---|---|---|---|
~/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) |
不废话,直接操作
cd ~/rpmbuild/SOURCES
wget http://ftp.gnu.org/gnu/hello/hello-2.10.tar.gz
我们测试增加一个功能,然后重新打包编译
cd ~/rpmbuild/SOURCES
tar -xf hello-2.10.tar.gz
cd hello-2.10
cat >> hello.sh << EOF
> #!/bin/bash
> echo "hello,world"
> EOF
cat hello.sh
#!/bin/bash
echo “hello,world”
这个脚本,就是我们新更新的内容,我们要重新把这个hello 绿色安装包,编译成rpm安装包
继续,我要编译出第一代 hello-0.0.1.rpm 了
mv hello.sh hello-2.10
mv hello-2.10 hello-0.0.1
tar -czvf hello-0.0.1.tar.gz hello-0.0.1
编辑配置文件
cd ~/rpmbuild/SPEC
vim hello.spec
#软件包的名称,应该和.spec 文件的文件名一致。(.spec 文件中必须包括) Name:hello #软件包的版本号。若是开源软件,则版本号需要与上游代码的版本号一致。(.spec 文件中必须包括) Version:0.0.1 #发布序列号,标明第几次打包,根据自己发布该包的版本来写,每次进行新发布要增加 1。(.spec 文件中必须包括) Release:1%{?dist} #软件包的简介,要用简洁的语言对软件包进行描述,结尾不要有标点。如果是来自 github 的项目,Summary 可以直接用 github 项目中的 description。(.spec 文件中必须包括) Summary:HELLO TEST BUILD RPM #软件包的中文简介,与 Summary 意义一样。(.spec 文件中可以不包括) Summary(zh_CN):中文测试编译rpm包 #软件许可证。(.spec 文件中必需包括) License:GPL #项目网址。为了保持一致性,请使用%{name}的 RPM 宏变量,并使用 https://example.com/%{name}。(spec 文件中必须包括) URL:http://ftp.gnu.org/gnu/%{name} #源码包的路径,最好填写可以获取到包中源码的 url。同样,发行版本也可以更改。为了简化这些潜在的将来更改,请使用%{name}和%{version}宏。 #通过使用这些,只需要更新 .spec 文件中的一个字段。如果有多个,可以添加更多SourceX 指令,每次增加数量,例如:Source1、Source2、Source3 等。(.spec 文件中必须包括) Source0:%{name}-%{version}.tar.gz #编译时需要的依赖。(.spec 文件中不必须包括,需要视具体情况而定) BuildRequires:gettext #安装时需要的依赖。(.spec 文件中不必须包括,需要视具体情况而定) Requires: bash #软件包的详细说明。(.spec 文件中必须包括) %description This is the GNU Hello distribution.Hello prints a friendly greeting. It also serves as a sample GNU package, showing practices that may be useful for GNU projects. #预处理脚本,可用于准备构建和编译的环境。一般来说这里进行 的 操 作 , 都 是 将 %_sourcedir 目 录 下 的 源 代 码 解 压到%_builddir 目录下、给解压好的代码打补丁、为接下来的操作做准备等。(.spec 文件中必须包括) %prep %setup -q #源码编译阶段,将通过直接调用源码目录中自动构建工具在%_builddir 目录下完成源码编译操作, 比如编译 C 工程的configure,make 等操作。(.spec 文件中必须包括) %build %configure make %{?_smp_mflags} #预 安 装 阶 段 , 将 需 要 打 包 到 rpm 软 件 包 里 的 文 件从%_builddir 目录下下拷贝到%buildroot 目录下。 #当用户用rpm -ivh name-version.rpm 安装软件包时,这些文件会安装到用户系统中相应的目录里。(.spec 文件中必须包括) %install rm -rf $RPM_BUILD_ROOT mkdir -p $RPM_BUILD_ROOT/%{_bindir} cp %{name}.sh $RPM_BUILD_ROOT/%{_bindir} #列出需要打包的文件和目录。即本 RPM 包中的文件最终会被装到用户电脑上的文件的列表,以及这些文件的完整路径。(.spec 文件中必须包括) %files %{_bindir}/%{name}.sh #列出需要打包的文件和目录。即本 RPM 包中的文件最终会被装到用户电脑上的文件的列表,以及这些文件的完整路径。(.spec 文件中必须包括) %check #RPM 安装前执行的脚本。(.spec 文件中可以不包括) %pre #RPM 安装后执行的脚本。(.spec 文件中可以不包括) %post #RPM 卸载前执行的脚本。(.spec 文件中可以不包括) %preun #RPM 卸载前执行的脚本。(.spec 文件中可以不包括) %postun #标签应包含每个 Release 所做的更改日志,如对软件打了新的补丁、构建过程变动等,尤其应包含上游的安全/漏洞补丁的说明。 #每个版本变动可以包含多个变动条目,每个条目以一个 - 开头。(.spec文件中必须包括) %changelog * Sat Jun 18 2022 peter - update xxxxx xxxxx #清理临时文件,编译后的清理工作,这里可以执行 make clean以及清空%_buildroot 目录等。(.spec 文件中必须包括) %clean rm -rf $RPM_BUILD_ROOT
检查配置文件
rpmlint hello.spec
返回,只要没有ERROR不用管,W 是警告的意思
hello.spec:19: W: macro-in-comment %{name}
hello.spec:19: W: macro-in-comment %{name}
hello.spec:22: W: macro-in-comment %{name}
hello.spec:22: W: macro-in-comment %{version}
hello.spec:38: W: macro-in-comment %_sourcedir
hello.spec:38: W: macro-in-comment %_builddir
hello.spec:42: W: macro-in-comment %_builddir
hello.spec:47: W: macro-in-comment %_builddir
hello.spec:47: W: macro-in-comment %buildroot
hello.spec:80: W: macro-in-%changelog %_buildroot
hello.spec:80: W: macro-in-comment %_buildroot
hello.spec: W: invalid-url Source0: hello-0.0.1.tar.gz
0 packages and 1 specfiles checked; 0 errors, 12 warnings.
rpmbuild -bs hello.spec
返回,已经生成rpm包了,我们试下我们封装的hello world 功能打进去了没有
Wrote: /root/rpmbuild/SRPMS/hello-0.0.1-1.el7.centos.src.rpm
rpmbuild -bb hello.spec
返回
...
...
Wrote: /root/rpmbuild/RPMS/x86_64/hello-0.0.1-1.el7.centos.x86_64.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/hello-debuginfo-0.0.1-1.el7.centos.x86_64.rpm
Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.abrKNj
+ umask 022
+ cd /root/rpmbuild/BUILD
+ cd hello-0.0.1
+ rm -rf /root/rpmbuild/BUILDROOT/hello-0.0.1-1.el7.centos.x86_64
+ exit 0
看起来没什么问题。
rpm -ivh /root/rpmbuild/RPMS/x86_64/hello-0.0.1-1.el7.centos.x86_64.rpm
返回
Preparing... ################################# [100%]
Updating / installing...
1:hello-0.0.1-1.el7.centos ################################# [100%]
rpm -qa|grep hello
返回
hello-0.0.1-1.el7.centos.x86_64
rpm -q hello --changelog
返回,确实返回了我们自定义的内容
Sat Jun 18 2022 peter
- update xxxxx xxxxx
查看rpm包包含什么内容
rpm -ql hello
返回
/usr/bin/hello.sh
执行这个脚本
/usr/bin/hello.sh
返回
hello,world
参考资料:
RPM打包原理、示例、详解
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。