Table des matières

Générer des paquets

Cet outil va vous permettre de générer des paquets pour vous et pour les autres, à destination de pkg(8).

Préparation

Installez le port ports-mgmt/poudriere.

Ensuite, configurez /usr/local/etc/poudriere.conf:

--- poudriere.conf.sample       2020-03-27 01:31:05.000000000 +0100
+++ poudriere.conf      2020-04-02 14:57:44.453739000 +0200
@@ -9,14 +9,14 @@
 # You need at least 7GB of free space in this pool to have a working
 # poudriere.
 #
-#ZPOOL=zroot
+ZPOOL=zroot
 
 ### NO ZFS
 # To not use ZFS, define NO_ZFS=yes
 #NO_ZFS=yes
 
 # root of the poudriere zfs filesystem, by default /poudriere
-# ZROOTFS=/poudriere
+ZROOTFS=/poudriere
 
 # the host where to download sets for the jails setup
 # You can specify here a host or an IP
@@ -27,7 +27,7 @@
 # Also note that every protocols supported by fetch(1) are supported here, even
 # file:///
 # Suggested: https://download.FreeBSD.org
-FREEBSD_HOST=_PROTO_://_CHANGE_THIS_
+FREEBSD_HOST=ftp://ftp5.fr.FreeBSD.org
 
 # By default the jails have no /etc/resolv.conf, you will need to set
 # RESOLV_CONF to a file on your hosts system that will be copied has
@@ -204,7 +204,7 @@
 # URL where your POUDRIERE_DATA/logs are hosted
 # This will be used for giving URL hints to the HTML output when
 # scheduling and starting builds
-#URL_BASE=http://yourdomain.com/poudriere/
+URL_BASE=http://popeye.lapinbilly.eu/poudriere/
 
 # This defines the max time (in seconds) that a command may run for a build
  1. ZPOOL, le nombre de votre pool ZFS ;
  2. ZROOTFS, le dataset qui sera créé ;
  3. FREEBSD_HOST, détermine le chemin de téléchargement d'une base freebsd ;
  4. URL_BASE, qui vous êtes.

Créer un répertoire pour recevoir les sources, celui définit dans la configuration, DISTFILES_CACHE:

$ mkdir -p /usr/ports/distfiles

Optimisation

Réglez la patrouille de contrôle mémoire au plus juste:

/etc/sysctl.conf
vm.pageout_oom_seq=1024

Une poudrière

Une poudrière est une jail qui va compiler et générer les paquets destiné à une machine FreeBSD. Les machines auxquelles vous destinez les paquets déterminent la release de la jail. Ces paquets sont compilés suivant un arbre des ports et des options déterminés.

Les paquets

Donner une liste de paquets à compiler dans un fichier, qui sera utilisé avec l'option -f de poudriere. Une entrée de la liste se compose de la catégorie puis du nom du port à générer, sous la forme <cat>/<nom>. Par exemple:

david@machine:~ % cat /usr/local/etc/poudriere.d/liste_des_ports
databases/mysql56-server
databases/postgresql11-server
databases/postgresql11-client
databases/redis
databases/pecl-redis
devel/pecl-APCu
editors/vim-console
net/boinc-client
ports-mgmt/pkg
security/sudo
www/owncloud

Vous pouvez obtenir la liste des paquets déjà simplement grâce à la formule cryptique:

pkg query -e '%#r == 0' '%o' | sort -d

ou, tout simplement, via les raccourcis:

pkg prime-origins
pkg prime-list

Pour obtenir la liste de tous les paquets installés, dépendances comprises:

pkg info -qoa

Options

Déterminer des options à appliquer par défaut à ces paquets en créant un fichier de la forme <jail>_<arbre des ports>-make.conf, à placer dans usr/local/etc/poudriere.d/

