Installation de poudriere sur une machine FreeBSD 10.1


Où l’on va voir comment installer et utiliser poudriere sur une machine FreeBSD 10.1 pour créer nos paquets binaires personnalisés.

Installation de poudriere

L’installation de poudriere est très simple, mais elle met en place des concepts plus compliqués comme les jails1.

Heureusement, poudriere met en place la jail dont il a besoin tout seul.

pkg install poudriere dialog4ports

poudriere embarque une aide accessible avec la commande :

poudriere help    

et chacune des sous-commandes dispose elle aussi d’une aide intégrée :

poudriere <sous-commande> help

Configuration de poudriere

La configuration se trouve principalement dans le répertoire /usr/local/etc et plus particulièrement dans le fichier poudriere.conf. Nous allons éditer ce fichier et y positionner les variables suivantes :

1
2
3
4
5
6
7
ZPOOL=zroot
ZROOTFS=/poudriere
BASEFS=/poudriere
DISTFILES_CACHE=/usr/ports/distfiles
RESOLV_CONF=/etc/resolv.conf
FREEBSD_HOST=ftp://ftp.freebsd.org
SVN_HOST=svn0.eu.FreeBSD.org
  • ZPOOL → le pool zfs que poudriere va utilise pour faire sont dataset ;
  • ZROOTFS → la racine du système poudriere. Cela aura pour effet la création du dataset zroot/poudriere, monté sur /poudriere ;
  • BASFS → le point de montage de la racine de la poudriere ;
  • DISTFILES_CACHE %rarr; définis le répertoire de stockage des fichiers à distribuer. Poudriere et le système hôte partage le même emplacement pour éviter de télécharger les fichiers tar des paquets déjà installés ;
  • RESOLV_CONF → défini le fichier resolv.conf qui sera copié dans la jail de la poudriere ;
  • FREEBSD_HOST → le serveur FTP/HTTP qui sera utilisé par la jail pour installer les paquets demandés ;
  • SVN_HOST → le SVN utilisé par la poudriere pour la mise à jour des sources avec subversion.

Au cas où le répertoire DISTFILES_CACHE n’existe pas, il faut le créer (une fois de plus, nous crions un dataset) :

zfs create -o mountpoint=/usr/ports/distfiles zroot/usr/ports/distfiles

Mise en place de la poudriere

Maintenant que la configuration est faite, nous pouvons commencer l’installation de notre poudriere.

poudriere jail -c -j 101Ramd64 -v 10.1-RELEASE -a amd64

On indique que l’on va créer une jail dont le nom est 101Ramd64, la version du système utilisé est 10.1-Release (la version actuelle de notre système), pour l’architecture 64bits (amd64).

Mise en place de l’arbre des ports de la poudriere

La poudriere a besoin d’avoir un arbre des ports (équivalent à /usr/ports) spécifique. Nous allons mettre en place cet arbre.

poudriere ports -c

On peut vérifier la bonne finition de la commande :

poudriere ports -l
PORTSTREE METHOD   TIMESTAMP           PATH
default   portsnap 2015-04-23 20:36:01 /poudriere/ports/default

Nous pouvons ensuite tester la mise en place de notre poudriere en lançant un test de compilation :

poudriere testport -j 101Ramd64 -p default -o www/firefox

Nous allons créer une configuration pour l’utilitaire make, qui fait partie de la chaîne de création des paquets. Ce fichier, qui doit se trouver dans /usr/local/etc/poudriere.d ne comporte qu’une ligne :

WITH_PKG=yes

et doit se nommer du nom de la jail de poudriere (101Ramd64-make.conf) dans mon cas.

Constitution d’une liste de paquet

Nous allons créer un autre fichier de configuration qui contient la liste des paquets que nous voulons voir dans notre poudriere. Pour l’instant, j’ai besoin de nginx, de redmine, Phusion Passenger. J’aurais également besoin de git, je vais donc l’ajouter à ma liste.

Ce fichier peut se trouver n’importe où, je préfère l’avoir avec les fichiers de configuration de poudriere, dans /usr/local/etc/poudriere.d et je lui dans un nom en rapport avec la jail de ma poudriere : 101Ramd64-list.txt.

1
2
3
www/nginx
www/redmine
devel/git

 passenger ne fait pas partie des ports, il sera installé en tant que dépendance de nginx.

Ajout du 14/06/2020

J’ai plusieurs jail qui tournent et chacune avez ses logiciels propres. Il arrive souvent que l’on compile, avec la poudriere un logiciel pour telle ou telle jail. Et ce dernier n’est pas répertoirié dans la liste de compilation. Il convient donc, de temps en temps de reconstruire cette liste.

