用rpmbuild命令构建Nacos RPM包
环境准备与工具安装
# centos 7
# 这里默认服务器能连公网
# 安装epel和dnf工具
yum install epel-release -y
yum install dnf -y
# 安装rpmbuild安装工具和语法检查工具
dnf install -y rpmdevtools rpmlint
# 创建rpmbuild用户
useradd rpmbuild
# 设置rpmbuild用户密码
passwd rpmbuild
# 切换目录
cd /home/rpmbuild/
# 切换用户
su rpmbuild
# rpmbuild工作目录构建
rpmdev-setuptree
- 执行完目录构建命令后,会在/home/rpmbuild/目录下建立目录树:主要包括BUILD、RPMS、SOURCES、SPECS、SRPMS,BUILDROOT目录是打包过程中自动创建的
文件准备
github上下载nacos-server二进制tar包,这里选取2.0.3版本的
编写spec文件
spec文件用来定义软件包的构建和安装过程
- 建立nacos.spec文件
Name: nacos
Version: 2.0.3
Release: 1%{?dist}
Summary: Nacos Server
License: Apache-2.0
Url: https://nacos.io
Source0: nacos-server-%{version}.tar.gz
BuildRequires: java >= 1.8
Requires: java >= 1.8
Packager: lsd
%description
Nacos is an easy-to-use, high-performance, distributed configuration and service management platform.
# 解压等操作,这里声明了解压后的包名称(默认是nacos-版本号,但是解压后的包不带版本号,避免了打包过程的报错)
%prep
%setup -n nacos
# 编译,jar包不需要编译,这里只定义了并没有实际操作
%build
# 安装:nacos部署的安装较为简单,原tar.gz包已经是解压就可以直接用的,所以将文件复制到打包工作目录下就可以了
%install
rm -rf %{buildroot}
mkdir -p %{buildroot}/nacos
cp -a * %{buildroot}/nacos
# 定义需要包含的文件
%files
%defattr(-,root,root,0755)
# 这里选取了nacos包解压后对应目录下的文件
/nacos/conf/
/nacos/bin/
/nacos/NOTICE
/nacos/LICENSE
/nacos/target/
# 禁止rpmbuild去除文件的某些调试信息,rpmbuild默认去除文件的某些调试信息,并将某些调试信息生成到外部文件中
%define __debug_install_post \
%{_rpmconfigdir}/find-debuginfo.sh %{?_find_debuginfo_opts} "%{_builddir}/%{?buildsubdir}"\
%{nil}
# 重要:禁止rpmbuild对包中文件再进行压缩,strip等操作,原tar.gz包已经是解压就可以直接用的了,不需要再进行额外操作
%define __os_install_post %{nil}
%define __strip /bin/true
%pre
# 安装前可能需要的脚本,如检查依赖
%post
# 安装后可能需要的脚本,如启动服务
%preun
# 卸载前可能需要的脚本,如停止服务
%postun
# 卸载后可能需要的脚本,如清理资源
%changelog
- 文件中用到了部分宏,可以通过linux语句查询这些宏
rpmbuild --showrc | grep buildroot
打包
- 将下载的tar包上传至SOURCES目录下
- 将spec文件上传至SPECS文件夹下
# 检查spec文件语法错误
rpmlint /home/rpmbuild/rpmbuild/SPECS/nacos.spec
# 打包(主要用户不能为root)
rpmbuild -bb /home/rpmbuild/rpmbuild/SPECS/nacos.spec
- 执行命令后等待打包完成,正常完成后在RPMS/x86_64目录下可以找到nacos rpm安装包
注意事项
-
打包过程如果失败,在控制台会给出错误信息
-
在国产化系统中,当安装nacos服务需要打成rpm包时,如果在安装rpm包遇到以下错误,可以通过更换版本实现,经过测试当使用1.4.1版本nacos时,在国产化系统上可以正常启动
java.lang.UnsatisfiedLinkError: /tmp/librocksdbjni1957541708333078717.so: /tmp/librocksdbjni1957541708333078717.so:failed to map segment from shared object operation
- 该错误主要是因为高版本nacos在启动时产生了二进制可执行临时文件(librocksdbjni1957541708333078717.so),而国产化系统中当前使用的用户一般没有执行文件的权限