Projet

Général

Profil

GitPackagingSbuildCommon » Historique » Version 5

Version 4 (Daniel Dehennin, 09/01/2012 14:01) → Version 5/21 (Fabrice Barconnière, 09/01/2012 14:11)

{{toc}}

h1. Mise en place d’un environnement de compilation personnel

Sur une machine dédiée au build, nous avons besoin :

* D’un utilisateur dédié au build ;

* D’un groupe de volume logique d’une taille suffisante pour les
chroot ;

* De suffisamment d’espace libre sur le groupe de volume pour les
snapshots.

h2. Installation des paquets nécessaires

Les deux paquets nécessaire à la création et la gestion des
environnements sont les suivants :

* sbuild: l’utilitaire de gestion des chroot
* debootstrap: l’utilitaire d’installation

<pre>
system@build:~$ sudo apt-get install sbuild debootstrap
</pre>

h2. Création d’un utilisateur pour le build

Ce dernier recevra les logs dans son répertoire personnel.

Il est cependant possible d’utiliser votre compte utilisateur, mais
sera indispensable lors de la mise en place d’un système de build
automatique.

<pre>
system@build:~$ sudo adduser buildd
system@build:~$ sudo adduser buildd sudo
</pre>

h2. Ajoute de l’utilisateur au groupe sbuild

L’accès aux outils de gestion de schroot est restreint aux membres membre du
groupe sbuild.

Exécuter la commande suivante et copier le fichier comme indiqué :

<pre>
system@build:~$ sudo sbuild-adduser buildd
</pre>

h2. Création d’une paire de clef GPG

L’outil sbuild créé des pseudos paquets pour la gestion des
Build-Depends lors de la construction des paquets.

Cette paire de clef est locale à la machine
(@/var/lib/sbuild/apt-keys@) et spécifique à la procédure de build, il
n’y a nullement lieu de la publier.

<pre>
buildd@build:~$ sbuild-update --keygen
</pre>

Afin de générer de l’entropie, j’exécute dans un autre terminal la
commande suivante :

<pre>
buildd@build:~$ find / -type f -exec sha512sum {} \; > /dev/null 2>&1
</pre>

Si vous êtes en SSH sur une machine (virtuelle ou physique), la frappe
de touche au clavier doit consommer autant d’entropie qu’elle n’en
fournie.

h2. Mutualisation du cache apt

<pre>
buildd@build:~$ sudo /bin/sh -c "echo /var/cache/apt/archives /var/cache/apt/archives none rw,bind 0 0 >>/etc/schroot/sbuild/fstab"
</pre>

h2. Récupération des clefs publiques des dépôts

La machine de build étant une debian, il faut utiliser un keyring
comprenant les clefs ubuntu et les clefs EOLE.

<pre>
buildd@build:~$ sudo /bin/sh -c "echo deb http://eoleng.ac-dijon.fr/eoleng/ eole-2.3/all/ >> /etc/apt/sources.list.d/eole.list"
buildd@build:~$ sudo apt-get update
buildd@build:~$ sudo apt-get --force-yes -y install ubuntu-keyring
buildd@build:~$ sudo apt-key add /usr/share/keyrings/ubuntu-archive-keyring.gpg
buildd@build:~$ sudo apt-get update
</pre>

h2. Création d’un volume logique dédié aux builds

Ce volume sera monté dans chaque snapshot lors d’un build afin de ne
pas surcharger les snapshots de construction.

<pre>
buildd@build:~$ sudo lvcreate -L20g -n var+lib+sbuild+build ${YOUR_VG}
buildd@build:~$ sudo mkfs.ext4 -L /var/lib/sbuild/build -m0 /dev/${YOUR_VG}/var+lib+sbuild+build
buildd@build:~$ sudo /bin/sh -c "echo /dev/${YOUR_VG}/var+lib+sbuild+build /var/lib/sbuild/build ext4 rw,noatime 0 2 >> /etc/fstab"
buildd@build:~$ sudo mount /var/lib/sbuild/build
</pre>

h2. Création des environnements de build

La gestion des environnements de build est faite par schroot et peut
utiliser plusieurs systèmes afin de partager une image de base et ainsi
gagner du temps lors des compilation :

* Les volumes logiques ;
* Le système de fichier @btrfs@.

Nous partirons du principe que :

* la variable d’environnement @${YOUR_VG}@ contient le nom de votre
groupe de volume ;

* La variable d’environnement @${dist}@ contient le nom de la
distribution ;

* La variable d’environnement @${arch}@ contient le nom de
l’architecture ;

<pre>
buildd@buildd:~$ export YOUR_VG@build dist@lucid arch=amd64
</pre>

h3. Installation du système de base

La création du chroot en lui même est très simple mais nécessitera des
ajustements préalables décris ci-après en fonction du choix fait entre
@LVM@ et @btrfs@.

En assumant que le chroot doit être créer dans le répertoire
@/srv/chroot/${dist}-${arch}-sbuild/@, la commande pour installer le
chroot est la suivante :

<pre>
buildd@build:~$ sudo sbuild-createchroot --keyring=/etc/apt/trusted.gpg \
--arch=${arch} \
--components=main,restricted,universe,multiverse \
--include=sudo \
${dist} \
/srv/chroot/${dist}-${arch}-sbuild \
http://eoleng.ac-dijon.fr/ubuntu
</pre>

