You are browsing a read-only backup copy of Wikitech. The primary site can be found at


From Wikitech-static
Revision as of 02:49, 4 July 2015 by imported>Alex Monk (→‎Stock Debian Jessie: fix unclosed tt causing style issues)
Jump to navigation Jump to search

This is a generic guide for cowbuilder, to use it on wmflabs see Cowbuilder on labs

Apply role::package::builder on a labs VM will allow you to avoid all the following as it is already being done by puppet. Documentation is kept up to date at:


cowbuilder is a Debian packaging tool that takes advantages of Copy On Write (COW) to speed up the building process. You first bootstrap Debian distributions you are interested in and configure them as it may fit your use case. When building a package, cowbuilder hardlink the files in a new hierarchy and would write to the disk only on actual change to the files. That makes the startup lightning fast.

This page is a step by step guide to setup a cowbuilder environement. It assumes your machine is running Debian/Jessie machine and you have root access. We will cover the initial image creations for stock Debian/Jessie and the various custom distribution Wikimedia is using. We will then look at how they work out when using git-buildpackage.

cowbuilder images


apt-get install build-essential git-buildpackage cowbuilder


Create images

TODO Configure pbuilder:

Is APTCACHE really needed ?

Stock Debian Jessie

cowbuilder --create --distribution=jessie --debootstrapopts --variant=buildd

It takes the Debian mirror from your sources.list and install it in a chroot under /var/cache/pbuilder/base-jessie.cow. That will be known as the distribution jessie. More options are available via man cowbuilder and the underlying command being used man pbuilder.

Debian Jessie Wikimedia

Wikimedia uses its own apt repositories which comes with additional packages and backports. You will want to create another jessie flavor image. It would be similar but points to wikimedia and ensure the packages receive an higher priority. For a start, just copy:

cp -a /var/cache/pbuilder/base-jessie.cow /var/cache/pbuilder/base-jessie-wikimedia.cow

We will further tweak that image by login into it and having our modifications saved back to disk:

cowbuilder --login --basepath /var/cache/pbuilder/base-jessie-wikimedia.cow --save-after-login

You now have a prompt in this image, add in the Wikimedia repository pinned to receive priority:

echo deb jessie-wikimedia main backports thirdparty \
  > /etc/apt/sources.list.d/wikimedia.list
echo -e "Package: *\nPin: release o=Wikimedia\nPin-Priority: 1001" \
  > /etc/apt/preferences.d/wikimedia

Since our packages are signed with GPG, you will want to grab the gpg keys we use and verify them. To do so:

apt-get install wget
apt-key add wikimedia-archive-keyring.gpg
apt-get update

You will want to clear out some of the modifications you just made:

dpkg --purge wget
apt-get autoremove --purge
rm wikimedia-archive-keyring.gpg

And upgrade the image:

apt-get upgrade

exit / Ctrl+d and cowbuilder will save the result of your modification to the base-jessie-wikimedia.cow image.

Ubuntu images


   apt-get install ubuntu-archive-keyring
   # We need universe!
   cowbuilder --create \
       --basepath /packaging/base-trusty.cow \
       --mirror \
       --distribution trusty \
       --components 'main universe' \
       --debootstrapopts --variant=buildd \
       --debootstrapopts --keyring=/usr/share/keyrings/ubuntu-archive-keyring.gpg \
  echo 'deb precise-wikimedia main universe thirdparty' > /etc/apt/sources.list.d/wikimedia.list
  echo -e "Package: *\nPin: release o=Wikimedia\nPin-Priority: 1001" > /etc/apt/preferences.d/wikimedia

Probably need to get trusty updates as well.


An example result of the above steps:

$ ls -1d /var/cache/pbuilder/*cow

This let you build a package against either the stock or the Wikimedia flavors for all distributions in use.


Maintaining patch series

Placeholder for gbp pq.