====== 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 ===== [[https://www.freebsd.org/doc/handbook/ports.html|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 - ''ZPOOL'', le nombre de votre [[https://www.freebsd.org/doc/handbook/zfs-term.html#zfs-term-pool|pool ZFS]] ; - ''ZROOTFS'', le [[https://www.freebsd.org/doc/handbook/zfs-term.html#zfs-term-dataset|dataset]] qui sera créé ; - ''FREEBSD_HOST'', détermine le chemin de téléchargement d'une base freebsd ; - ''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: vm.pageout_oom_seq=1024 ===== Une poudrière ===== Une //poudrière// est une [[::jails:zfs|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 ''/''. 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 ''_-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 OPTIONS_SET=OPTIMIZED_FLAGS OPTIMIZED_CFLAGS OPENMP FREEBSD DEFAULT_VERSIONS+=php=8.3 DEFAULT_VERSIONS+=ssl=libressl # __{UNSET|SET}=OPTION # exemple: # www_node18_SET=BUNDLED_SSL # * ''OPTIONS_UNSET'' et ''OPTIONS_SET'' définissent les options à activer/désactiver par défaut. * ''DEFAULT_VERSION'' va déterminer [[https://www.freebsd.org/doc/en_US.ISO8859-1/books/porters-handbook/flavors.html|les flavors]] à appliquer à votre liste. Ici, c'est la version 8.3 de [[::ports:web:php|php]] qui prime. La deuxième ligne précise le port qui va répondre aux dépendances ''USES=ssl'', ici ''libressl''. Pour gérer les options individuellement, ou pour gérer les conflits, lancez ''poudriere options''. ==== Générer des paquets ==== Créez une [[https://www.freebsd.org/doc/handbook/jails.html|jail]] qui va compiler vos [[https://www.freebsd.org/doc/handbook/ports.html|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 [[https://www.freebsd.org/doc/handbook/ports-using.html|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 [[ports:nginx]]. Configurez le : server { 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 [[https://github.com/freebsd/poudriere/blob/master/src/share/examples/poudriere/nginx.conf.sample|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: PKG_REPO_SIGNING_KEY=/usr/local/etc/ssl/keys/poudriere.key ===== Les clients ===== Précisez un dépôt pour pkg(8): 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: FreeBSD: { enabled: no, priority:0 } Si vos poudrière utilisent une signature, copiez le certificat et utilisez le: 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 [[http://poudriere.lapinbilly.eu/jail.html?mastername=popeye13-default | 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 [[ https://www.freshports.org/devel/ccache/ | ccache ]] Décommettez simplement la ligne: CCACHE_DIR=/var/cache/ccache Et ajoutez de manière générale CCACHE à tous vos paquets: 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 ===== * poudriere(8). * pkg(8). * [[ https://www.freebsd.org/doc/handbook/ports-poudriere.html | le manuel ]]