A quick primer on chroot, sbuild, mock and Vagrant

For me, some of the build tools are used so seldom that when things go pear shaped, it is more often a mad scramble to put out fires. Being big on devops, I wanted to be able to run the all packaging scripts on my own setup (or any other developer’s setup at that) or VMs. Particularly when issues arise, be it dependencies related or error in the packaging process, having a Vagrant box at hand with all the production trimmings mitigate the need to use production Jenkins server for debugging where possible. This is a good thing!

This is a blog post that serves as a quick primer for myself and anybody who feels like dabbling in old school package building for their release management process with a modern twist.

You will need Vagrant, Virtualbox and a couple of reliable Ubuntu and Centos Vagrant boxes. Some knowledge of deb and redhat build scaffolding is also helpful.

Getting started with chroot & sbuild

The following steps will yield a precise64 chroot environment.

Note that I was unsuccessful with setting up sbuild using Vagrant provisioning scripts. So the following steps are executed after the VM has been provisioned.

sudo apt-get update
sudo apt-get install sbuild
sudo sbuild-createchroot --arch=amd64 precise /srv/chroot/precise-amd64 http://no.archive.ubuntu.com/ubuntu --components=main,universe
sudo sbuild-adduser vagrant
cp /usr/share/doc/sbuild/examples/example.sbuildrc /home/vagrant/.sbuildrc

The above steps will create a symlink folder that resides in /etc/sbuild/chroot/precaise-amd64-sbuild that points to /srv/chroot/precise-amd64. You can now list the available chroot by doing

schroot -l

and enter the precise64 jail by doing

schroot -c precise-amd64-sbuild

Ideally now is a good time to generate a gpg key.

sudo sbuild-update --keygen

If you run into entropy issue and require more bytes, put the keygen process in the background, then do the following

sudo apt-get install rng-tools
sudo rngd -r /dev/urandom

At this point, you have almost a happy sbuild setup. However, you probably want to mount a folder to the chroot environments, accessible by the vagrant user.

Add the following line to /etc/chroot/default/fstab, /etc/chroot/mount-defaults/fstab, /etc/chroot/sbuild/fstab

/vagrant        /vagrant        none    rw,bind         0       0

Doing it this way, the mounted Vagrant folder will be accessible by the chroot environments with the default vagrant user.

With using sbuild, it is as simple as issuing the following command.

sbuild --arch-all -v -m 'vagrant user ' --arch "amd64" -d "precise" app_*.dsc

Without -c parameter specified, sbuild will search the default folder /etc/sbuild/chroot/ for an environment matching the architecture and distribution.

Getting started with with chroot & mock

Setting up mock is slightly less complicated. With EPEL repo at hand, do…

sudo yum install mock python-ctypes
sudo usermod -G mock vagrant

mock will install a big bunch of chroot configurations residing in /etc/mock folder.

You can clean and initialise the chroot environment each time as you need them. There are also no mounting of folders to fiddle with. Source and result folders are specified as parameters with the mock command.

For example:

mock -v -r epel-6-x86_64--clean
mock -v -r epel-6-x86_64 --init
mock -v -r epel-6-x86_64 --no-clean --no-cleanup-after --buildsrpm \
    --spec “app.spec" \
    --source "$(pwd)/source"  \
    --resultdir "$(pwd)/result"

Vagrant boxes for reuse

Since mock installs a whole bunch of dependencies on the Centos VM, the resulting box will very quickly blow up to around 7.8 GB in size. Likewise, the aforementioned Ubuntu box with two chroot and sbuild will be around 2.2 GB in size. In addition, provisioning these boxes are time consuming. Therefore I highly recommend that once the VMs are provisioned, a new set of Vagrant boxes are to be created and set aside for reuse.

See https://docs.vagrantup.com/v2/virtualbox/boxes.html for details.