Comment construire et déployer des paquets pour vos serveurs FreeBSD en utilisant Buildbot et Poudriere

L’auteur a sélectionné le Free and Open Source pour recevoir un don dans le cadre du Write for DOnations programme.

introduction

La collection de paquets et de paquets de FreeBSD, appelée ci-après ports tree, est le système de construction de logiciels externes de FreeBSD. Il offre un moyen cohérent de construire des paquets à l’aide de la méthode https://www.freebsd.org/doc/en_US.ISO8859-1/books/developers-handbook/tools-make.html[Makefilehner-baseded. Le port fait référence à la recette de construction, c’est-à-dire le Makefile et les fichiers associés; tandis que package est le résultat de la construction d’un port dans une archive binaire (compressée) des fichiers du paquet et de ses méta-informations.

Il est possible de créer et d’installer manuellement un sous-ensemble ou la totalité des plus de 30 000 ports avec + make install +. Toutefois, les versions s’exécuteraient sur l’un de vos serveurs et non dans un environnement propre. Pour les cas d’utilisation en production, les constructions manuelles signifieraient également que chaque hôte a besoin de la même révision de l’arborescence des ports et doit compiler tous les packages pour lui-même. Cela signifie un travail répétitif et sujet aux erreurs de la part des humains et des serveurs. Il est préférable de récupérer et d’utiliser des packages binaires identiques et prédéfinis sur chaque hôte et de les servir à partir d’un référentiel de packages sécurisé et central.

Pour ce faire, Poudriere est l’outil standard de FreeBSD pour créer, tester et auditer les packages, ainsi que pour gérer les référentiels de packages. Chaque génération est exécutée de manière isolée dans une nouvelle https://www.digitalocean.com/community/tutorials/how-to-install-buildbot-freebsd#step-1-%E2%80%93-setting-up-jails-for -the-buildbot-master-and-worker [prison], exécutant la version souhaitée de FreeBSD et démarrant sans qu’aucun package ne soit installé. Seul le système de base, ainsi que toutes les dépendances explicitement spécifiées, sont disponibles pour la nouvelle génération. Poudriere prend en charge la reconstruction des packages lorsque cela est nécessaire, ainsi que la mise à jour du référentiel de packages une fois la construction terminée. L’outil de ligne de commande + poudriere + est essentiel pour l’administration de différentes arborescences de ports, de versions de FreeBSD, d’options de construction de ports et, enfin, pour l’exécution des générations.

Dans ce didacticiel, vous allez configurer Poudriere, créer un ensemble de packages souhaités, configurer l’hébergement de paquets basé sur HTTP et automatiser la construction à l’aide de Buildbot en tant que plate-forme d’intégration continue. Enfin, vous accéderez en toute sécurité aux packages à partir d’un ordinateur client.

Conditions préalables

Avant de commencer ce guide, vous aurez besoin de:

  • Un serveur sous FreeBSD 11.2. Si vous débutez avec FreeBSD, vous trouverez peut-être utile de personnaliser ce serveur en suivant notre guide à l’adresse https://www.digitalocean.com/community/tutorials/how-to-get-started-with-freebsd [ Comment se lancer avec FreeBSD].

  • Note: * FreeBSD 12.0 a actuellement un issue avec des jails imbriqués, qui doit d’abord être corrigé avant que 12.x ne puisse être utilisé pour cela. Didacticiel.

  • 10 Go d’espace disque libre ou plus pour disposer d’une capacité suffisante pour stocker les packages et les journaux.

  • Une configuration de base de Buildbot en complétant le tutoriel Comment configurer Buildbot sur FreeBSD.

  • Un autre serveur exécutant FreeBSD, la même version, que vous allez utiliser en tant que client pour extraire et installer les packages que vous allez créer et héberger automatiquement dans un référentiel de packages basé sur HTTP / HTTPS.

Étape 1 - Installation de Poudriere pour une utilisation dans Buildbot Worker

Après avoir terminé le didacticiel préalable, vous disposerez d’un jongleur Buildbot et d’un serveur de travail, ainsi que d’une configuration Nginx. Vous allez construire sur cette configuration existante dans les étapes suivantes. Dans cette première étape, vous allez installer l’outil de génération Poudriere dans la prison de travail, car c’est à ce stade que le processus de travail de Buildbot déclenchera ultérieurement les générations.

Connectez-vous à votre serveur hébergeant Buildbot et ouvrez un shell * root * dans la prison de travail à l’aide de la commande suivante:

sudo jexec buildbot-worker0 csh

Installez Poudriere en tant que paquet:

pkg install poudriere

Puis confirmez l’installation en appuyant sur + y + puis sur + ENTER +.

