深入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
- 深入openstack rpm打包原理(openstack cinder rpm打包完全分析)
- openstack RPM打包
- rpm 打包原理
- rpm打包原理
- rpm打包原理学习
- rpm打包
- rpm打包
- rpm打包
- RPM打包
- linux-RPM 打包原理 SPEC 编写规范
- rpm 打包原理及 .spec文件
- RPM打包原理、示例、详解及备查
- OpenStack Cinder源码分析之一
- 使用RPM打包1
- RPM打包规范
- RPM打包学习整理
- RPM打包利器RPM_CREATE
- 用 RPM 打包软件
- iOS 微信第三方登录
- Java中 Buffer的作用
- intellid idea安装plantUML插件以及错误解决
- 基于7系列FPGA的DCI技术的应用
- Lambda学习
- 深入openstack rpm打包原理(openstack cinder rpm打包完全分析)
- iOS原生二维码/条形码相关
- ros 与 sony ps3joy
- hadoop PipeMapRed faild
- STM32 NVIC中断优先级管理
- Elastic-JOB 开发指南
- POJ 1317 Do the Untwist 已被翻译
- Java实现进度条JProgressBar设置颜色,变色进度条
- 编码中的setCharacterEncoding 理解