La commande pkg(8) va venir à notre aide et les alias définis par défaut pour cette commande. La command jls(8) va nous donner la liste des jails ensuite, c’est un jeu de pipe (|).

1
2
3
foreach jail ( `jls -N | tail -n +2 | awk '{print $1}'` )
  pkg -j $jail noauto | pkg -j $jail origin >> /tmp/new_list.lst
end

On ajoute à notre fichier les logiciels utiliser sur l’hôte :

pkg noauto | pkg origin >> /tmp/new_list.lst

Ensuite, nous allons tier et ne prendre qu’une fois les logciels listés plusieurs fois :

cat /tmp/new_list.lst | sort | uniq > /usr/local/etc/poudriere.d/101Ramd64.lst
rm /tmp/new_list.lst

Il est temps de demander à la poudriere de compiler les logiciels décrits dans notre fichier. Cela se fait en deux temps, tout d’abord choisir les options de chacun des ces outils (et nous verrons aussi les options des dépendances à ces outils), puis la compilation elle-même.

 dans la phase des options, faites bien attention à celles dont vous avez besoin, comme passenger dans les options de nginx.

poudriere options -j 101Ramd64 -f /usr/local/etc/poudriere.d/101Ramd64-list.txt

Il est fort probable que dans toutes les dépendances pour lesquelles vous aurez à faire un choix de nombreux vous sont totalement inconnues. Dans ce cas, laissez les options par défaut.

Restez cohérent, si vous avez choisi passenger, ne changez pas en cours de route au moment du choix de ces options.

Nous pouvons maintenant compiler tous les paquets sélectionnés et configurés avec une autre commande poudriere :

poudriere bulk -j 101Ramd64 -f /usr/local/etc/poudriere.d/101Ramd64-list.txt

  il est possible que cette partie soit longue.

Et à la fin, si tout a bien marché, vous devriez avoir quelque chose qui ressemble à cela :

1
2
3
4
5
[00:05:57] ====>> Built ports: devel/rubygem-rubytree mail/p5-Net-SMTP-SSL print/rubygem-rbpdf textproc/asciidoc devel/rubygem-fastercsv net/rubygem-net-ldap www/rubygem-rack-openid lang/p5-Error databases/rubygem-mysql2 textproc/rubygem-coderay devel/rubygem-request_store sysutils/tmux x11-toolkits/tk86 www/rubygem-passenger devel/git www/rubygem-rails graphics/ImageMagick graphics/rubygem-rmagick www/redmine
[101Ramd64-default] [2015-04-24_13h56m41s] [committing:] Queued: 19 Built: 19 Failed: 0  Skipped: 0  Ignored: 0  Tobuild: 0   Time: 00:05:56
[00:05:57] ====>> Logs: /poudriere/data/logs/bulk/101Ramd64-default/2015-04-24_13h56m41s
[00:05:57] ====>> Cleaning up
[00:05:57] ====>> Umounting file systems

Utiliser nos paquets dans l’hôte

Nous avons maintenant une poudriere en état de marche, il faut désormais indiquer au système hôte comment utiliser les paquets compilés par notre poudriere. De nombreux tutoriels expliquent comment utiliser nginx pour faire la distribution. Or, il s’agit d’un des paquets que nous voulons installer.

Nous allons donc utiliser une autre méthode, plus simple, pour cette distribution.

Il faut créer le répertoire /usr/local/etc/pkg/repos dans lequel nous allons créer un fichier,par exemple poudriere.conf, qui va indiquer à la commande pkg où trouver les paquets de notre poudriere.

1
2
3
4
5
poudriere: {
    url: "file:///poudriere/data/packages/101Ramd64-default",
    mirror_type : "srv",
    enabled: yes
} 

Il ne reste plus qu’a tester sur l’hôte que l’on utilise bien la poudriere :

pkg -vv
Repositories:
FreeBSD: { 
url             : "pkg+http://pkg.FreeBSD.org/FreeBSD:10:amd64/latest",
enabled         : yes,
priority        : 0,
mirror_type     : "SRV",
signature_type  : "FINGERPRINTS",
fingerprints    : "/usr/share/keys/pkg"
}
poudriere: { 
url             : "file:///poudriere/data/packages/101Ramd64-default",
enabled         : yes,
priority        : 100,
mirror_type     : "SRV"
}

On peut voir ici que nous utilisons deux dépôts, l’officiel (FreeBSD) et le nôtre (poudriere).