Vous avez correctement installé le dernier outil Poudriere et ses dépendances. Au cours des prochaines étapes, vous allez vous préparer à configurer Poudrière.

Étape 2 - Création d’une clé de signature de package (facultatif)

Il est recommandé de configurer des signatures numériques pour les packages construits afin de renforcer la sécurité. Ignorez cette étape si vous souhaitez sécuriser votre installation ultérieurement ou différemment. Sinon, allons de l’avant et créons une paire de clés utilisée pour signer les packages (à l’aide de la clé privée) et vérifier les packages (à l’aide de la partie publique).

Les paquets, par défaut, sont construits sous la forme de fichiers + .txz +, qui sont des fichiers compressés fortement compressés du contenu du paquet. Les sommes de contrôle des fichiers compressés, ainsi que le traitement des fichiers via HTTP / HTTPS (sommes de contrôle TCP), offrent déjà une certaine protection contre les données corrompues. Le contenu du package comprend généralement des fichiers et des répertoires, ainsi que des méta-informations telles que le nom du package, sa version et diverses options. Les fichiers peuvent même inclure des programmes setuid-able (comme indiqué dans le paquet + sudo + bien que sudo ne soit pas intégré à FreeBSD), et le Les scripts au moment de l’installation s’exécutent en tant qu’utilisateur * root *. L’installation à partir de sources non vérifiées pose donc un risque de sécurité.

En servant les packages via HTTPS, vous ne pouvez pas détecter si une personne a altéré les packages sur le disque. L’intégrité et l’authenticité de vos paquets peuvent être ajoutés en configurant Poudriere pour qu’il signe le référentiel de paquets avec une clé privée RSA. Les condensés signés et la clé publique correspondante sont ainsi stockés dans le fichier + digests.txz + du référentiel de paquets. La paire de clés requise (clé privée et publique RSA) peut rester longtemps inchangée sauf si la clé privée a été perdue ou compromise.

Dans cette étape, vous allez créer la paire de clés sur laquelle les générations sont exécutées (jail de travail) et télécharger la partie publique pour une utilisation ultérieure sur les clients de package (décrite dans une étape ultérieure).

Assurez-vous d’être toujours dans le shell de la prison de travail * root *.

Créez une nouvelle clé privée RSA:

openssl genrsa -out /usr/local/etc/poudriere.key 4096

Le fichier de clé privée doit uniquement être accessible par * root * - l’utilisateur qui exécute Poudriere. Protégez ses permissions d’accès:

chmod 0600 /usr/local/etc/poudriere.key

Plus tard, vous aurez besoin de la clé publique disponible sur les clients pour la vérification des signatures de package. Extrayons maintenant la clé publique:

openssl rsa -in /usr/local/etc/poudriere.key -pubout -out /tmp/poudriere.pub

Enfin, téléchargez le fichier de clé publique à partir de votre propre ordinateur:

scp :/usr/jails/buildbot-worker0/tmp/poudriere.pub /tmp/poudriere.pub

Ceci conclut la création facultative d’une paire de clés pour la signature du paquet. Vous configurerez ultérieurement la signature réelle avec Poudriere et utiliserez le fichier de clé publique téléchargé sur les clients pour la vérification.

Une autre étape optionnelle est la suivante: si vous utilisez le système de fichiers ZFS, Poudriere peut l’utiliser pour accélérer les générations. Sinon, vous pouvez passer à https://www.digitalocean.com/community/tutorials/how-to-build-and-de-deploy-packages-for-your-freebsd-servers-using-buildbot-and-poudriere#step- 4-% E2% 80% 94-configuring-poudriere, -the-build-jail, -et-the-ports-tree [Étape 4] pour configurer Poudriere afin de se préparer à l’exécution de la première construction.

Étape 3 - Configuration de ZFS (facultatif)

Cette étape ne s’applique que si vous exécutez un système FreeBSD sur le système de fichiers ZFS. Par exemple, si vous utilisez une gouttelette DigitalOcean, l’image est intitulée * x64 zfs * (pour FreeBSD). Au cours de cette étape, vous allez créer les systèmes de fichiers que Poudriere peut utiliser pour créer et gérer des jails plus rapidement, ce qui peut potentiellement accélérer vos générations.

Vous pouvez savoir si vous utilisez ZFS en répertoriant les pools. Assurez-vous que vous êtes sur le shell du serveur, pas dans une prison.

exit

Exécutez la commande suivante pour répertorier les zpools:

sudo zpool list

Si un pool est disponible, il imprimera les informations le concernant:

OutputNAME    SIZE  ALLOC   FREE  CKPOINT  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
zroot   148G  94.4G  54.1G        -         -    66%    63%  1.00x  ONLINE  -