L’utilisation de l’option @--components@ est importante pour la
résolution des dépendances.

h3. Utilisation de LVM

h4. Avant l’installation du chroot: création d’un volume logique

Dans le modèle @LVM@ chaque chroot est installé sur un volume logique
dédié.

La taille de ce volume doit pouvoir contenir :

* Un système minimal ;

* L’intégralité des dépendances pour la compilation d’un paquet.

<pre>
buildd@build:~$ sudo lvcreate -L2g -n ${dist}-${arch}-sbuild ${YOUR_VG}
buildd@build:~$ sudo mkfs.ext4 -m0 -L ${dist}-${arch}-sbuild /dev/${YOUR_VG}/${dist}-${arch}-sbuild
buildd@build:~$ sudo mkdir /srv/chroot/${dist}-${arch}-sbuild
buildd@build:~$ sudo mount /dev/${YOUR_VG}/${dist}-${arch}-sbuild /srv/chroot/${dist}-${arch}-sbuild
</pre>

h4. Adaptation post-installation

Nous devons adapter la configuration de @schroot@ à l’utilisation des
snapshot @LVM@ une fois le système installé :

<pre>
buildd@build:~$ sudo sed -i -e "s,type=directory,type=lvm-snapshot," \
-e "/directory=/d" \
-e "/type=/ialiases=eole2.3,eole2.3-dev,eole-2.3-proposed,eole-2.3-security" \
/etc/schroot/chroot.d/$dist-$arch-sbuild*
buildd@build:~$ sudo /bin/sh -c "cat >> `expr /etc/schroot/chroot.d/$dist-$arch-sbuild*` <<EOT
lvm-snapshot-options=--size 2G
mount-options=-o noatime
device=/dev/${YOUR_VG}/$dist-$arch-sbuild
source-groups=root,sbuild
source-root-groups=root,sbuild
EOT
"
</pre>

h3. Utilisation du système de fichier btrfs

h4. Un volume logique pour tous les chroots

Ce volume contiendra les chroots des différents systèmes pour lesquels
vous ferez des compilation.

Un snapshot sera créé avant chaque build et détruit après, cela permet
de gagner le temps du debootstrap.

<pre>
buildd@build:~$ sudo apt-get install btrfs-tools
buildd@build:~$ sudo lvcreate -L20g -n schroot ${YOUR_VG}
buildd@build:~$ sudo mkfs.btrfs -L schroot -m0 /dev/${YOUR_VG}/schroot
buildd@build:~$ sudo mkdir -p /srv/chroot
buildd@build:~$ sudo /bin/sh -c "echo /dev/${YOUR_VG}/schroot /srv/chroot btrfs rw,noatime 0 3 >> /etc/fstab"
buildd@build:~$ sudo mount /srv/chroot
</pre>

h4. Création d’un sous volume par chroot

Il est nécessaire de mettre en place un sous volume par distribution/architecture

<pre>
buildd@buildd:~$ sudo btrfs subvolume create /srv/chroot/${dist}-${arch}-sbuild
</pre>

h4. Adaptation de schroot pour @btrfs@

Nous devons ensuite adapter la configuration de @schroot@ à
l’utilisation des snapshot @btrfs@ :

<pre>
buildd@build:~$ sudo mkdir -p /srv/chroot/snapshots
buildd@build:~$ sudo sed -i -e "s,type=directory,type=btrfs-snapshot,; /directory=/ d" \
-e "/type=/ialiases=eole2.3,eole2.3-dev,eole-2.3-proposed,eole-2.3-security" \
/etc/schroot/chroot.d/$dist-$arch-sbuild*
buildd@build:~$ sudo /bin/sh -c "cat >> `expr /etc/schroot/chroot.d/$dist-$arch-sbuild*` <<EOT
btrfs-source-subvolume=/srv/chroot/$dist-$arch-sbuild
btrfs-snapshot-directory=/srv/chroot/snapshots
EOT
"
</pre>

h3. Utilisation d’un environnement de compilation personnel

Le plus simple c’est la pratique :

<pre>
buildd@build:~$ sudo apt-get install git-core git-buildpackage fakeroot build-essential debhelper cdbs
buildd@build:~$ git clone http://dev-eole.ac-dijon.fr/git/eole-debsums
buildd@build:~$ cd eole-debsums
buildd@build:~$ git checkout -b dist/ubuntu/lucid/build origin/dist/ubuntu/lucid/master
buildd@build:~$ git buildpackage --git-builder="sbuild -A -d eole2.3-dev" --git-cleaner=/bin/true
</pre>

h1. Séparation code/packaging

h1. Packaging en 3 manches

h2. Gestion du packaging

h2. Gestion de @debian/changelog@

h2. Compilation du paquet

h1. Webographie

* "sbuild sur le wiki debian":http://wiki.debian.org/sbuild,
* "Debian build setup":https://buildd.debian.org/docs/buildd-setup.txt
* "Space-efficient reproducible builds using schroot, sbuild and LVM":http://www.pseudorandom.co.uk/2007/sbuild/
* "Debian wiki on Packaging with git":http://wiki.debian.org/PackagingWithGit
* "Russ Allbery use case":http://www.eyrie.org/~eagle/notes/debian/git.html
* "My use case":http://lists.alioth.debian.org/pipermail/vcs-pkg-discuss/2011-November/000817.html