当前位置:   article > 正文

Centos/Redhat 封装RPM包/编译构建RPM包_rebuildrpm 构建新的rpm包

rebuildrpm 构建新的rpm包

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

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

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

安装需要用到的工具

yum -y install rpm-build
yum -y install rpmdevtools
yum -y install rpmlint
  • 1
  • 2
  • 3

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

目录说明

默认位置宏代码名称用途
~/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
  • 1
  • 2

我们测试增加一个功能,然后重新打包编译

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

#!/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
  • 1
  • 2
  • 3

编辑配置文件

cd ~/rpmbuild/SPEC
vim hello.spec
  • 1
  • 2

更多参数更详细的参考说明(第一次最好是复制粘贴)

#软件包的名称,应该和.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
  • 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
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82

检查配置文件

rpmlint hello.spec
  • 1

返回,只要没有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.
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

创建src.rpm包

rpmbuild -bs hello.spec
  • 1

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

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

创建二进制rpm包

rpmbuild -bb hello.spec
  • 1

返回

...
...
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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

看起来没什么问题。

安装rpm包

rpm -ivh /root/rpmbuild/RPMS/x86_64/hello-0.0.1-1.el7.centos.x86_64.rpm
  • 1

返回

Preparing...                          ################################# [100%]
Updating / installing...
   1:hello-0.0.1-1.el7.centos         ################################# [100%]
  • 1
  • 2
  • 3
查看RPM包的信息
确认rpm包已经被安装了
rpm -qa|grep hello
  • 1

返回

hello-0.0.1-1.el7.centos.x86_64
  • 1
查看rpm包的%changelog部分
rpm -q hello --changelog
  • 1

返回,确实返回了我们自定义的内容

 Sat Jun 18 2022 peter
- update xxxxx xxxxx
  • 1
  • 2

查看rpm包包含什么内容

rpm -ql hello
  • 1

返回

/usr/bin/hello.sh
  • 1

执行这个脚本

/usr/bin/hello.sh
  • 1

返回

hello,world
  • 1

参考资料:
RPM打包原理、示例、详解

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/468991
推荐阅读
相关标签
  

闽ICP备14008679号