david@machine:~ % cat /usr/local/etc/poudriere.d/own12-default-make.conf
CPUTYPE?=k8-sse3
OPTIONS_UNSET=DOC DOCS NLS X11 EXAMPLES EXAMPLE XCB WAYLAND DEBUG FONTCONFIG TEST TESTS OPENGL DTRACE INFO BE_STANDARD
OPTIONS_UNSET+=CUPS MANPAGES DEMO DEMOS
OPTIONS_UNSET+=GSSAPI_BASE GSSAPI_MIT
OPTIONS_SET=GSSAPI_HEIMDAL OPENMP
ftp_curl_UNSET=TLS_SRP
OPTIONS_SET+= OPTIMIZED_FLAGS OPTIMIZED_CFLAGS OPENMP FREEBSD BE_FREEBSD
DEFAULT_VERSIONS+=ssl=libressl
DEFAULT_VERSIONS+=imagemagick=7-nox11
DEFAULT_VERSIONS+=llvm=18
DEFAULT_VERSIONS+=php=8.3
# <cat>_<port>_{UNSET|SET}=OPTION
# exemple:
# www_node18_SET=BUNDLED_SSL
# 
Pour gérer les options individuellement, ou pour gérer les conflits, lancez poudriere options.

Générer des paquets

Créez une jail qui va compiler vos ports. Seuls les clients d'une release identique seront acceptés.

$ poudriere jail -j fbsd13 -c -v 13.1-RELEASE

ou, pour compiler une version depuis les sources, si vous voulez générez des paquets uniquement pour -Stable ou -Current:

poudriere jail -c -j stable13 -m git -v stable/13
Depuis fin 2020, les sources sont disponibles sous git.

Créez au moins un arbre de ports:

$ poudriere ports -c
Depuis Avril 2021, les dépôts sont disponibles sous git uniquement. A ce jour portsnap ne sait pas le gérer. Précisez le en attendant que ce soit l'option par défaut.
$ poudriere ports -c -U https://git.freebsd.org/ports.git -m git -B main

Sans préciser de nom à ce dernier, il s'agira de default.

Définissez vos options, au besoin:

$ poudriere options -j fbsd13 -C www/nginx
$ poudriere options -j fbsd13 -C -f liste_des_ports

Créer un paquet:

$ poudriere bulk -j fbsd13  www/nginx

voire, tous:

$ poudriere bulk -j fbsd13  -f liste_des_ports

Configuration web

Vous aurez besoin d'un serveur web, comme nginx. Configurez le :

/usr/local/etc/nginx/nginx.conf
server {
                http2 on;
                listen 80 accept_filter=httpready; 
                listen [::]:80 accept_filter=httpready;
                server_name  popeye.lapinbilly.eu ;
                root         /usr/local/share/poudriere/html;
 
                # Allow caching static resources
                location ~* ^.+\.(jpg|jpeg|gif|png|ico|svg|woff|css|js|html)$ {
                        add_header Cache-Control "public";
                        expires 2d;
                }
 
                # redirect server error pages to the static page /50x.html
                #
                error_page   500 502 503 504  /50x.html;
                location = /50x.html {
                        root   /usr/local/www/nginx-dist;
                }
 
                #access_log  logs/host.access.log  main;
 
                location /data {
                        alias /usr/local/poudriere/data/logs/bulk;
                        # Allow caching dynamic files but ensure they get rechecked
                        location ~* ^.+\.(log|txz|tbz|bz2|gz)$ {
                                add_header Cache-Control "public, must-revalidate, proxy-revalidate";
                        }
 
                        # Don't log json requests as they come in frequently and ensure
                        # caching works as expected
                        location ~* ^.+\.(json)$ {
                                add_header Cache-Control "public, must-revalidate, proxy-revalidate";
                                access_log off;
                                log_not_found off;
                        }
 
                        # Allow indexing only in log dirs
                        location ~ /data/?.*/(logs|latest-per-pkg)/ {
                                autoindex on;
                        }
                        break;
                }
                location /packages {	 
                        root /usr/local/poudriere/data;	 
                        autoindex on;	 
                }
        }