Pour être certains d’utiliser le nôtre, nous allons désactiver FreeBSD. Pour cela nous allons ajouter dans /usr/local/etc/pkg/repos un fichier qui porte le nom du dépôt que nous allons traiter et y mettre :

FreeBSD: { enabled: no }

Si nous testons à nouveau, seul notre dépôt apparait :

pkg -vv
Repositories:
  poudriere: { 
    url             : "file:///poudriere/data/packages/101Ramd64-default",
    enabled         : yes,
    priority        : 100,
    mirror_type     : "SRV"
}

La mise à jour des paquets de la poudriere se fait simplement avec :

pkg upgrade

Il est aussi possible d’ajouter des ports dans le fichier qui liste ceux de notre poudriere. Par exemple, pour redmine, il faut ruby. On peut donc ajouter dans /usr/local/etc/poudriere.d/10Ramd64-list.txt

devel/rubygems-rake

Et recommencer les étapes de choix des options et de compilation.

Nous en avons fini avec la mise en place de la poudriere, je vous renvoie à l’installation de nginx et redmine

Le site web interne de poudriere

Poudriere propose un site interne qui permet de voir l’historique des sessions de build, les fichiers de traces, etc. Pour le mettre en place, il est nécessaire d’avoir un serveur HTTP en état de marche. Le mien est nginx mais la démarche est la même pour apache ou un autre serveur HTTP.

Création du fichier de configuration de l’hôte virtuel

Nous allons créer un nouvel hôte virtuel pour notre configuration. Le mien est dans /usr/local/etc/nginx/sites-available et se nomme poudriere.conf.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
server {
  listen 80;
  server_name poudriere.foucry.net;
  rewrite ^ https://$server_name/$request_uri permanent;
}
server {
  listen 443;
  server_name poudriere.foucry.net;

  root /usr/local/share/poudriere/html;
  allow 198.51.100.23;
  deny all;
  access_log /var/log/nginx/poudriere-access.log main;
  error_log /var/log/nginx/poudriere-error.log;

  ssl on;
  ssl_certificate         /etc/ssl/foucry/foucry.net.pem;
  ssl_certificate_key     /etc/ssl/private/foucry.net.key;
  
  ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';

  ssl_prefer_server_ciphers on;

  ssl_dhparam /etc/ssl/private/dhparams.pem;

  location /packages {
    root /poudriere/data;
    autoindex on;
  }
  location /data {
    alias /poudriere/data/logs/bulk;
    autoindex on;
  }
  add_header Strict-Transport-Security "max-age=31536000; includeSubdomains;";
}
  • La première section server indique que l’on écoute sur le port 80 (le port http par défaut) et que le serveur dois rediriger la requête vers la même url, mais sur le port 443 (le http sécurisé, https) ;
  • la seconde section server commence par indiquer que l’on attend les requêtes sur le port 443 (https) ;
  • on indique ensuite le chemin où se trouvent les fichiers à servir ;
  • nous limitons les accès à une seule adresse IP, celle à partir de laquelle nous allons nous connecter pour suivre notre poudrière. J’ai mis celle de mon accès internet à la maison2 ;
  • les chemins vers les fichiers de traces, celui des accès (poudriere-acces.log) et celui des erreurs (poudriere-error.log) ;
  • on active le mode ssl pour chiffrer les échanges entre le serveur et les clients ;
  • on indique le chemin vers le certificat et la clef de chiffrement ;
  • on indique quels ont les méthodes de chiffrement que l’on accepte et celles, trop faibles ou trouée, que l’on refuse. Celles qui commencent par un point d’exclamation (!) ont celles qui sont refusées ;
  • on indique également que l’on préfère que le chiffrement soit initié par le serveur ;
  • et on met le chemin vers le fichier d’entropie diffie-helleman ;
  • viennent ensuite deux locations qui indiquent les chemins vers deux autres parties du site qui ne sont pas directement sous l’arborescence de root que nous avons vu plus haut.
  • Enfin, on ajoute un en-tête pour indiquer aux clients de nous contacter de préférence en utilisant le port sécurisé.

Index de ma poudriere


  1. Les jails sont une architecture logicielle qui permet d’isoler des processus et leurs descendants. Il est possible de faire tourner dans une jail un système autre que le système hôte. Dans le cas qui nous intéresse dans cet article, nous allons utiliser le même système puisqu’il s’agit de préparer des paquets logiciels binaires pour notre système. Pour plus de précisions, lisez la page wikipedia à ce sujet. ↩︎

  2. si vous n’avez pas d’adresse IP fixe cela peut poser un problème. ↩︎

powered by FreeBSD