Jump to: navigation, search

Difference between revisions of "Packaging/Ubuntu"

(Add implementation details about the trunk builds)
(Update Chart)
Line 23: Line 23:
 
|  Frequent snapshots.<<BR>>Diablo expected in final release  
 
|  Frequent snapshots.<<BR>>Diablo expected in final release  
 
|  [[#Release_PPA|Release PPA]]  
 
|  [[#Release_PPA|Release PPA]]  
 +
|-
 +
|  12.04 (Precise) 
 +
|  Freuqent snapshots.<<BR>>Essex expected in final release
 +
 
|}
 
|}
  

Revision as of 16:28, 19 December 2011

Ubuntu is the reference platform for OpenStack. We follow the Ubuntu release cycle very closely, and do most of our QA on Ubuntu.

If you want to run OpenStack on Ubuntu, there are a few options, depending on your stability requirements and which version of Ubuntu you're running.

Ubuntu version Only what is in Ubuntu Only stable releases
10.04 LTS (Lucid) N/A Release PPA
10.10 (Maverick) Pre-Austin snapshot Release PPA
11.04 (Natty) Cactus Release PPA
11.10 (Oneiric) Frequent snapshots.<
>Diablo expected in final release
Release PPA
12.04 (Precise) Freuqent snapshots.<
>Essex expected in final release

Trunk PPA

A PPA<<FootNote(Personal Package Archive: an extra apt repository you can add to your sources.list to get access to software not in Ubuntu.)>> where we will upload a new version for every single commit on trunk.

Information and instructions for use can be found on Launchpad for Nova, and similarly for Swift and Glance. Swift has documented the process for building and deploying custom Debian packages at http://swift.openstack.org/debian_package_guide.html.

How does it actually work?

It's accomplished by a series of Jenkins jobs:

nova-tarmac

When a branch is approved for merging, tarmac merges it (and runs the tests and whatnot) and pushes the changes to trunk.

nova

The 'nova' job polls the trunk for changes. When it sees changes, it does some stuff (that isn't relevant here) and eventually triggers the nova-tarball job.

nova-tarball

Using "python setup.py sdist", a tarball is built. It gets renamed to:

nova-X~bzrY.tar.gz

..where X is the version from setup.py and Y is the bzr revision number the tarball is based on.

There are a couple of reasons why we use tarballs as the basis for packaging:

  • It ensures that everything one needs for running Nova in the tarball. If it gets lost between version control and the tarball (because something is missing in the MANIFEST or whatnot), we'll notice when we're testing from packages. We would never notice if everyone ran directly from a source checkout.
  • The best way to ensure a smooth release is to have tried it a million times before and have automated everything. Packages for final releases are always based on the release tarballs, so it's best to do the same for development snapshots as well.

nova-ppa

This is a matrix job, run for the 4 relevant ubuntu series: Lucid, Maverick, Natty, and Oneiric.

For each of these series, it

  1. grabs the most recently built tarball from the nova-tarball job,
  2. unpacks it,
  3. derives the "upstream" version of the package based on the filename of the tarball,
  4. grabs the packaging trunk code at lp:~openstack-ubuntu-packagers/nova/ubuntu,
  5. applies it on top of the unpacked source,
  6. generates the package version based on the "upstream" version + the target ubuntu series,
  7. generates a changelog entry with this version in it (including the revision number of the packaging branch in the body of the changelog entry),
  8. runs "dpkg-buildpackage -rfakeroot -S" to build the source package,
  9. signs it,
  10. uploads it to Launchpad.

Release PPA

Information and instructions for use can be found on Launchpad for Nova, and similarly for Swift and Glance..

A PPA<<FootNote(Personal Package Archive: an extra apt repository you can add to your sources.list to get access to software not in Ubuntu.)>> where we will upload only final releases.

Generating packages manually

Prerequisites

You'll need to install some packages on the build machine. Some of them are in the nova-core trunk PPA, so add it as a repository:


sudo add-apt-repository ppa:nova-core/trunk
sudo apt-get update


To grab all the build dependencies of nova:


sudo apt-get build-dep nova


You'll need Sphinx 1.0 or greater for doing the build or the documentation generation will fail and the build will abort. You can check what version of Sphinx is being used by your version of Python by doing:


python -c "import sphinx; print sphinx.__version__"


Finally, you'll need the following packages on your system to be able to generate the packages:

sudo apt-get install dpkg-dev quilt debhelper


Generating binary packages

Combine the main nova code with the packaging scripts:


bzr export nova lp:nova
bzr export nova-packaging lp:~openstack-ubuntu-packagers/nova/ubuntu
mv nova-packaging/debian nova

Edit the changelog entry. The following commands will specify a Lucid package with version "2011.1-0ubuntu2-local1" and a changelog entry "Local build for internal testing"


cd nova
dch -v 2011.1-0ubuntu2-local1 -D lucid "Local build for internal testing"


If you're building for Lucid, you need to issue the following command to apply the debian/patches/nova-manage_flagfile_location.patch patch file before building the packages.


QUILT_PATCHES=debian/patches quilt push -a


Generate the packages:


./builddeb.sh

The packages will appear in the parent of the nova directory.

Uploading custom packages to PPA

Create a PPA with the following PPA dependencies:

  • nova-core/build-depends
  • nova-core/release

Then issue the following commands from the root of your nova directory.


GPGKEY=... # Your registered OpenGPG key
LPNAME=... # Your Launchpad username
DIST="lucid" # The Ubuntu distribution you are targetting
VERSTRING="2011.3-my-custom-build-0ubuntu1" # Custom version string here
dch  -v "$VERSTRING" -D $DIST "Your changelog comment here"

# If building for Lucid, apply the patch manually, otherwise skip this step
QUILT_PATCHES=debian/patches quilt push -a

dpkg-buildpackage -S -sa -rfakeroot -tc -D -k$GPGKEY 
cd ..
# Upload the packages
dput ppa:${LPNAME}/ppa nova_${VERSTRING}_source.changes