Centos/Redhat 封装RPM包/编译构建RPM包

Centos/Redhat 封装RPM包/编译构建RPM包

Centos/Redhat 封装RPM包/编译构建RPM包

接到一个项目需求,需要将 XXX 后台程序 封装成RPM 包,提供给客户进行安装。
不多解释,直接上教程。

安装需要用到的工具

yum -y install rpm-build
yum -y install rpmdevtools
yum -y install rpmlint

安装完成后,你会得到一个这样的目录
在这里插入图片描述

目录说明

默认位置宏代码名称用途
~/rpmbuild/SPECS%_specdirSpec 文件目录保存 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.

创建src.rpm包

rpmbuild -bs hello.spec

返回,已经生成rpm包了,我们试下我们封装的hello world 功能打进去了没有

Wrote: /root/rpmbuild/SRPMS/hello-0.0.1-1.el7.centos.src.rpm

创建二进制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包

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包的信息
确认rpm包已经被安装了
rpm -qa|grep hello

返回

hello-0.0.1-1.el7.centos.x86_64
查看rpm包的%changelog部分
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打包原理、示例、详解

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值