深入openstack rpm打包原理(openstack cinder rpm打包完全分析)

来源:互联网 发布:qq邮箱smtp设置 端口 编辑:程序博客网 时间:2024/05/20 18:20

在这篇博文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,zEpoch:            1Version:          7.0.0Release:          123%{?milestone}%{?dist}
#dist的值在/etc/rpm/macros.dist里面定义:%dist .el7.centosSummary:          OpenStack Volume serviceLicense:          ASL 2.0URL:              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.confSource2:          cinder.logrotateSource3:          cinder-tgt.confSource10:         openstack-cinder-api.serviceSource11:         openstack-cinder-scheduler.serviceSource12:         openstack-cinder-volume.serviceSource13:         openstack-cinder-backup.serviceSource20:         cinder-sudoersBuildArch:        noarch
#以BuildRequires定义的包是指在python setup.py build编译的时候需要用到的依赖BuildRequires:    intltoolBuildRequires:    python-d2to1BuildRequires:    python-oslo-sphinxBuildRequires:    python-pbrBuildRequires:    python-sphinxBuildRequires:    python2-develBuildRequires:    python-setuptoolsBuildRequires:    python-netaddrBuildRequires:    systemdBuildRequires:    gitBuildRequires:    os-brickBuildRequires:    python-oslo-concurrencyBuildRequires:    python-oslo-messagingBuildRequires:    python-oslo-service# Required to build cinder.confBuildRequires:    python-keystonemiddlewareBuildRequires:    python-glanceclientBuildRequires:    python-novaclientBuildRequires:    python-swiftclientBuildRequires:    python-oslo-dbBuildRequires:    python-oslo-config >= 2:1.11.0BuildRequires:    python-oslo-policyBuildRequires:    python-oslo-reportsBuildRequires:    python-oslotestBuildRequires:    python-oslo-versionedobjectsBuildRequires:    python-oslo-vmwareBuildRequires:    python-cryptoBuildRequires:    python-lxmlBuildRequires:    python-osprofilerBuildRequires:    python-paramikoBuildRequires:    python-sudsBuildRequires:    python-taskflow#以Requires定义的包是指在安装rpm包的时候依赖或者说对python来说就是指:python setup.py installRequires:         openstack-utilsRequires:         python-cinder = %{epoch}:%{version}-%{release}# we dropped the patch to remove PBR for DeloreanRequires:         python-pbr# as convenienceRequires:         python-cinderclientRequires(post):   systemdRequires(preun):  systemdRequires(postun): systemdRequires(pre):    shadow-utilsRequires:         lvm2Requires:         python-osprofilerRequires:         python-rtslib
#这是默认包即openstack-cinder包的描述%descriptionOpenStack Volume (codename Cinder) provides services to manage andaccess block storage volumes for use by Virtual Machine instances.#这里是指定义一个新的包,包名为python-cinder,所有关于这个包的信息,依赖都在这个字段下面书写%package -n       python-cinderSummary:          OpenStack Volume Python librariesGroup:            Applications/SystemRequires:         sudoRequires:         MySQL-pythonRequires:         qemu-imgRequires:         sysfsutilsRequires:         os-brickRequires:         python-paramikoRequires:         python-qpidRequires:         python-kombuRequires:         python-amqplibRequires:         python-eventletRequires:         python-greenletRequires:         python-iso8601Requires:         python-netaddrRequires:         python-lxmlRequires:         python-anyjsonRequires:         python-cheetahRequires:         python-stevedoreRequires:         python-sudsRequires:         python-sqlalchemyRequires:         python-migrateRequires:         python-paste-deployRequires:         python-routesRequires:         python-webobRequires:         python-glanceclient >= 1:0Requires:         python-swiftclient >= 1.2Requires:         python-keystoneclientRequires:         python-novaclient >= 1:2.15Requires:         python-oslo-config >= 1:1.2.0Requires:         python-oslo-db >= 1.0.0Requires:         python-six >= 1.5.0Requires:         python-psutil >= 1.1.1Requires:         python-babelRequires:         python-lockfileRequires:         python-jinja2Requires:         python-oslo-rootwrapRequires:         python-oslo-utilsRequires:         python-oslo-serializationRequires:         python-oslo-dbRequires:         python-oslo-contextRequires:         python-oslo-concurrencyRequires:         python-oslo-middlewareRequires:         python-taskflow >= 0.7.1Requires:         python-oslo-messaging >= 1.8.0Requires:         python-keystonemiddleware >= 1.5.0Requires:         python-oslo-reportsRequires:         python-oslo-serviceRequires:         python-oslo-versionedobjectsRequires:         libcgroup-toolsRequires:         iscsi-initiator-utilsRequires:         python-osprofiler
#新包python-cinder的描述%description -n   python-cinderOpenStack Volume (codename Cinder) provides services to manage andaccess block storage volumes for use by Virtual Machine instances.This package contains the cinder Python library.#spec语法的逻辑控制块,如果定义with_doc,则会打出一个doc包%if 0%{?with_doc}%package docSummary:          Documentation for OpenStack VolumeGroup:            DocumentationRequires:         %{name} = %{epoch}:%{version}-%{release}BuildRequires:    graphviz# Required to build module documentsBuildRequires:    python-eventletBuildRequires:    python-routesBuildRequires:    python-sqlalchemyBuildRequires:    python-webob# while not strictly required, quiets the build down when building docs.BuildRequires:    python-migrate, python-iso8601%description      docOpenStack Volume (codename Cinder) provides services to manage andaccess block storage volumes for use by Virtual Machine instances.This package contains documentation files for cinder.%endif
#到这里关于包的定义,描述都结束,接下来就是开始编译前准备,做的事无非就是将源码包解压在BUILD构建
#目录下,再通过一些扩展宏对构建包做一些处理,比如将其初始化为一个git仓库。%prep%autosetup -n cinder-%{upstream_version} -S git#autosetup是rpm替代setup的宏,相关用法参考rpm宏定义及openstack软件包管理
#这段相当于直接执行shell的脚本find . \( -name .gitignore -o -name .placeholder \) -deletefind cinder -name \*.py -exec sed -i '/\/usr\/bin\/env python/{d;q}' {} +# Remove the requirements file so that pbr hooks don't add it# to distutils requires_dist configrm -rf {test-,}requirements.txt tools/{pip,test}-requires#开始build阶段,先设置PYTHONPAHT,再执行build动作%build# Generate config filePYTHONPATH=. tools/config/generate_sample.sh from_tox%{__python2} setup.py build#安装rpm的时候执行的动作%install%{__python2} setup.py install -O1 --skip-build --root %{buildroot}#下面这些动作都是rpm安装的时候做的事,装完源代码之后还会做一些系统环境相关的配置# docs generation requires everything to be installed firstexport PYTHONPATH="$( pwd ):$PYTHONPATH"pushd doc%if 0%{?with_doc}SPHINX_DEBUG=1 sphinx-build -b html source build/html# Fix hidden-file-or-dir warningsrm -fr build/html/.doctrees build/html/.buildinfo%endif# Create dir link to avoid a sphinx-build exceptionmkdir -p build/man/.doctrees/ln -s .  build/man/.doctrees/manSPHINX_DEBUG=1 sphinx-build -b man -c source source/man build/manmkdir -p %{buildroot}%{_mandir}/man1install -p -D -m 644 build/man/*.1 %{buildroot}%{_mandir}/man1/popd# Setup directoriesinstall -d -m 755 %{buildroot}%{_sharedstatedir}/cinderinstall -d -m 755 %{buildroot}%{_sharedstatedir}/cinder/tmpinstall -d -m 755 %{buildroot}%{_localstatedir}/log/cinder# Install config filesinstall -d -m 755 %{buildroot}%{_sysconfdir}/cinderinstall -p -D -m 640 %{SOURCE1} %{buildroot}%{_datadir}/cinder/cinder-dist.confinstall -d -m 755 %{buildroot}%{_sysconfdir}/cinder/volumesinstall -p -D -m 644 %{SOURCE3} %{buildroot}%{_sysconfdir}/tgt/conf.d/cinder.confinstall -p -D -m 640 etc/cinder/rootwrap.conf %{buildroot}%{_sysconfdir}/cinder/rootwrap.confinstall -p -D -m 640 etc/cinder/api-paste.ini %{buildroot}%{_sysconfdir}/cinder/api-paste.iniinstall -p -D -m 640 etc/cinder/policy.json %{buildroot}%{_sysconfdir}/cinder/policy.jsoninstall -p -D -m 640 etc/cinder/cinder.conf.sample %{buildroot}%{_sysconfdir}/cinder/cinder.conf# Install initscripts for servicesinstall -p -D -m 644 %{SOURCE10} %{buildroot}%{_unitdir}/openstack-cinder-api.serviceinstall -p -D -m 644 %{SOURCE11} %{buildroot}%{_unitdir}/openstack-cinder-scheduler.serviceinstall -p -D -m 644 %{SOURCE12} %{buildroot}%{_unitdir}/openstack-cinder-volume.serviceinstall -p -D -m 644 %{SOURCE13} %{buildroot}%{_unitdir}/openstack-cinder-backup.service# Install sudoersinstall -p -D -m 440 %{SOURCE20} %{buildroot}%{_sysconfdir}/sudoers.d/cinder# Install logrotateinstall -p -D -m 644 %{SOURCE2} %{buildroot}%{_sysconfdir}/logrotate.d/openstack-cinder# Install pid directoryinstall -d -m 755 %{buildroot}%{_localstatedir}/run/cinder# Install rootwrap files in /usr/share/cinder/rootwrapmkdir -p %{buildroot}%{_datarootdir}/cinder/rootwrap/install -p -D -m 644 etc/cinder/rootwrap.d/* %{buildroot}%{_datarootdir}/cinder/rootwrap/# Symlinks to rootwrap config filesmkdir -p %{buildroot}%{_sysconfdir}/cinder/rootwrap.dfor filter in %{_datarootdir}/os-brick/rootwrap/*.filters; doln -s $filter %{buildroot}%{_sysconfdir}/cinder/rootwrap.d/done# Remove unneeded in production stuffrm -f %{buildroot}%{_bindir}/cinder-allrm -f %{buildroot}%{_bindir}/cinder-debugrm -fr %{buildroot}%{python2_sitelib}/cinder/tests/rm -fr %{buildroot}%{python2_sitelib}/run_tests.*rm -f %{buildroot}/usr/share/doc/cinder/README*
#安装前的准备阶段,执行在%install阶段前%pregetent group cinder >/dev/null || groupadd -r cinder --gid 165if ! getent passwd cinder >/dev/null; then  useradd -u 165 -r -g cinder -G cinder,nobody -d %{_sharedstatedir}/cinder -s /sbin/nologin -c "OpenStack Cinder Daemons" cinderfiexit 0#安装后的收尾阶段,执行在%install之后%post%systemd_post openstack-cinder-volume%systemd_post openstack-cinder-api%systemd_post openstack-cinder-scheduler%systemd_post openstack-cinder-backup
#卸载rpm包之前的适合动作%preun%systemd_preun openstack-cinder-volume%systemd_preun openstack-cinder-api%systemd_preun openstack-cinder-scheduler%systemd_preun openstack-cinder-backup
#卸载rpm包之后的动作%postun%systemd_postun_with_restart openstack-cinder-volume%systemd_postun_with_restart openstack-cinder-api%systemd_postun_with_restart openstack-cinder-scheduler%systemd_postun_with_restart openstack-cinder-backup
#默认的包openstack-cinder所包含的文件列表%files%dir %{_sysconfdir}/cinder%config(noreplace) %attr(-, root, cinder) %{_sysconfdir}/cinder/cinder.conf%config(noreplace) %attr(-, root, cinder) %{_sysconfdir}/cinder/api-paste.ini%config(noreplace) %attr(-, root, cinder) %{_sysconfdir}/cinder/rootwrap.conf%config(noreplace) %attr(-, root, cinder) %{_sysconfdir}/cinder/policy.json%config(noreplace) %{_sysconfdir}/logrotate.d/openstack-cinder%config(noreplace) %{_sysconfdir}/sudoers.d/cinder%config(noreplace) %{_sysconfdir}/tgt/conf.d/cinder.conf%{_sysconfdir}/cinder/rootwrap.d/%attr(-, root, cinder) %{_datadir}/cinder/cinder-dist.conf%dir %attr(0750, cinder, root) %{_localstatedir}/log/cinder%dir %attr(0755, cinder, root) %{_localstatedir}/run/cinder%dir %attr(0755, cinder, root) %{_sysconfdir}/cinder/volumes%{_bindir}/cinder-*%{_unitdir}/*.service%{_datarootdir}/cinder%{_mandir}/man1/cinder*.1.gz%defattr(-, cinder, cinder, -)%dir %{_sharedstatedir}/cinder%dir %{_sharedstatedir}/cinder/tmp
#python-cinder包所包含的文件列表,cinder项目的源代码都在这个包里面,这个包相当于公共基础包%files -n python-cinder%{?!_licensedir: %global license %%doc}%license LICENSE%{python2_sitelib}/cinder%{python2_sitelib}/cinder-*.egg-info
#doc包所包含的文件列表%if 0%{?with_doc}%files doc%doc doc/build/html%endif#这个不重要%changelog* Fri Oct 16 2015 Haikel Guemar <hguemar@fedoraproject.org> 1:7.0.0-1- Update to upstream 7.0.0* Wed Oct 07 2015 Haikel Guemar <hguemar@fedoraproject.org> 7.0.0-0.2.0rc2- Update to upstream 7.0.0.0rc2* Wed Sep 30 2015 Haikel Guemar <hguemar@fedoraproject.org> 7.0.0-0.1rc1- Update to upstream 7.0.0.0rc1* Wed Jun 17 2015 Haïkel Guémar <hguemar@fedoraproject.org> 2015.1.0-3- Fix CVE-2015-1851 (RHBZ #1231822)* Mon May 04 2015 Alan Pevec <alan.pevec@redhat.com> 2015.1.0-2- update keystone_authtoken section in sample conf* Thu Apr 30 2015 Alan Pevec <alan.pevec@redhat.com> 2015.1.0-1- OpenStack Kilo release




0 0
原创粉丝点击