I have a Devstack setup. I’ve hacked the Keystone repo to add some cool feature. I want to test it out with an RDO deployment. How do I make my own RPM for the RDO system?
This is not a how to. This is more like a police log.
sudo mkdir fedora sudo chown ayoung:ayoung fedora cd fedora/ git clone http://pkgs.fedoraproject.org/cgit/openstack-keystone.git
What did that get us?
$ ls openstack-keystone 0001-remove-runtime-dep-on-python-pbr.patch 0002-sync-parameter-values-with-keystone-dist.conf.patch daemon_notify.sh keystone-dist.conf openstack-keystone.init openstack-keystone.logrotate openstack-keystone-sample-data openstack-keystone.service openstack-keystone.spec openstack-keystone.sysctl openstack-keystone.upstart sources
When I build, I do so in /home/ayoung/rpmbuild. How:
$ cat ~/.rpmmacros %_topdir /home/ayoung/rpmbuild %packager Adam Young %dist .f20_ayoung
So, first move these files into %_topdir/SOURCES
cp * ~/rpmbuild/SOURCES/
Technically you don’t need to move the .spec file there, but it hurts nothing to do so.
Ok, lets make a first attempt at building:
$ rpmbuild -bp openstack-keystone.spec error: File /home/ayoung/rpmbuild/SOURCES/keystone-2014.2.b3.tar.gz
So it is looking for a tarball named keystone-2014.2.b3.tar.gz. Where does it get that name:
In openstack-keystone.spec:
%global release_name juno %global milestone 3 %global with_doc %{!?_without_doc:1}%{?_without_doc:0} Name: openstack-keystone Version: 2014.2 Release: 0.4.b%{milestone}%{?dist} Summary: OpenStack Identity Service ... Source0: http://launchpad.net/keystone/%{release_name}/%{release_name}-%{milestone}/+download/keystone-%{version}.b%{milestone}.tar.gz
Now, lets assume that I already have that version installed with RDO, and I want to test my change on top of it. If I make a mile > 3 it will update. I could do this by changing the spec file.
changeing
-%global milestone 3
+%global milestone 3a
would give me :
error: File /home/ayoung/rpmbuild/SOURCES/keystone-2014.2.b3a.tar.gz: No such file or directory
But can I do that from the command line? Sure. Use -D, and put hta macro in quotes:
$ rpmbuild -D "milestone 3b" -bp openstack-keystone.spec error: File /home/ayoung/rpmbuild/SOURCES/keystone-2014.2.b3.tar.gz: No such file or directory
Ok, so now I need a tarball that looks like the file name I will use in the rpmbuild process. Use git-archive to produce it.
cd /opt/stack/keystone git archive -o /home/ayoung/rpmbuild/SOURCES/keystone-2014.2.b3.tar.gz HEAD cd /opt/fedora/openstack-keystone/ rpmbuild -bp openstack-keystone.spec error: Failed build dependencies: python-pbr is needed by openstack-keystone-2014.2-0.4.b3.f20_ayoung.noarch
Alright! Closer. There is a Yum utility to help out with this last problem. TO get the utilities:
sudo yum install yum-utils
then to get the build dependencies:
sudo yum-builddep openstack-keystone.spec
The next time running an rpmbuild gets the error:
+ cd keystone-2014.2.b3
/var/tmp/rpm-tmp.NSt5Oy: line 37: cd: keystone-2014.2.b3: No such file or directory
Due to the fact that the archive command above is not putting the code in a subdir. There is a flag for that: –prefix
cd /opt/stack/keystone git archive --prefix=keystone-2014.2.b3/ -o /home/ayoung/rpmbuild/SOURCES/keystone-2014.2.b3.tar.gz HEAD cd /opt/fedora/openstack-keystone rpmbuild -bp openstack-keystone.spec + echo 'Patch #1 (0001-remove-runtime-dep-on-python-pbr.patch):' Patch #1 (0001-remove-runtime-dep-on-python-pbr.patch): + /usr/bin/cat /home/ayoung/rpmbuild/SOURCES/0001-remove-runtime-dep-on-python-pbr.patch + /usr/bin/patch -p1 --fuzz=0 patching file bin/keystone-all
Now I get an error on a patch application: this is better, as it implies I am packing the tarball correctly. That change is basically removing pbr from the keystone-all startup file. PBR does versioning type stuff that competes with RPM.
Let’s ignore that patch for now: Keystone will run just fine with PBR in. In the spec file I comment out:
%patch0001 -p1
Code in the spec file is doing something comparable, and fails out due to me skipping first patch.
+ sed -i s/REDHATKEYSTONEVERSION/2014.2/ bin/keystone-all keystone/cli.py
+ sed -i s/2014.2.b3/2014.2/ PKG-INFO
Skip that code for now, too.
--- a/openstack-keystone.spec +++ b/openstack-keystone.spec @@ -117,7 +117,7 @@ This package contains documentation for Keystone. %prep %setup -q -n keystone-%{version}.b%{milestone} -%patch0001 -p1 +#%patch0001 -p1 %patch0002 -p1 find . \( -name .gitignore -o -name .placeholder \) -delete @@ -127,9 +127,9 @@ rm -rf keystone.egg-info # Let RPM handle the dependencies rm -f test-requirements.txt requirements.txt # Remove dependency on pbr and set version as per rpm -sed -i s/REDHATKEYSTONEVERSION/%{version}/ bin/keystone-all keystone/cli.py +#sed -i s/REDHATKEYSTONEVERSION/%{version}/ bin/keystone-all keystone/cli.py -sed -i 's/%{version}.b%{milestone}/%{version}/' PKG-INFO +#sed -i 's/%{version}.b%{milestone}/%{version}/' PKG-INFO
And the build works. Thus far, I’ve been running -bp which just preps the source tree in the repo. Lets see what the full rpmbuild process returns:
+ cp etc/keystone.conf.sample etc/keystone.conf
+ /usr/bin/python setup.py build
error in setup command: Error parsing /home/ayoung/rpmbuild/BUILD/keystone-2014.2.b3/setup.cfg:Exception: Versioning for this project requires either an sdist tarball, or access to an upstream git repository. Are you sure that git is installed?
There is that python build reasonableness change. OK, what is that doing? Lets start with the last line we commented out in the spec file:
+#sed -i ‘s/%{version}.b%{milestone}/%{version}/’ PKG-INF
This is putting the RPM version of the python library into the Python EGG info. In my repo I have
keystone.egg-info/PKG-INFO
with
Version: 2014.2.dev154.g1af2428
I wonder if I can make the RPM version look like that? It won’t be an rpm -U to go from my RDO deployment if I do, but I can work around that with –oldpackage.
What is dev154.g1af2428? I suspect some git magic for the last part. Git log shows:
commit 1af24284bdc093dae4f027ade2ddb29656b676f0
So g1af2428? is g + githash[0:6] but what about dev154? It turns out it is the number of commits since the last tag.
At this point, I resorted to IRC, and then reading the code. The short of it is that I am submitting a patch to the keystone spec file to remove all of the PBR related changes. Instead, when python setup.py is called, we’ll use the environment variable to tell PBR the version number. For example
PBR_VERSION=%{version}.%{milestone} %{__python} setup.py build
I found an instance of you doing the removal of the patches[1], but i haven’t been able to find a place where you’ve implemented the PBR_VERSION env variable into an actual spec.
https://bugzilla.redhat.com/show_bug.cgi?id=1147728
Do you have an example?
This is out of date. New info coming soon