在这篇博文openstack软件包管理我已经介绍了下openstack打包原理最核心的原理和问题,但是并没有以实际的例子来介绍,因此这篇博文主要是通过cinder的spec文件来深入的讲解如何通过rpmbuild工具打出自己的版本,顺带对涉及到rpmbuild相关的知识做讲解,本次博文的主要笔记直接记录在spec文件里中。
我的rpmbuild的测试环境:
RPM 版本 4.11.3
rpmbuild构建路径采用默认值,具体如下
%_topdir %{getenv:HOME}/rpmbuild
%_rpmdir %{_topdir}/RPMS
%_sourcedir %{_topdir}/SOURCES
%_specdir %{_topdir}/SPECS
%_srcrpmdir %{_topdir}/SRPMS
%_buildrootdir %{_topdir}/BUILDROOT
%buildroot %{_buildrootdir}/%{name}-%{version}-%{release}.%{_arch}
关于如何配置自定义的宏环境,可以参考rpm 宏定义。
将下面的cinder.spec放入~/rpmbuild/SPECS/
将spec用到的source原文件(tarball、patch文件、控制脚本等)手动拷贝到~/rpmbuild/SOURCES
执行打包编译
rpmbuild -ba ~/rpmbuild/SPECS/
-ba:打源码包和二进制包
-bb:只构建二进制包
何为打源码包?生成在SRPMS下面的.src.rpm包
何为二进制包?生成在RPMS下面的.rpm包
其他的可以通过rpmbuild --help自行查看
生成的.rpm包在~/rpmbuild/RPMS/
生成的.src.rpm包在~/rpmbuild/SRPMS/
最终生成的包有:
openstack-cinder-7.0.0-123.el7.centos.noarch.rpm
python-cinder-7.0.0-1.el7.centos.noarch.rpm
openstack-cinder-7.0.0-1.el7.centos.src.rpm
包名称的构成:{Name}-{Version}-{Release}.{BuildArch}.rpm or .src.rpm
下面就是cinder.spec的内容,里面带有每个关键点的解释。
%global with_doc %{!?_without_doc:1}%{?_without_doc:0} %global pypi_name cinder %global release_name liberty #global是用来定义一些全局变量,变量的反问语法是%{},如果是%{?},则表示变量如果有定义才取值 %{!?upstream_version: %global upstream_version %{version}%{?milestone}} Name: openstack-cinder #打出来的rpm包的名字 # Liberty semver reset # https://review.openstack.org/#/q/I6a35fa0dda798fad93b804d00a46af80f08d475c,n,z Epoch: 1 Version: 7.0.0 Release: 123%{?milestone}%{?dist} #dist的值在/etc/rpm/macros.dist里面定义:%dist .el7.centos Summary: OpenStack Volume service License: ASL 2.0 URL: http://www.openstack.org/software/openstack-storage/ Source0: http://tarballs.openstack.org/%{pypi_name}/%{pypi_name}-%{upstream_version}.tar.gz #源码包下载路径,这里目前我没看到rpmbuild有相关参数可以控制自动下,我的做法是:1、手动打执行版本的tarball,将其拷贝到SOURCES下。2、通过spectool工具来自动下载 #如果是自己手动打的tarball,最好要通过python标准的打包方式:python setup.py sdist来发布,否则会涉及到解压出来的发布软件包的版本问题. #下面这些都是原来打包进rpm包的配置和systemd的控制文件 Source1: cinder-dist.conf Source2: cinder.logrotate Source3: cinder-tgt.conf Source10: openstack-cinder-api.service Source11: openstack-cinder-scheduler.service Source12: openstack-cinder-volume.service Source13: openstack-cinder-backup.service Source20: cinder-sudoers BuildArch: noarch #以BuildRequires定义的包是指在python setup.py build编译的时候需要用到的依赖 BuildRequires: intltool BuildRequires: python-d2to1 BuildRequires: python-oslo-sphinx BuildRequires: python-pbr BuildRequires: python-sphinx BuildRequires: python2-devel BuildRequires: python-setuptools BuildRequires: python-netaddr BuildRequires: systemd BuildRequires: git BuildRequires: os-brick BuildRequires: python-oslo-concurrency BuildRequires: python-oslo-messaging BuildRequires: python-oslo-service # Required to build cinder.conf BuildRequires: python-keystonemiddleware BuildRequires: python-glanceclient BuildRequires: python-novaclient BuildRequires: python-swiftclient BuildRequires: python-oslo-db BuildRequires: python-oslo-config >= 2:1.11.0 BuildRequires: python-oslo-policy BuildRequires: python-oslo-reports BuildRequires: python-oslotest BuildRequires: python-oslo-versionedobjects BuildRequires: python-oslo-vmware BuildRequires: python-crypto BuildRequires: python-lxml BuildRequires: python-osprofiler BuildRequires: python-paramiko BuildRequires: python-suds BuildRequires: python-taskflow #以Requires定义的包是指在安装rpm包的时候依赖或者说对python来说就是指:python setup.py install Requires: openstack-utils Requires: python-cinder = %{epoch}:%{version}-%{release} # we dropped the patch to remove PBR for Delorean Requires: python-pbr # as convenience Requires: python-cinderclient Requires(post): systemd Requires(preun): systemd Requires(postun): systemd Requires(pre): shadow-utils Requires: lvm2 Requires: python-osprofiler Requires: python-rtslib #这是默认包即openstack-cinder包的描述