Sinon, si le support ZFS n’est pas disponible, l’outil imprimera + aucun pool disponible + +, ou + n’a pas pu initialiser la bibliothèque ZFS + `. Cela signifie qu’aucun de vos systèmes n’utilise ZFS; dans ce cas, passez à l’étape suivante. Si vous avez décidé d’utiliser un autre type de disque ou de stockage, tel que le système de fichiers UFS, vous pouvez également passer à l’étape suivante.

Si vous prévoyez d’utiliser ZFS, mémorisez le nom du pool imprimé sur lequel vous souhaitez stocker les données relatives à la construction. Vous devez planifier plusieurs giga-octets de stockage.

ZFS est utile pour séparer les différents jeux de données de Poudriere, tels que les jails de construction, les arborescences de ports, les journaux, les packages et autres données. Celles-ci sont stockées indépendamment et peuvent donc être supprimées rapidement avec la certitude de ne pas laisser d’espace ou de traces.

Pour que Poudriere puisse utiliser ZFS, vous devez effectuer trois opérations: créer un jeu de données ZFS parent, autoriser la création et la suppression de jeux de données ZFS (ce que le jail Buildbot worker ou tout autre jail ne peut pas faire par défaut) et éditer La configuration de Poudrière en conséquence.

Dans le didacticiel relatif aux prérequis, vous avez configuré la prison de travailleur Buildbot dans + / etc / jail.buildbot-worker0.conf +. Ouvrez ce fichier avec votre éditeur de texte préféré et ajoutez les lignes suivantes en surbrillance pour déléguer un ensemble de données parent afin de permettre à la prison d’administrer des ensembles de données ZFS situés sous le parent. N’oubliez pas de remplacer + zroot + par le nom de votre pool souhaité:

sudo ee /etc/jail.buildbot-worker0.conf

/etc/jail.buildbot-worker0.conf

buildbot-worker0 {
   host.hostname = buildbot-worker0.localdomain;
   ip4.addr = "lo1|10.0.0.3/24";
   path = "/usr/jails/buildbot-worker0";
   exec.start = "/bin/sh /etc/rc";
   exec.stop = "/bin/sh /etc/rc.shutdown";
   mount.devfs; # need /dev/*random for Python
   persist;


}

Dans cet article, nous allons stocker les données liées à la construction sur le pool ZFS + zroot + -veuillez adapter cette configuration liée à ZFS ici et dans le reste de l’article si vous avez choisi un pool d’un nom différent.

Après avoir ajouté ce contenu, enregistrez et quittez l’éditeur. Si vous utilisez + ee +, faites-le en pressant + CTRL + C +, en tapant + exit + et en appuyant sur + ENTER +.

Créez le jeu de données ZFS parent mentionné dans le fichier de configuration:

sudo zfs create zroot/pdr
sudo zfs create zroot/pdr/w0

Cela suppose délibérément que vous souhaitiez éventuellement ajouter davantage de travailleurs et crée donc un sous-jeu de données pour votre premier travailleur. Le nom du jeu de données manque volontairement, car les anciennes versions de FreeBSD (antérieures à 12.0) avaient une limite de nom de montage de 88 caractères.

Pour qu’une prison prenne le contrôle d’un jeu de données parent et administre tous les enfants, le jeu de données doit être marqué avec l’indicateur suivant:

sudo zfs set jailed=on zroot/pdr/w0

Avec les conditions préalables remplies, la prison démarrera correctement avec la nouvelle configuration:

sudo service jail restart buildbot-worker0

Avec ces instructions, vous avez créé avec succès les ensembles de données systèmes de fichiers requis-ZFS et autorisé le jail à gérer l’ensemble de données parent. Dans l’étape suivante, vous allez configurer Poudriere, ce qui implique de spécifier le zpool choisi et le jeu de données utilisé pour stocker les données relatives à la construction.

Étape 4 - Configuration de Poudriere, du build Jail et de l’arborescence des ports

Jusque-là, vous avez installé Poudriere et éventuellement couvert la configuration requise pour la signature de paquet et ZFS. Pour que Poudriere puisse s’exécuter «en prison», c’est-à-dire qu’il fonctionne correctement à partir de la prison de travail de Buildbot, vous devez fournir certaines autorisations à la prison. Par exemple, si vous utilisez ZFS, vous avez déjà délégué un ensemble de données parent pour utilisation et administration par la prison.

Commençons par configurer l’adresse IP de bouclage et toutes les autorisations, puis explorons la signification en respectant les modifications.

Poudriere veut créer deux jails de build par build: l’un avec réseau mis en boucle uniquement et l’autre avec accès Internet. Seules les étapes de construction supposées atteindre Internet utiliseront ce dernier. Par exemple, le + fetch + peut télécharger les archives source, mais la phase + build + n’est pas autorisée à accéder à Internet. La configuration existante de la prison de travail a + ip4.addr =" lo1 | 10.0.0.3/24 "+ qui permet l’accès à Internet. Afin de permettre à Poudriere d’attribuer une adresse de bouclage à des jails de construction récemment démarrés, l’adresse IP doit également être transmise à son parent (le jail ouvrier). Pour que cela fonctionne, veuillez vous assurer que vous avez appliqué la dernière version du fichier de configuration du pare-feu + / usr / local / etc / ipfw.rules + du didacticiel prérequis, ce qui empêchera l’interface de bouclage + lo0 + d’ouvrir les connexions sortantes. à travers NAT.

Ajoutez les lignes en surbrillance à la configuration de votre prison en environnement de travail:

sudo ee /etc/jail.buildbot-worker0.conf

/etc/jail.buildbot-worker0.conf

buildbot-worker0 {
   host.hostname = buildbot-worker0.localdomain;
   ip4.addr = "lo1|10.0.0.3/24";

   path = "/usr/jails/buildbot-worker0";
   exec.start = "/bin/sh /etc/rc";
   exec.stop = "/bin/sh /etc/rc.shutdown";
   mount.devfs; # need /dev/*random for Python
   persist;

   # If you followed the ZFS setup step, you have this line
   # already (keep it). For non-ZFS setup, this line must be absent.
   exec.poststart = "/sbin/zfs jail buildbot-worker0 zroot/pdr/w0";













}

Vous avez ajouté ce qui suit (voir également la page de manuel jail(8)):

  • + ip4.addr + =" lo0 | 127.0.0.3 "+ ajoute une autre adresse IPv4 à la prison. Vous configurerez plus tard la variable + LOIP4 + de Poudriere afin d’attribuer cette adresse de bouclage à des jails qui ne sont pas supposés communiquer avec Internet ou d’autres machines de votre réseau, comme lors de la phase + build +. Si vous avez déjà une version qui nécessite un accès Internet, Poudriere prend en charge la variable + ALLOW_NETWORKING_PACKAGES + comme solution de contournement. Cependant, il est préférable de suivre les meilleures pratiques et d’effectuer des téléchargements et d’autres tâches liées à Internet plus tôt, dans la phase + fetch + pour laquelle Poudriere autorise l’accès à Internet.

  • + allow.chflags + permet à Poudriere de rendre certains fichiers système comme + / bin / sh + immuables dans la prison de construction.

  • + allow.mount + et les autres options + allow.mount. * + permettent à Poudriere de monter certains systèmes de fichiers requis dans les jails de construction.

  • + allow.raw_sockets + qui autorise l’utilisation de sockets bruts, et + allow.socket_af + qui permet l’utilisation de toute famille d’adresses de socket, sont tous deux appliqués aux jails de construction compatibles Internet. Ceci est utile pour que vous puissiez exécuter des outils tels que + ping + en mode interactif, comme lorsque vous entrez dans une prison de construction pour résoudre les problèmes.

  • + allow.sysvipc + est déconseillé au lieu de trois paramètres distincts + sysvmsg + / + sysvsem + / + + sysvshm + pour limiter les jails à ne voir que leurs propres objets de mémoire partagée (via les primitives IPC «SYS V»). Cependant, Poudriere peut uniquement transmettre + allow.sysvipc + pour construire des jails car il ne peut pas lire les informations sysctl pertinentes pour les trois paramètres séparés (à partir de FreeBSD 11.2). Avec cette configuration obsolète, le jail pourrait lire la mémoire partagée de processus en dehors du jail. Cela concerne uniquement certains logiciels dépendant de fonctionnalités IPC, telles que PostgreSQL, ce qui réduit les risques d’affecter la sécurité. Vous pouvez supprimer cette configuration sauf si vous dépendez d’un port qui en a besoin lors de la construction.

  • + children.max = 16 + autorise 16 sous-prisons en dessous de la prison des travailleurs. Vous pouvez augmenter ce nombre ultérieurement si vous avez beaucoup de processeurs et que Poudriere tente de créer plus de jails de construction que ceux autorisés. Chaque construction Poudriere essaiera de créer un jail de référence et deux jails de construction par «travail». Son choix par défaut consiste à utiliser le nombre de processeurs (en sortie de + sysctl -n hw.ncpu +) comme nombre de travaux.

  • + enforce_statfs = 1 + est requis avec + allow.mount + pour monter certains systèmes de fichiers.

Enregistrez et quittez le fichier de configuration.

Redémarrez la prison pour que sa configuration prenne effet immédiatement:

sudo service jail restart buildbot-worker0

Les modules de noyau respectifs doivent être chargés pour que Poudriere puisse effectuer des montages. Exécutez les commandes suivantes pour charger les modules au démarrage et immédiatement:

sudo sysrc -f /boot/loader.conf nullfs_load=YES
sudo kldload -n nullfs
sudo sysrc -f /boot/loader.conf tmpfs_load=YES
sudo kldload -n tmpfs

Vous avez déjà installé le paquet Poudriere précédemment, qui a copié le fichier exemple + / usr / local / etc / poudriere.conf.sample + dans + / usr / local / etc / poudriere.conf +. Ensuite, vous apporterez des modifications au fichier de configuration. Toutes les variables de configuration possibles existent déjà dans l’exemple; par conséquent, supprimez la mise en commentaire ou adaptez la ligne correspondante dans le fichier pour définir une variable à une certaine valeur.

Pour les commandes suivantes, veuillez vous assurer que vous vous trouvez toujours dans un shell * racine * dans la prison de travail:

sudo jexec buildbot-worker0 csh

Ouvrez le fichier avec la commande suivante:

ee /usr/local/etc/poudriere.conf

Si vous avez décidé d’utiliser ZFS, veuillez renseigner votre ensemble de données zpool et parent souhaité:

/usr/local/etc/poudriere.conf (extrait)

. . .
# Poudriere can optionally use ZFS for its ports/jail storage. For
# ZFS define ZPOOL, otherwise set NO_ZFS=yes
#
#### ZFS
# The pool where poudriere will create all the filesystems it needs
# poudriere will use ${ZPOOL}/${ZROOTFS} as its root
#
# You need at least 7GB of free space in this pool to have a working
# poudriere.
#


### NO ZFS
# To not use ZFS, define NO_ZFS=yes


# root of the poudriere zfs filesystem, by default /poudriere

. . .

Sinon, si vous avez décidé de ne pas utiliser ZFS, veuillez désactiver le support ZFS:

/usr/local/etc/poudriere.conf (extrait)

. . .
# Poudriere can optionally use ZFS for its ports/jail storage. For
# ZFS define ZPOOL, otherwise set NO_ZFS=yes
#
#### ZFS
# The pool where poudriere will create all the filesystems it needs
# poudriere will use ${ZPOOL}/${ZROOTFS} as its root
#
# You need at least 7GB of free space in this pool to have a working
# poudriere.
#
#ZPOOL=zroot

### NO ZFS
# To not use ZFS, define NO_ZFS=yes


# root of the poudriere zfs filesystem, by default /poudriere
# ZROOTFS=/poudriere
. . .

Vous demanderez plus tard à Poudriere de télécharger un système de base FreeBSD et d’amorcer ainsi la première construction jail. Cela nécessite de spécifier un hôte de téléchargement, ajoutez la ligne en surbrillance suivante:

/usr/local/etc/poudriere.conf (extrait)

. . .
# the host where to download sets for the jails setup
# You can specify here a host or an IP
# replace _PROTO_ by http or ftp
# replace _CHANGE_THIS_ by the hostname of the mirrors where you want to fetch
# by default: ftp://ftp.freebsd.org
#
# Also note that every protocols supported by fetch(1) are supported here, even
# file:///
# Suggested: https://download.FreeBSD.org

Etant donné que Poudriere sera exécuté en prison, la limite de noms de montage de 88 caractères des versions de FreeBSD antérieures à la version 12.0 est particulièrement préjudiciable, car le chemin complet du jail + / usr / jails / buildbot-worker0 + fait partie de chaque chemin de montage. Dépasser la limite casserait fatalement les constructions, alors prenons soin de réduire la longueur des chemins. Au lieu du répertoire typique + / usr / local / poudriere +, vous pouvez utiliser + / pdr + comme suit:

/usr/local/etc/poudriere.conf (extrait)

. . .
# The directory where poudriere will store jails and ports

Maintenant, créez ce répertoire:

mkdir /pdr

Basculez encore vers votre éditeur de + poudriere.conf +:

ee /usr/local/etc/poudriere.conf

Poudriere montera un répertoire central pour dist files (l’archive de code source de chaque port) lors de l’exécution de générations afin que tous les générateurs partagent le même cache. Le répertoire par défaut est:

/usr/local/etc/poudriere.conf (extrait)

. . .
# If set the given directory will be used for the distfiles
# This allows to share the distfiles between jails and ports tree
# If this is "no", poudriere must be supplied a ports tree that already has
# the required distfiles.

Maintenant, créez ce répertoire:

mkdir -p /usr/ports/distfiles

Si vous avez suivi l’étape 2 et créé une clé de signature du référentiel de packages, entrez à nouveau dans l’éditeur et spécifiez-le:

ee /usr/local/etc/poudriere.conf

/usr/local/etc/poudriere.conf (extrait)

. . .
# Path to the RSA key to sign the PKG repo with. See pkg-repo(8)

Les constructions s’exécuteront beaucoup plus rapidement si vous mettez en cache les sorties du compilateur C / C ++ et de l’éditeur de liens pour la prochaine fois. L’arborescence des ports le supporte directement en utilisant l’outil ccache. Veuillez l’activer et créer le répertoire de cache respectif si vous pouvez économiser au moins 5 Go d’espace disque supplémentaire (taille du cache par défaut):

/usr/local/etc/poudriere.conf (extrait)

. . .
# ccache support. Supply the path to your ccache cache directory.
# It will be mounted into the jail and be shared among all jails.
# It is recommended that extra ccache configuration be done with
# ccache -o rather than from the environment.
mkdir /var/cache/ccache

La création et l’exploitation de logiciels Linux étant inhabituelles, désactivez-les jusqu’à ce que vous en ayez besoin:

ee /usr/local/etc/poudriere.conf

/usr/local/etc/poudriere.conf (extrait)

. . .
# Disable linux support

Une adresse de bouclage doit être attribuée aux jails, sinon Poudrière en avertira. Nous pouvons hériter de l’adresse IP de la prison car elle se trouve sur une interface réseau à boucle unique (+ lo1 +). Pour cela, veuillez ajouter la ligne suivante à la fin du fichier de configuration:

/usr/local/etc/poudriere.conf (extrait)

Enregistrez et quittez le fichier de configuration.

Pour les versions de travail, nous avons besoin de deux ressources supplémentaires: un système de base FreeBSD à utiliser comme modèle de construction jail et une arborescence de ports à jour. Choisissez la version de FreeBSD que vous ciblez. Dans ce tutoriel, nous dirons à Poudriere de télécharger FreeBSD pour architecture. Vous pouvez nommer la prison comme bon vous semble, mais un schéma de nommage cohérent comme + 112amd64 + est recommandé. Gardez également à l’esprit le choix entre des branches trimestrielles et stables de l’arborescence des ports (ici, nous utilisons + 2019Q2 +) et la branche «en pointe» qui pourrait conduire à une rupture des versions après des mises à jour de temps en temps. Les versions de FreeBSD plus récentes que celles du serveur ne peuvent pas être utilisées dans la prison de construction.

Téléchargez et créez la prison de construction:

poudriere jail -c -j  -v  -a

Enfin, téléchargez l’arbre des ports. La méthode de téléchargement par défaut est portsnap, qui utilise des instantanés compressés de l’arbre sans informations d’historique. Subversion ou Git sont préférables pour fusionner les modifications en amont ou pour contribuer en retour. Cela est également important si vous souhaitez utiliser une arborescence personnalisée et auto-hébergée dans un système de contrôle de version. Dans la commande suivante, veuillez renseigner l’année et le trimestre en cours.

Si vous voulez commencer par l’arbre des ports officiels amont:

poudriere ports -c -p  -m  -B

La méthode + svn + https + serait synchronisée à partir de l’hôte FreeBSD Subversion (viewable en ligne ici). Si vous envisagez d’utiliser une source alternative, lisez la note suivante, sinon ignorez-la.

Les arbres disponibles peuvent être listés avec + poudriere ports -l +, ce qui donne une liste comme:

OutputPORTSTREE METHOD    TIMESTAMP           PATH
2019Q2    svn+https 2019-04-20 19:23:19 /pdr/ports/2019Q2

Vous avez maintenant terminé la configuration de la configuration et des ressources de Poudrière. Vous avez configuré Poudriere avec les données requises pour déclencher les premières constructions et avez activé le jail pour créer des sous-jails. Ensuite, vous allez exécuter la première génération manuellement pour vérifier que l’installation fonctionne.

Étape 5 - Exécution d’une construction de test manuel

Vous pouvez utiliser la commande + poudriere bulk + pour construire un ou plusieurs packages et toutes leurs dépendances. Après la première construction d’un paquet, Poudriere détecte également automatiquement si une reconstruction est nécessaire, ou laisse le fichier de paquet existant intact. Alors que la sous-commande + bulk + ne construit que des packages, l’exécution d’une construction à l’aide de + poudriere testport + permettrait également de tester les ports spécifiés à l’aide de la définition de «testing» donnée dans le fichier Makefile du port. Pour la portée de cet article, nous ne souhaitons fournir que des packages à installer sur les clients, nous utilisons donc des versions en bloc.

Assurez-vous que vous êtes toujours dans un shell racine de la prison de travail où vous avez installé Poudriere. Ultérieurement, ce sera également le lieu où le processus de travail Buildbot exécutera les générations automatiquement.

Exécutez la construction en remplissant les espaces réservés avec le nom de jail de construction et le nom d’arborescence de ports que vous avez précédemment choisis:

poudriere bulk -j  -p  ports-mgmt/pkg

Cela construit le port + ports-mgmt / pkg +. Les ports de l’arborescence officielle sont stockés dans une hiérarchie + <category> / <name> +, et ces chemins (appelés package origin) sont utilisés pour indiquer à Poudriere quels paquetages doivent être construits. Pour commencer, nous avons choisi de ne construire que le gestionnaire de paquets pkg, qui ne comporte pas de dépendances tierces et constitue donc un bon contrôle rapide de la configuration. Si tout se passe bien, vous verrez la sortie comme ceci:

Output[00:00:00] Creating the reference jail... done
[00:00:06] Mounting system devices for 112amd64-2019Q2
[00:00:06] Mounting ports/packages/distfiles
[00:00:06] Using packages from previously failed build
[00:00:06] Mounting ccache from: /var/cache/ccache
[00:00:06] Mounting packages from:
/etc/resolv.conf -> /pdr/data/.m/112amd64-2019Q2/ref/etc/resolv.conf
[00:00:06] Starting jail 112amd64-2019Q2
[00:00:07] Logs:
[00:00:07] Loading MOVED for /pdr/data/.m/112amd64-2019Q2/ref/usr/ports
[00:00:08] Ports supports: FLAVORS SELECTED_OPTIONS
[00:00:08] Gathering ports metadata
[00:00:08] Calculating ports order and dependencies
[00:00:08] pkg package missing, skipping sanity
[00:00:08] Skipping incremental rebuild and repository sanity checks
[00:00:08] Cleaning the build queue
[00:00:08] Sanity checking build queue
[00:00:08] Processing PRIORITY_BOOST
[00:00:08] Balancing pool
[00:00:08] Recording filesystem state for prepkg... done
[00:00:08] Building 1 packages using 1 builders
[00:00:08] Starting/Cloning builders
[00:00:14] Hit CTRL+t at any time to see build progress and stats
[00:00:14] [01] [00:00:00] Building ports-mgmt/pkg | pkg-1.10.5_5
[00:03:24] [01] [00:03:10] Finished ports-mgmt/pkg | pkg-1.10.5_5:
[00:03:25] Stopping 1 builders
[00:03:25] Creating pkg repository
Creating repository in /tmp/packages: 100%
Packing files for repository: 100%
[00:03:25] Committing packages to repository
[00:03:25] Removing old packages
[00:03:25] Built ports: ports-mgmt/pkg
[112amd64-2019Q2] [2019-04-20_19h35m00s] [committing:]   Tobuild: 0   Time: 00:03:18
[00:03:25] Logs: /pdr/data/logs/bulk/112amd64-2019Q2/2019-04-20_19h35m00s
[00:03:25] Cleaning up
[00:03:25] Unmounting file systems

Cette sortie indique où les packages iront après la construction et où les packages existants sont pris au cas où ils n’auraient pas besoin d’être reconstruits (ici: + / pdr / data / packages / 112amd64-2019Q2 +). En outre, la sortie affiche un aperçu des générations en cours d’exécution pendant l’exécution de Poudriere (vous pouvez appuyer sur + CTRL + T + dans un shell interactif pour imprimer la progression). Dans le résumé final, vous verrez qu’un paquet a été construit. Vous pouvez afficher une sortie de construction détaillée dans le répertoire des journaux (+ / pdr / data / logs / bulk / 112amd64-2019Q2 / * +).

Cette sortie confirme la réussite de la compilation. Si Poudriere a construit au moins un package, il le valide automatiquement dans le référentiel de packages. Cela signifie que les packages ne sont disponibles que lorsque toutes les versions sont terminées, même si la création d’autres packages a échoué. Vous avez maintenant un référentiel de paquets de travail à l’emplacement «+ / pdr / data / packages / 112amd64-2019Q2 +» dans la prison de travail de Buildbot.

Vous avez terminé toute la configuration nécessaire pour renvoyer les versions de travail Poudrière et vous avez vérifié avec succès avec une construction manuelle. Vous verrez cette même sortie plus tard dans le tutoriel une fois que vous avez automatisé la construction en bloc dans Buildbot. En outre, un lien pour afficher les journaux détaillés doit être accessible à partir de l’interface Web. Pour ce faire et pour servir le référentiel de packages aux clients, vous allez ensuite configurer un serveur Web.

Étape 6 - Configuration de Nginx pour desservir l’interface Web Poudriere et le référentiel de packages

Poudriere fournit plusieurs artefacts de sortie que nous souhaitons héberger à l’aide d’un serveur Web:

  • * Les référentiels de paquets * sont mis à la disposition des clients afin qu’ils puissent y accéder avec les commandes + pkg update + et + + pkg install + habituelles, en utilisant HTTPS ou HTTP comme moyen de transport.

  • * Les journaux de construction détaillés * sont utiles pour les développeurs afin de déboguer les versions problématiques ou d’examiner les résultats de la construction. Ils sont stockés par paquet et par construction, dans la sortie Poudriere de la dernière étape. Vous avez constaté que les journaux sont stockés dans un répertoire par construction, étiqueté avec la date et l’heure.

  • * L’interface Web intégrée de Poudriere * est une petite page HTML par construction qui utilise WebSockets pour mettre à jour régulièrement l’état indiqué sur la page. Ceci est utile pour avoir une meilleure vue d’ensemble de la construction, des dépendances qui ont déclenché l’échec de la construction d’autres packages, et enfin du remplacement de la sortie en ligne de commande, qui affiche uniquement un résumé à la fin, à moins que vous ne lui demandiez spécifiquement d’imprimer le résultat. progrès de construction actuels.

La modification de la configuration dans Nginx est courte, car seuls les fichiers statiques doivent être servis. Étant donné que vous les servirez dans le monde extérieur, vous allez maintenant configurer l’instance Nginx existante sur le serveur, en dehors des jails, pour servir les fichiers mentionnés à partir des chemins situés dans la prison de travail.

Veuillez quitter le shell jail car vous allez maintenant travailler sur le serveur:

exit

Ouvrez un éditeur avec la configuration Nginx + / usr / local / etc / nginx / nginx.conf +:

sudo ee /usr/local/etc/nginx/nginx.conf

Ajoutez les emplacements suivants dans le bloc + server {+:

/usr/local/etc/nginx/nginx.conf

. . .
http {
   . . .
   server {
       . . .
       location / {
           root /usr/local/www/nginx;
           index index.html index.htm;
       }




















       location /buildbot/ {
           proxy_pass http://10.0.0.2:8010/;
       }

       . . .
   }
}
. . .

Enregistrez et fermez le fichier de configuration Nginx. Rechargez ensuite le service Nginx:

sudo service nginx reload

Voyons maintenant les artefacts créés par la première construction manuelle. Ouvrez votre navigateur Web préféré sur votre ordinateur local pour accéder aux ressources.

Le * référentiel de paquets * est inférieur à + ​​http: /// packages / + (ou + http: /// +). Vous trouverez des méta-informations dans le répertoire racine, par exemple. + 112amd64-2019Q2 +, et tous les packages construits dans le sous-répertoire + All +:

image: https: //assets.digitalocean.com/articles/buildbot_poudriere/step6a.png [Liste du référentiel de paquets]

  • Les journaux de construction détaillés * et * l’interface Web intégrée de Poudriere * sont disponibles sous + http: /// logs / +. Cliquez dans la hiérarchie des répertoires pour accéder aux données de votre précédente génération manuelle. Dans cet exemple, vous pouvez vous retrouver sur une URL telle que + http: /// logs / 112amd64-2019Q2 / latest / build.html +.

image: https: //assets.digitalocean.com/articles/buildbot_poudriere/step6b.png [interface Web de Poudrière]

Si vous n’avez pas configuré de nom de domaine pour votre serveur, vous devez entrer l’adresse IP publique de votre serveur pour ces exemples, par exemple. + http: /// logs / +.

Ceci conclut toute la configuration manuelle pour obtenir des versions fonctionnelles et avoir une visibilité sur la sortie (packages et journaux). À l’avenir, vous automatiserez les générations pour atteindre continuous integration.

Étape 7 - Configuration d’un Buildbot Builder pour vos paquets

Votre objectif dans cette étape est d’automatiser les générations de paquets en bloc en exécutant Poudriere de la même manière que vous l’avez déjà fait manuellement en ajoutant à l’exemple de configuration Buildbot existant. À la fin de cette étape, Buildbot déclenchera la construction du paquet chaque fois que la branche choisie de l’arbre des ports sera modifiée. Dans les exemples de ce tutoriel, il s’agirait de la branche trimestrielle + 2019Q2 +.

Toutes les modifications nécessaires sont effectuées dans la configuration principale de Buildbot. Veuillez donc ouvrir un shell * root * dans la prison principale:

sudo jexec buildbot-master csh

Tout d’abord, un constructeur doit être défini pour décrire les commandes et les actions exécutées pour exécuter une construction. Dans la configuration existante + / var / buildbot-master / master.cfg +, vous trouverez une section + BUILDERS + -open un éditeur et * remplacer * toute la section jusqu’au début de l’en-tête suivant avec +