Vous trouverez un exemple complet avec les sources.

Signatures

Pour vous assurer de la validité des paquets que vous allez télécharger, créer une clef de signature:

# cd /usr/local/etc/ssl
# mkdir -p keys
# mkdir -p certs
# openssl genrsa -out keys/poudriere.key 4096
# openssl rsa -in keys/poudriere.key -pubout > certs/poudriere.cert

Demandez à vos poudrieres de signer les paquets:

/usr/local/etc/poudriere.conf
PKG_REPO_SIGNING_KEY=/usr/local/etc/ssl/keys/poudriere.key

Les clients

Précisez un dépôt pour pkg(8):

/usr/local/etc/pkg/repos/lapinbilly.conf
lapinbilly: {
    url: "http://popeye.lapinbilly.eu/packages/fbsd13-default/",
    mirror_type: "none",
    enabled: yes,
    priority:99
}

Évitez de multiplier les dépôts, c'est une source d'emmerdes.Désactivez par exemple ceux de FreeBSD:

/usr/local/etc/pkg/repos/freebsd.conf
FreeBSD: {
    enabled: no,
    priority:0
}

Si vos poudrière utilisent une signature, copiez le certificat et utilisez le:

/usr/local/etc/pkg/repos/freebsd.conf
lapinbilly: {
...
	signature_type: "pubkey",
	pubkey: "/usr/local/etc/ssl/certs/poudriere.cert",
	fingerprints: "/usr/share/keys/pkg",
...

Vous pouvez aussi intégrer cette entrée dans la configuration de votre propre dépôt.

Connectez vous ensuite sur vos dépôts.

Les ports

Pour mettre à jour les paquets installé, puis nettoyer la base, tapez:

$ pkg upgrade && pkg clean -a && pkg autoremove

Au fil du temps, vous aurez probablement installé des paquets compilés directement par bulk sans les intégrer dans le fichier. Pour déterminer les paquets installés, tapez:

$ pkg query -e '%#r == 0' '%o (%v)' | sort -d

Les versions récentes de pkg offre deux raccourcis pour ça: prime-list et prime-origins. Vous trouverez une liste d'alias dans /usr/local/etc/pkg.conf.

Ccache

Pour optimiser le tout, il est recommandé d'utiliser un cache, partagé entre toutes les compilations et toutes les jails. C'est le rôle de ccache

Décommettez simplement la ligne:

/usr/local/etc/poudriere.conf
CCACHE_DIR=/var/cache/ccache

Et ajoutez de manière générale CCACHE à tous vos paquets:

/usr/local/etc/poudriere.d/make.conf
WITH_CCACHE_BUILD=yes
CCache semble pris en compte, même sans cette précision.

Et configurez le cache selon vos moyens:

:~> env CCACHE_DIR=/var/cache/ccache ccache -o MAXSIZE=10G

Vérifiez l'efficacité du cache:

:~> env CCACHE_DIR=/var/cache/ccache ccache -s
cache directory                     /var/cache/ccache
primary config                      /var/cache/ccache/ccache.conf
secondary config      (readonly)    /usr/local/etc/ccache.conf
stats updated                       Sat Apr 22 07:50:20 2023
cache hit (direct)              19240516
cache hit (preprocessed)         3602783
cache miss                       9215161
cache hit rate                     71.26 %
called for link                  3954747
called for preprocessing         1794346
multiple source files               1148
compiler produced stdout              79
compiler produced no output          594
compiler produced empty output      3934
compile failed                    537257
ccache internal error               3620
preprocessor error                439936
can't use precompiled header     3770863
cache file missing                 44463
bad compiler arguments            139016
unsupported source language         2836
autoconf compile/link            2938851
unsupported compiler option       130234
unsupported code directive           916
could not write to output file        11
no input file                    1056224
cleanups performed                 15131
files in cache                    497326
cache size                           4.2 GB
max cache size                      10.0 GB

En savoir plus