Projet

Général

Profil

GitPackagingSbuildCommon » Historique » Version 5

« Précédent - Version 5/21 (diff) - Suivant » - Version actuelle
Fabrice Barconnière, 09/01/2012 14:11


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.

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
system@build:~$ sudo apt-get install sbuild debootstrap

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.

system@build:~$ sudo adduser buildd
system@build:~$ sudo adduser buildd sudo

Ajoute de l’utilisateur au groupe sbuild

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

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

system@build:~$ sudo sbuild-adduser buildd

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.

buildd@build:~$ sbuild-update --keygen

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

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

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.

Mutualisation du cache apt

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

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.

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

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.

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

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 ;
buildd@buildd:~$ export YOUR_VG@build dist@lucid arch=amd64

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 :

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

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

Utilisation de LVM

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.
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

Adaptation post-installation

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

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
" 

Utilisation du système de fichier btrfs

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.

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

Création d’un sous volume par chroot

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

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

Adaptation de schroot pour btrfs

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

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
" 

Utilisation d’un environnement de compilation personnel

Le plus simple c’est la pratique :

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

Séparation code/packaging

Packaging en 3 manches

Gestion du packaging

Gestion de debian/changelog

Compilation du paquet

Webographie