Erstellen und Bereitstellen von Paketen für Ihre FreeBSD-Server mit Buildbot und Poudriere

Der Autor hat den Free and Open Source Fund ausgewählt, um eine Spende als Teil des Write for DOnations zu erhalten. Programm.

Einführung

Die FreeBSD-Ports- und Paketsammlung, im Folgenden ports tree genannt, ist das Build-System von FreeBSD für externe Software. Es bietet eine https://www.freebsd.org/doc/en_US.ISO8859-1/books/developers-handbook/tools-make.html[Makefile‹ -basierte, konsistente Methode zum Erstellen von Paketen. Der port bezieht sich auf das Build-Rezept, also das Makefile und die zugehörigen Dateien. während package die Ausgabe des Aufbaus eines Ports in ein binäres (komprimiertes) Archiv der Paketdateien und ihrer Metainformationen ist.

Das manuelle Erstellen und Installieren einer Teilmenge oder aller über 30.000 Ports ist mit + make install + möglich. Die Builds würden jedoch auf einem Ihrer Server ausgeführt - keine saubere Umgebung. Für Produktionsanwendungsfälle würde manuelles Erstellen auch bedeuten, dass jeder Host dieselbe Revision des Ports-Baums benötigt und alle Pakete für sich kompilieren muss. Dies bedeutet wiederholte, fehleranfällige Arbeiten von Menschen und Servern. Es ist vorzuziehen, identische, vorgefertigte Binärpakete auf jedem Host abzurufen und zu verwenden und sie von einem zentralen, sicheren Paket-Repository aus bereitzustellen.

Um dies zu erreichen, ist Poudriere das Standardwerkzeug von FreeBSD zum Erstellen, Testen und Überwachen von Paketen sowie zum Verwalten der Paket-Repositorys. Jeder Build wird isoliert in einem neuen https://www.digitalocean.com/community/tutorials/how-to-install-buildbot-freebsd#step-1-%E2%80%93-setting-up-jails-for ausgeführt -the-buildbot-master-and-worker [Gefängnis], das die gewünschte Version von FreeBSD ausführt und ohne installierte Pakete startet. Nur das Basissystem sowie alle explizit angegebenen Abhängigkeiten stehen für den Neuaufbau zur Verfügung. Poudriere kümmert sich bei Bedarf um die Neuerstellung von Paketen sowie um die Aktualisierung des Paket-Repositorys nach Abschluss eines Builds. Das Kommandozeilen-Tool + poudriere + ist von zentraler Bedeutung für die Verwaltung verschiedener Port-Bäume, FreeBSD-Versionen, Port-Build-Optionen und schließlich für die Ausführung der Builds.

In diesem Lernprogramm konfigurieren Sie Poudriere, erstellen eine Reihe gewünschter Pakete, richten HTTP-basiertes Pakethosting ein und automatisieren die Erstellung mithilfe von Buildbot als kontinuierliche Integrationsplattform. Schließlich greifen Sie von einem Client-Computer aus sicher auf die Pakete zu.

Voraussetzungen

Bevor Sie mit diesem Handbuch beginnen, benötigen Sie:

  • Ein Server mit FreeBSD 11.2. Wenn Sie neu in der Arbeit mit FreeBSD sind, kann es hilfreich sein, diesen Server anzupassen, indem Sie unserem Leitfaden unter https://www.digitalocean.com/community/tutorials/how-to-get-started-with-freebsd [folgen. Erste Schritte mit FreeBSD].

  • Hinweis: * FreeBSD 12.0 enthält derzeit eine issue with nested jails, die behoben werden muss, bevor 12.x verwendet werden kann Lernprogramm.

  • Mindestens 10 GB freier Speicherplatz für die Speicherung von Paketen und Protokollen.

  • Ein grundlegendes Buildbot-Setup, indem Sie das Einrichten von Buildbot unter FreeBSD -Tutorial ausführen.

  • Ein anderer Server mit FreeBSD in derselben Version, den Sie als Client verwenden, um die Pakete abzurufen und zu installieren, die Sie automatisch erstellen und in einem HTTP / HTTPS-basierten Paket-Repository hosten möchten.

Schritt 1 - Installieren von Poudriere zur Verwendung in Buildbot Worker

Nach Abschluss des Lernprogramms für die Voraussetzungen verfügen Sie über ein funktionsfähiges Buildbot-Master- und Worker-Gefängnis sowie über ein Nginx-Setup. Sie werden in den folgenden Schritten auf diesem vorhandenen Setup aufbauen. In diesem ersten Schritt installieren Sie das Build-Tool Poudriere im Worker-Gefängnis, da der Buildbot-Worker-Prozess später Builds auslöst.

Stellen Sie eine Verbindung zu Ihrem Server her, auf dem Buildbot gehostet wird, und öffnen Sie im Worker-Gefängnis eine * root * -Shell mit dem folgenden Befehl:

sudo jexec buildbot-worker0 csh

Installieren Sie Poudriere als Paket:

pkg install poudriere

Bestätigen Sie die Installation mit + y + und dann + ENTER +.

Sie haben das neueste Poudriere-Tool und die neuesten Abhängigkeiten erfolgreich installiert. In den nächsten Schritten werden Sie die Vorbereitungen für die Konfiguration von Poudriere durchführen.

Schritt 2 - Erstellen eines Paketsignaturschlüssels (optional)

Es wird empfohlen, digitale Signaturen für erstellte Pakete einzurichten, um mehr Sicherheit zu bieten. Überspringen Sie diesen Schritt, wenn Sie Ihre Installation später oder auf andere Weise sichern möchten. Andernfalls erstellen wir ein Schlüsselpaar, mit dem Pakete signiert (mit dem privaten Schlüssel) und Pakete überprüft werden (mit dem öffentlichen Teil).

Pakete werden standardmäßig als "+ .txz " - Dateien erstellt, bei denen es sich um stark komprimierte Tarballs des Paketinhalts handelt. Die Prüfsummen der komprimierten Dateien bieten zusammen mit der Bereitstellung der Dateien über HTTP / HTTPS (TCP-Prüfsummen) bereits einen gewissen Schutz vor beschädigten Daten. Der Paketinhalt umfasst normalerweise Dateien und Verzeichnisse sowie Metainformationen wie den Paketnamen, die Version und verschiedene Optionen. Die Dateien können sogar https://en.wikipedia.org/wiki/Setuid#Security[`+setuid-able programs] enthalten (wie im `+ sudo + -Paket zu sehen, obwohl sudo nicht in FreeBSD integriert ist) Installationsskripte werden als * root * Benutzer ausgeführt. Die Installation aus nicht überprüften Quellen birgt daher ein Sicherheitsrisiko.

Wenn Sie die Pakete über HTTPS bereitstellen, können Sie nicht erkennen, ob jemand die Pakete auf der Festplatte manipuliert hat. Integrität und Authentizität Ihrer Pakete können hinzugefügt werden, indem Poudriere so konfiguriert wird, dass das Paket-Repository mit einem privaten RSA-Schlüssel signiert wird. Signierte Digests und der entsprechende öffentliche Schlüssel werden dabei in der Datei + digests.txz + des Paket-Repositorys gespeichert. Das erforderliche Schlüsselpaar (privater und öffentlicher RSA-Schlüssel) kann so lange unverändert bleiben, bis der private Schlüssel verloren gegangen oder kompromittiert wurde.

In diesem Schritt erstellen Sie das Schlüsselpaar, in dem die Builds ausgeführt werden (Worker-Jail), und laden den öffentlichen Teil zur späteren Verwendung auf Paket-Clients herunter (wird in einem späteren Schritt erläutert).

Stellen Sie sicher, dass Sie sich noch in der Worker-Jail * root * Shell befinden.

Erstellen Sie einen neuen privaten RSA-Schlüssel:

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

Auf die private Schlüsseldatei muss nur der Benutzer * root * zugreifen können, der Poudriere ausführt. Schützen Sie die Zugriffsberechtigungen:

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

Später benötigen Sie den öffentlichen Schlüsselteil, der auf den Clients zur Überprüfung der Paketsignaturen verfügbar ist. Extrahieren wir jetzt den öffentlichen Schlüssel:

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

Zuletzt laden Sie die öffentliche Schlüsseldatei von Ihrem eigenen Computer herunter:

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

Damit ist die optionale Erstellung eines Schlüsselpaares für die Paketsignatur abgeschlossen. Sie werden später die eigentliche Signatur mit Poudriere konfigurieren und die heruntergeladene öffentliche Schlüsseldatei auf den Clients für die Überprüfung verwenden.

Ein weiterer optionaler Schritt folgt: Wenn Sie das ZFS-Dateisystem verwenden, kann Poudriere es verwenden, um Builds zu beschleunigen. Andernfalls können Sie zu https://www.digitalocean.com/community/tutorials/how-to-build-and-deploy-packages-for-your-freebsd-servers-using-buildbot-and-poudriere#step- springen. 4-% E2% 80% 94-Konfigurieren-von-Poudriere,-des-Build-Gefängnisses, -und-des-Ports-Baums [Schritt 4], um Poudriere zu konfigurieren und sich auf die Ausführung des ersten Builds vorzubereiten.

Schritt 3 - Einrichten von ZFS (optional)

Dieser Schritt gilt nur, wenn Sie ein FreeBSD-System auf dem ZFS-Dateisystem ausführen. Wenn Sie beispielsweise ein DigitalOcean-Droplet verwenden, trägt das Bild die Bezeichnung * x64 zfs * (für FreeBSD). In diesem Schritt erstellen Sie die Dateisysteme, mit denen Poudriere Jails schneller erstellen und verwalten kann, wodurch möglicherweise Ihre Builds beschleunigt werden.

Sie können herausfinden, ob Sie ZFS verwenden, indem Sie Pools auflisten. Stellen Sie sicher, dass Sie sich in der Shell des Servers befinden und nicht in einem Gefängnis.

exit

Führen Sie den folgenden Befehl aus, um die Zpools aufzulisten:

sudo zpool list

Wenn ein Pool verfügbar ist, werden Informationen dazu gedruckt:

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

Andernfalls druckt das Tool, wenn keine ZFS-Unterstützung verfügbar ist, "+ keine Pools verfügbar" oder "+ konnte die ZFS-Bibliothek nicht initialisieren". Dies bedeutet, dass kein System ZFS verwendet. Fahren Sie in diesem Fall mit dem nächsten Schritt fort. Wenn Sie sich für einen anderen Datenträger oder Speichertyp entschieden haben, z. B. das UFS-Dateisystem, können Sie auch mit dem nächsten Schritt fortfahren.

Wenn Sie vorhaben, ZFS zu verwenden, merken Sie sich den Namen des gedruckten Pools, in dem Sie Build-bezogene Daten speichern möchten. Sie sollten mehrere Gigabyte Speicher einplanen.

ZFS ist hilfreich, um die verschiedenen Datasets von Poudriere zu trennen, z. B. Build-Jails, Port-Bäume, Protokolle, Pakete und andere Daten. Diese werden unabhängig voneinander gespeichert und können so schnell gelöscht werden, ohne dass Speicherplatz oder Spuren zurückbleiben.

Damit Poudriere ZFS nutzen kann, müssen Sie drei Dinge tun: Ein übergeordnetes ZFS-Dataset erstellen, das Erstellen und Löschen von ZFS-Datasets zulassen (was vom Buildbot-Worker-Jail oder einem anderen Jail standardmäßig nicht möglich ist) und bearbeiten Poudrieres Konfiguration entsprechend.

Im vorausgesetzten Lernprogramm haben Sie das Buildbot-Worker-Gefängnis in "+ /etc/jail.buildbot-worker0.conf " konfiguriert. Öffnen Sie diese Datei mit Ihrem bevorzugten Texteditor und fügen Sie die folgenden hervorgehobenen Zeilen hinzu, um ein übergeordnetes Dataset zu delegieren, damit das Gefängnis ZFS-Datasets unter dem übergeordneten Dataset verwalten kann. Denken Sie daran, " zroot +" durch Ihren gewünschten Poolnamen zu ersetzen:

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;


}

In diesem Artikel speichern wir Build-bezogene Daten im ZFS-Pool "+ zroot +". Passen Sie diese ZFS-bezogene Konfiguration hier und im Rest des Artikels an, wenn Sie einen Pool mit einem anderen Namen ausgewählt haben.

Speichern und beenden Sie den Editor, nachdem Sie diesen Inhalt hinzugefügt haben. Wenn Sie "+ ee " verwenden, drücken Sie dazu " STRG + C ", geben Sie " exit " ein und drücken Sie " ENTER +".

Erstellen Sie das übergeordnete ZFS-Dataset, das in der Konfigurationsdatei angegeben ist:

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

Dies setzt absichtlich voraus, dass Sie möglicherweise in Zukunft weitere Mitarbeiter hinzufügen möchten, und erstellt daher einen Unterdatensatz für Ihren ersten Mitarbeiter. Der Dataset-Name ist absichtlich kurz, da ältere Versionen von FreeBSD (vor 12.0) eine maximale Anzahl von 88 Zeichen für Mount-Namen hatten.

Damit ein Gefängnis die Kontrolle über ein Eltern-Dataset übernehmen und Kinder verwalten kann, muss das Dataset mit dem folgenden Flag gekennzeichnet sein:

sudo zfs set jailed=on zroot/pdr/w0

Wenn die Voraussetzungen jetzt erfüllt sind, wird das Gefängnis mit der neuen Konfiguration korrekt gestartet:

sudo service jail restart buildbot-worker0

Mit diesen Anweisungen haben Sie die erforderlichen Dateisysteme (ZFS-Datasets) erfolgreich erstellt und dem Jail die Verwaltung des übergeordneten Datasets ermöglicht. Im nächsten Schritt konfigurieren Sie Poudriere, indem Sie den ausgewählten Zpool und das Dataset angeben, die zum Speichern von Build-bezogenen Daten verwendet werden.

Schritt 4 - Konfigurieren von Poudriere, Build Jail und Ports Tree

Bis zu diesem Zeitpunkt haben Sie Poudriere installiert und optional die Anforderungen für die Paketsignatur und ZFS abgedeckt. Damit Poudriere in der Lage ist, im Gefängnis zu arbeiten, das heißt, innerhalb des Buildbot-Worker-Gefängnisses ordnungsgemäß zu funktionieren, müssen Sie dem Gefängnis bestimmte Berechtigungen erteilen. Wenn Sie beispielsweise ZFS verwenden, haben Sie bereits ein übergeordnetes Dataset für die Verwendung und Verwaltung durch das Gefängnis delegiert.

Konfigurieren wir zuerst die Loopback-IP und alle Berechtigungen und gehen dann die jeweilige Bedeutung nach den Änderungen durch.

Poudriere möchte zwei Build-Jails pro Build starten: eines mit Loopback-Netzwerk und eines mit Internetzugang. Letzteres wird nur für Build-Phasen verwendet, die das Internet erreichen sollen. Zum Beispiel kann das "+ fetch " Quell-Tarballs herunterladen, aber die " build " - Phase erlaubt keinen Internetzugang. Die vorhandene Konfiguration des Arbeitergefängnisses hat " ip4.addr =" lo1 | 10.0.0.3/24 "", was den Internetzugang ermöglicht. Damit Poudriere neu gestarteten Build-Jails eine Loopback-Adresse zuweisen kann, muss die IP auch an das übergeordnete (das Worker-Jail) übergeben werden. Damit dies funktioniert, stellen Sie bitte sicher, dass Sie die neueste Version der Firewall-Konfigurationsdatei " / usr / local / etc / ipfw.rules " aus dem vorausgesetzten Lernprogramm angewendet haben, die das Öffnen ausgehender Verbindungen durch die Loopback-Schnittstelle " lo0 +" blockiert durch NAT.

Fügen Sie die hervorgehobenen Zeilen zu Ihrer Worker-Jail-Konfiguration hinzu:

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";













}

Hier haben Sie Folgendes hinzugefügt (siehe auch die Manpage jail(8)):

  • + ip4.addr + =" lo0 | 127.0.0.3 "+ fügt dem Gefängnis eine weitere IPv4-Adresse hinzu. Sie werden später die + LOIP4 + - Variable von Poudriere konfigurieren, um diese Loopback-Adresse zum Erstellen von Jails zuzuweisen, die nicht mit dem Internet oder anderen Computern in Ihrem Netzwerk kommunizieren sollen, z. B. während der + build + - Phase. Wenn Sie jemals ein Build haben, für das während des Builds ein Internetzugang erforderlich ist, unterstützt Poudriere eine Variable "+ ALLOW_NETWORKING_PACKAGES " als Workaround. Es ist jedoch vorzuziehen, in der " fetch +" - Phase, für die Poudriere den Internetzugang zulässt, die bewährten Methoden zu befolgen und Downloads und andere Aufgaben im Internet durchzuführen.

  • + allow.chflags + ermöglicht es Poudriere, bestimmte Systemdateien wie + / bin / sh + im Build-Gefängnis unveränderlich zu machen.

  • + allow.mount + und die anderen Optionen + allow.mount. * + ermöglichen es Poudriere, bestimmte erforderliche Dateisysteme in die Build-Jails einzubinden.

  • + allow.raw_sockets +, das die Verwendung von Raw-Sockets ermöglicht, und + allow.socket_af +, das die Verwendung einer beliebigen Socket-Adressfamilie ermöglicht, werden beide auf internetfähige Build-Jails angewendet. Dies ist hilfreich, damit Sie Tools wie "+ ping +" im interaktiven Modus ausführen können, z. B. beim Aufrufen eines Build-Jails zum Debuggen von Problemen.

  • "+ allow.sysvipc " wird zugunsten von drei separaten Einstellungen " sysvmsg " / " sysvsem " / " sysvshm " nicht mehr empfohlen, damit Jails nur ihre eigenen Shared Memory-Objekte sehen können (über "SYS V" -IPC-Grundelemente). Poudriere kann jedoch nur ` allow.sysvipc +` übergeben, um Jails zu erstellen, da es die relevanten sysctl-Informationen für die drei separaten Parameter nicht lesen kann (ab FreeBSD 11.2). Mit dieser veralteten Konfiguration könnte das Gefängnis den gemeinsamen Speicher von Prozessen außerhalb des Gefängnisses lesen. Dies ist nur für bestimmte Software relevant, die von IPC-Funktionen wie PostgreSQL abhängt. Daher ist die Wahrscheinlichkeit gering, dass sich dies auf die Sicherheit auswirkt. Sie können diese Konfiguration entfernen, es sei denn, Sie sind auf einen Port angewiesen, der dies während der Erstellung erfordert.

  • + children.max = 16 + erlaubt 16 Untergefängnisse unterhalb des Arbeitergefängnisses. Sie können diese Zahl später erhöhen, wenn Sie viele CPUs haben und Poudriere versucht, mehr Build-Jails als zulässig zu erstellen. Bei jedem Poudriere-Build wird versucht, ein Referenz-Jail und zwei Build-Jails pro "Job" zu erstellen. Standardmäßig wird die Anzahl der CPUs (wie von "+ sysctl -n hw.ncpu +" ausgegeben) als Jobanzahl verwendet.

  • + enforce_statfs = 1 + wird zusammen mit + allow.mount + benötigt, um bestimmte Dateisysteme bereitzustellen.

Speichern und beenden Sie die Konfigurationsdatei.

Starten Sie das Jail neu, damit die Konfiguration sofort wirksam wird:

sudo service jail restart buildbot-worker0

Die entsprechenden Kernel-Module müssen geladen sein, damit Poudriere Mount-Vorgänge durchführen kann. Führen Sie die folgenden Befehle aus, um die Module beim Start und sofort zu laden:

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

Sie haben das Poudriere-Paket bereits früher installiert, wobei die Beispieldatei "+ / usr / local / etc / poudriere.conf.sample " nach " / usr / local / etc / poudriere.conf +" kopiert wurde. Als Nächstes nehmen Sie Änderungen an der Konfigurationsdatei vor. Alle möglichen Konfigurationsvariablen sind bereits im Beispiel vorhanden. Entfernen Sie das Kommentarzeichen oder passen Sie die entsprechende Zeile in der Datei an, um eine Variable auf einen bestimmten Wert festzulegen.

Stellen Sie für die folgenden Befehle sicher, dass Sie sich noch in einer * root * -Shell im Worker-Gefängnis befinden:

sudo jexec buildbot-worker0 csh

Öffnen Sie die Datei mit dem folgenden Befehl:

ee /usr/local/etc/poudriere.conf

Wenn Sie sich für die Verwendung von ZFS entschieden haben, geben Sie bitte Ihren gewünschten Zpool und übergeordneten Datensatz ein:

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

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

. . .

Wenn Sie sich dagegen entschieden haben, deaktivieren Sie bitte die ZFS-Unterstützung:

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

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

Sie werden später Poudriere anweisen, ein FreeBSD-Basissystem herunterzuladen und damit das erste Build-Jail zu booten. Dazu muss ein Download-Host angegeben werden. Fügen Sie die folgende hervorgehobene Zeile hinzu:

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

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

Da Poudriere im Gefängnis ausgeführt wird, ist die Beschränkung der Mount-Namen auf 88 Zeichen in FreeBSD-Versionen vor 12.0 besonders schädlich, da der vollständige Pfad des Gefängnisses + / usr / jails / buildbot-worker0 + Teil jedes Mount-Pfades ist. Das Überschreiten des Grenzwerts würde die Builds tödlich beschädigen. Achten Sie daher gut darauf, die Pfadlängen zu verringern. Anstelle des typischen Verzeichnisses "+ / usr / local / poudriere " können Sie " / pdr +" wie folgt verwenden:

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

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

Erstellen Sie nun dieses Verzeichnis:

mkdir /pdr

Wechseln Sie erneut zu Ihrem Editor von + poudriere.conf +:

ee /usr/local/etc/poudriere.conf

Poudriere stellt während der Ausführung von Builds ein zentrales Verzeichnis für dist files (die Quellcode-Tarballs für jeden Port) bereit, sodass alle Builder denselben Cache gemeinsam nutzen. Das Standardverzeichnis ist:

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

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

Erstellen Sie nun dieses Verzeichnis:

mkdir -p /usr/ports/distfiles

Wenn Sie Schritt 2 befolgt und einen Signaturschlüssel für das Paket-Repository erstellt haben, rufen Sie den Editor erneut auf und geben Sie ihn an:

ee /usr/local/etc/poudriere.conf

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

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

Builds werden viel schneller ausgeführt, wenn Sie C / C ++ - Compiler- und Linker-Ausgaben für das nächste Mal zwischenspeichern. Der Ports-Baum unterstützt dies direkt, indem er das Tool ccache verwendet. Bitte aktivieren Sie es und erstellen Sie das entsprechende Cache-Verzeichnis, wenn Sie mindestens 5 GB mehr Speicherplatz (die Standard-Cache-Größe) einsparen können:

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

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

Das Erstellen und Ausführen von Linux-Software ist ungewöhnlich. Deaktivieren Sie sie, bis Sie sie benötigen:

ee /usr/local/etc/poudriere.conf

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

. . .
# Disable linux support

Den Gefängnissen sollte eine Loopback-Adresse zugewiesen werden, oder Poudriere warnt davor. Wir können die IP des Gefängnisses erben, da es sich um eine reine Loopback-Netzwerkschnittstelle handelt (+ lo1 +). Fügen Sie dazu bitte die folgende Zeile am Ende der Konfigurationsdatei hinzu:

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

Speichern und beenden Sie die Konfigurationsdatei.

Für funktionierende Builds benötigen wir zwei weitere Ressourcen: ein FreeBSD-Basissystem, das als Build-Jail-Vorlage verwendet wird, und einen aktuellen Ports-Baum. Wählen Sie die FreeBSD-Version, auf die Sie abzielen. In diesem Tutorial werden wir Poudriere anweisen, FreeBSD für die Architektur herunterzuladen. Sie können das Gefängnis benennen, wie Sie möchten, aber ein einheitliches Benennungsschema wie "+ 112amd64 " wird empfohlen. Denken Sie auch an die Wahl zwischen vierteljährlichen, stabilen Ports-Ästen (hier verwenden wir " 2019Q2 +") und dem "Kopf" -Ästchen der blutenden Kante, der nach Aktualisierungen hin und wieder zum Abbrechen von Builds führen kann. FreeBSD-Versionen, die neuer sind als die auf dem Server, können nicht im Build-Jail verwendet werden.

Laden Sie das Build-Jail herunter und erstellen Sie es:

poudriere jail -c -j  -v  -a

Zuletzt laden wir den Ports-Baum herunter. Die Standardmethode zum Herunterladen ist portsnap, bei der komprimierte Momentaufnahmen des Baums ohne Verlaufsinformationen verwendet werden. Entweder Subversion oder Git sind vorzuziehen, um vorgelagerte Änderungen zusammenzuführen oder einen Beitrag zu leisten. Dies ist auch wichtig, wenn Sie einen benutzerdefinierten, selbst gehosteten Baum in einem Versionskontrollsystem verwenden möchten. Geben Sie im folgenden Befehl das aktuelle Jahr und das aktuelle Quartal ein.

Wenn Sie mit dem vorgelagerten, offiziellen Portbaum beginnen möchten:

poudriere ports -c -p  -m  -B

Die Methode + svn + https + würde vom FreeBSD Subversion-Host synchronisiert (viewable online here). Wenn Sie eine alternative Quelle verwenden möchten, lesen Sie den folgenden Hinweis, andernfalls überspringen Sie ihn.

Verfügbare Bäume können mit + poudriere ports -l + aufgelistet werden, was eine Auflistung wie folgt ausgibt:

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

Sie haben nun die Konfiguration und die Ressourcen von Poudriere eingerichtet. Sie haben Poudriere mit den erforderlichen Daten konfiguriert, um die ersten Builds auszulösen, und das Jail zum Erstellen von Unterjails aktiviert. Als Nächstes führen Sie den ersten Build manuell aus, um zu überprüfen, ob das Setup funktioniert.

Schritt 5 - Ausführen eines manuellen Testbuilds

Sie können den Befehl + poudriere bulk + verwenden, um ein oder mehrere Pakete und all ihre Abhängigkeiten zu erstellen. Nach der ersten Erstellung eines Pakets erkennt Poudriere automatisch, ob eine Neuerstellung erforderlich ist, oder lässt die vorhandene Paketdatei auf andere Weise unberührt. Während der Unterbefehl "+ bulk " nur Pakete erstellt, werden beim Ausführen eines Builds mit " poudriere testport +" auch die angegebenen Ports anhand der Definition von "testing" im Makefile des Ports getestet. Im Rahmen dieses Artikels möchten wir nur Pakete für die Installation auf Clients bereitstellen. Daher verwenden wir Bulk-Builds.

Stellen Sie sicher, dass Sie sich noch in einer Root-Shell des Worker-Gefängnisses befinden, in dem Sie Poudriere installiert haben. Später wird hier auch der Buildbot-Arbeitsprozess Builds automatisch ausführen.

Führen Sie den Build aus und füllen Sie die Platzhalter mit dem Namen des Build-Jails und dem Namen des Ports-Baums, die Sie zuvor ausgewählt haben:

poudriere bulk -j  -p  ports-mgmt/pkg

Dadurch wird der Port "+ ports-mgmt / pkg " erstellt. Ports in der offiziellen Baumstruktur werden in einer Hierarchie " <Kategorie> / <Name> +" gespeichert, und diese Pfade (als "Paketursprung" bezeichnet) werden verwendet, um Poudriere mitzuteilen, welche Pakete erstellt werden sollen. Für den Anfang haben wir uns entschieden, nur den Paketmanager pkg zu erstellen, der keine Abhängigkeiten von Drittanbietern aufweist und daher eine gute, schnelle Überprüfung der Konfiguration darstellt. Wenn alles gut läuft, wird folgende Ausgabe angezeigt:

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

Diese Ausgabe zeigt, wo die Pakete nach dem Erstellen abgelegt werden und woher die vorhandenen Pakete entnommen werden, falls sie nicht neu erstellt werden müssen (hier: "+ / pdr / data / packages / 112amd64-2019Q2 "). Außerdem zeigt die Ausgabe eine Übersicht über laufende Builds, während Poudriere ausgeführt wird (Sie können in einer interaktiven Shell STRG + T + drücken, um den Fortschritt zu drucken). In der letzten Zusammenfassung sehen Sie, dass ein Paket erstellt wurde. Sie können die ausführliche Build-Ausgabe im Protokollverzeichnis anzeigen (` / pdr / data / logs / bulk / 112amd64-2019Q2 / * +`).

Diese Ausgabe bestätigt eine erfolgreiche Erstellung. Wenn Poudriere mindestens ein Paket erfolgreich erstellt hat, wird es automatisch in das Paket-Repository übernommen. Dies bedeutet, dass Pakete nur verfügbar sind, nachdem alle Builds abgeschlossen wurden, auch wenn andere Pakete nicht erstellt werden konnten. Sie haben jetzt ein Arbeitspaket-Repository unter + / pdr / data / packages / 112amd64-2019Q2 + im Buildbot-Worker-Gefängnis.

Sie haben die gesamte Konfiguration abgeschlossen, die erforderlich ist, um funktionierende Poudriere-Builds zurückzugeben, und Sie haben erfolgreich mit einem manuellen Build verifiziert. Dieselbe Ausgabe wird später im Lernprogramm angezeigt, wenn Sie den Bulk-Build in Buildbot automatisiert haben. Außerdem muss ein Link zum Anzeigen der detaillierten Protokolle über die Webschnittstelle verfügbar sein. Um dies zu erreichen und das Paket-Repository für Clients bereitzustellen, richten Sie als Nächstes einen Webserver ein.

Schritt 6 - Konfigurieren von Nginx für die Bereitstellung der Poudriere-Webschnittstelle und des Paket-Repositorys

Poudriere bietet mehrere Ausgabe-Artefakte, die wir über einen Webserver hosten möchten:

  • * Paket-Repositorys * werden Clients zur Verfügung gestellt, damit sie mit den regulären Befehlen "+ pkg update " und " pkg install +" unter Verwendung von HTTPS oder HTTP als Transport auf sie zugreifen können.

  • * Detaillierte Build-Protokolle * sind hilfreich für Entwickler, um problematische Builds zu debuggen oder die Build-Ausgabe zu untersuchen. Sie werden pro Paket und pro Build in der Poudriere-Ausgabe des letzten Schritts gespeichert. Sie haben gesehen, dass Protokolle in einem Verzeichnis pro Build gespeichert werden, das mit Datum und Uhrzeit gekennzeichnet ist.

  • * Poudrieres integrierte Weboberfläche * ist eine kleine, einzelne HTML-Seite pro Build, die mithilfe von WebSockets den auf der Seite angezeigten Status regelmäßig aktualisiert. Dies ist hilfreich, um einen besseren Überblick darüber zu erhalten, inwieweit ein Build vorhanden ist, welche Abhängigkeiten dazu geführt haben, dass andere Paketbuilds fehlgeschlagen sind, und schließlich als Ersatz für die Befehlszeilenausgabe, bei der nur eine Zusammenfassung am Ende angezeigt wird, es sei denn, Sie geben ausdrücklich an, dass die Datei gedruckt wird aktueller Baufortschritt.

Die Konfigurationsänderung in Nginx ist kurz, da nur statische Dateien bereitgestellt werden müssen. Da Sie sie der Außenwelt bereitstellen, konfigurieren Sie jetzt die vorhandene Nginx-Instanz auf dem Server außerhalb der Jails, um die genannten Dateien über Pfade innerhalb des Worker-Jails bereitzustellen.

Bitte beenden Sie die Jail-Shell, da Sie jetzt auf dem Server arbeiten werden:

exit

Öffnen Sie einen Editor mit der Nginx-Konfiguration + / usr / local / etc / nginx / nginx.conf +:

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

Fügen Sie die folgenden Positionen innerhalb des Blocks + server {+ hinzu:

/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/;
       }

       . . .
   }
}
. . .

Speichern und schließen Sie die Nginx-Konfigurationsdatei. Laden Sie dann den Nginx-Dienst neu:

sudo service nginx reload

Schauen wir uns nun die Artefakte an, die mit dem ersten manuellen Build erstellt wurden. Öffnen Sie Ihren bevorzugten Webbrowser auf Ihrem lokalen Computer, um auf die Ressourcen zuzugreifen.

Das * Paket-Repository * befindet sich unter + http: /// packages / + (oder + http: /// +). Sie finden Metainformationen im Stammverzeichnis, z. + 112amd64-2019Q2 + und alle erstellten Pakete im Unterverzeichnis + All +:

  • Detaillierte Build-Protokolle * und * Poudrieres integrierte Web-Oberfläche * finden Sie unter "+ http: /// logs / ". Klicken Sie sich durch die Verzeichnishierarchie, um zu den Daten Ihres vorherigen manuellen Builds zu gelangen. In diesem Beispiel erhalten Sie möglicherweise eine URL wie " http: /// logs / 112amd64-2019Q2 / latest / build.html +".

Wenn Sie keinen Domainnamen für Ihren Server eingerichtet haben, müssen Sie für diese Beispiele die öffentliche IP-Adresse Ihres Servers eingeben, z. + http: /// logs / +.

Dies schließt alle manuellen Einstellungen ab, um funktionierende Builds zu erhalten und Einblick in die Ausgabe (Pakete und Protokolle) zu erhalten. Zukünftig werden Sie Builds automatisieren, um kontinuierliche Integration zu erreichen.

Schritt 7 - Einrichten eines Buildbot-Generators für Ihre Pakete

Ihr Ziel in diesem Schritt ist es, die Erstellung von Massenpaketen zu automatisieren, indem Sie Poudriere auf dieselbe Weise ausführen, wie Sie es bereits getan haben, indem Sie es der vorhandenen Buildbot-Beispielkonfiguration hinzufügen. Am Ende dieses Schritts löst Buildbot die Paketerstellung aus, wenn sich der ausgewählte Zweig des Ports-Baums ändert. In den Beispielen dieses Lernprogramms ist dies der vierteljährliche Zweig "+ 2019Q2 +".

Alle erforderlichen Änderungen werden in der Buildbot-Masterkonfiguration vorgenommen. Öffnen Sie daher eine * root * -Shell im Master-Jail:

sudo jexec buildbot-master csh

Zunächst muss ein builder definiert werden, der die Befehle und Aktionen beschreibt, die zum Ausführen eines Builds ausgeführt werden. In der vorhandenen Konfiguration "+ / var / buildbot-master / master.cfg " finden Sie einen Abschnitt " BUILDERS ". Öffnen Sie einen Editor und ersetzen Sie den gesamten Abschnitt, bis die nächste Überschrift beginnt mit ` …​ +`, mit folgender Konfiguration:

ee /var/buildbot-master/master.cfg

/var/buildbot-master/master.cfg (Snippet)

. . .
####### BUILDERS

c['builders'] = []

PORTS_TO_BUILD = {
   'security/sudo',
   'shells/bash',
   'sysutils/tmux',
}


# Custom classes
class PoudriereLogLineObserver(util.LogLineObserver):
   _logsRe = re.compile(r'Logs: /pdr/data/logs/bulk(/[-_/0-9A-Za-z]+)$')

   def __init__(self):
       super().__init__()
       self._hadUrls = False

   def outLineReceived(self, line):
       if not self._hadUrls:
           m = self._logsRe.search(line.strip())
           if m:
               poudriereUiUrl = f'''{re.sub('/buildbot/$', '', c['buildbotURL'])}/logs{m.group(1)}'''
               self.step.addURL('Poudriere build', poudriereUiUrl)
               self.step.addURL('Poudriere logs', poudriereUiUrl + '/logs/')
               self._hadUrls = True


class PoudriereCompileStep(steps.Compile):
   def __init__(self, *args, **kwargs):
       super().__init__(*args, **kwargs)
       self.addLogObserver('stdio', PoudriereLogLineObserver())


# Poudriere bulk build
bulkBuildFactory = util.BuildFactory()
bulkBuildFactory.addSteps([
   steps.ShellCommand(
       name='update ports tree',
       command=['sudo', 'poudriere', 'ports', '-u', '-p', '2019Q2', '-v'],
       haltOnFailure=True,
   ),
   PoudriereCompileStep(
       name='make bulk',
       command=['sudo', 'poudriere', 'bulk', '-j', '112amd64', '-p', '2019Q2'] + list(sorted(PORTS_TO_BUILD)),
       haltOnFailure=True,
   ),
])
c['builders'].append(util.BuilderConfig(name='bulk-112amd64-2019Q2',
                                       workernames=['worker0'],
                                       factory=bulkBuildFactory))
. . .

Beachten Sie, wie dies die Erweiterbarkeit von Buildbot nutzt: Benutzerdefinierte Klassen werden verwendet, um Informationen aus der Poudriere-Protokollausgabe zu beobachten und zu analysieren. "+ PoudriereLogLineObserver +" wird nämlich als "Protokollbeobachter" hinzugefügt, d. H. wird aufgerufen, wenn während des Builds eine neue Protokollzeile gedruckt wird. Die Klasse durchsucht die Protokolle nach dem Protokollverzeichnis und konvertiert dieses in Hyperlinks. Diese Links werden neben dem Erstellungsschritt angezeigt und führen den Benutzer direkt zur Weboberfläche und zu den Protokollen von Poudriere.

Im ersten Build-Schritt "Update Ports Tree" verwenden wir den in Poudriere integrierten Update-Befehl ("+ ports -u +"), um die neueste Version des Ports Tree abzurufen. Dies verwendet automatisch die zuvor konfigurierte Methode (z. B. SVN / Git). Auf diese Weise können Sie sicher sein, dass die Pakete immer anhand des neuesten festgeschriebenen Baums erstellt werden. Dies ist besonders hilfreich, wenn Sie über ein eigenes versioniertes Repository verfügen, in dem Sie Softwareversionen und Patches verwalten.

Oben gibt die Liste "+ PORTS_TO_BUILD +" an, welche Ports erstellt werden sollen. Es wird in den Schritten der build factory verwendet, die am Ende des Blocks angegeben sind. Die Build-Factory ist eine Vorlage, mit der ein Build instanziiert wird. Buildbot erstellt bei jedem Auslösen einen eindeutigen Build, und der Build verwendet eine Kopie der Schritte, die zu diesem Zeitpunkt für die Buildfactory definiert waren. In diesem Fall haben wir genau zwei Schritte konfiguriert:

  • Aktualisieren Sie den Ports-Baum. Da in diesem Beispiel der vierteljährliche Zweig "+ 2019Q2 +" verwendet wird, werden Änderungen nicht sehr häufig empfangen (normalerweise nur Sicherheits- und Build-Fixes).

  • Führen Sie den Bulk-Build mit demselben Baum aus.

Damit der hinzugefügte Codeblock funktioniert, fügen Sie oben in der Datei einen erforderlichen Import hinzu:

/var/buildbot-master/master.cfg (Snippet)

# -*- python -*-
# ex: set filetype=python:



from buildbot.plugins import *

Die + re + - Bibliothek in Python implementiert regular expressions, eine Funktion zum Suchen oder Ersetzen von Teilen eines Strings. Die Klasse + PoudriereLogLineObserver + verwendet sie, um nach einer Zeile zu suchen. + `, das das Protokollverzeichnis erwähnt.

Die Build-Befehle verwenden "+ sudo ", um bestimmte Befehle auszuführen. Dies ist erforderlich, da Poudriere beim Ausführen eines Build-Ins Superuser-Berechtigungen benötigt, um die Build-Jails zu erstellen, zu verwalten und zu zerstören. Außerdem werden die von Poudriere verwalteten Port-Bäume mit dem Root-Benutzer als Eigentümer erstellt. Im vorherigen Lernprogramm haben wir den Benutzer, der den Buildbot-Arbeitsprozess ausführt, mit " sysrc buildbot_worker_uid = buildbot-worker " konfiguriert. Aus diesem Grund möchten wir dem Benutzer " buildbot-worker " erlauben, genau die erforderlichen Befehle als root auszuführen, jedoch keine anderen Befehle (aus Sicherheitsgründen). Installieren wir das Programm " sudo +" und konfigurieren es entsprechend.

Dies muss auf dem Arbeitergefängnis erfolgen, nicht auf dem Meister. Bitte verlassen Sie die Master Jail Shell und betreten Sie das Arbeitergefängnis:

exit
sudo jexec buildbot-worker0 csh

Installieren Sie das + sudo + Paket:

pkg install sudo

Bestätigen Sie die Installation mit + y + und + ENTER +.

Unter FreeBSD liest das sudo-Paket standardmäßig Konfigurationsdateien aus + / usr / local / etc / sudoers.d / +. Öffnen Sie einen Editor, um eine neue Konfigurationsdatei zu erstellen:

env EDITOR=ee visudo /usr/local/etc/sudoers.d/buildbot-worker

Die Verwendung von + visudo + ist beabsichtigt, da es bei Syntaxfehlern warnt und deren Behebung ermöglicht, anstatt eine fehlerhafte Konfiguration festzulegen.

Geben Sie an, welche Befehle der Benutzer "+ buildbot-worker +" als root ausführen kann, ohne dass ein Kennwort erforderlich ist:

/usr/local/etc/sudoers.d/buildbot-worker

buildbot-worker ALL=(ALL) NOPASSWD: /usr/local/bin/poudriere bulk *
buildbot-worker ALL=(ALL) NOPASSWD: /usr/local/bin/poudriere ports -u *

Speichern Sie die Datei und wechseln Sie zurück in das Master-Gefängnis, um den Buildbot-Master weiter zu konfigurieren:

exit
sudo jexec buildbot-master csh

Sie haben gerade die Voraussetzungen erfüllt, um den Bulk-Build zum Laufen zu bringen. Aber wie bereits erwähnt, muss jeder Build ausgelöst werden, um ausgeführt zu werden. Buildbot verwendet den Ausdruck scheduler für ein Objekt, das definiert, wann ein Build ausgelöst wird und mit welchen zusätzlichen Informationen, z. B. welcher Zweig geändert wurde. Entfernen Sie den vorhandenen Abschnitt "+ SCHEDULERS " aus der Konfigurationsdatei und fügen Sie den folgenden Inhalt nach dem Abschnitt " BUILDERS +" ein, damit der Code alle vorhandenen Buildernamen verwenden kann:

ee /var/buildbot-master/master.cfg

/var/buildbot-master/master.cfg (Snippet)

. . .
####### SCHEDULERS

c['schedulers'] = []

# Forceful scheduler allowed for all builders
c['schedulers'].append(schedulers.ForceScheduler(
   name='force',
   builderNames=[builder.name for builder in c['builders']]))

# Watch ports tree for changes on given branch
c['schedulers'].append(schedulers.SingleBranchScheduler(
   name='sched-bulk-112amd64-2019Q2',
   change_filter=util.ChangeFilter(project='freebsd-ports', branch='branches/2019Q2'),
   builderNames=['bulk-112amd64-2019Q2']))
. . .

Dies ersetzt die Beispielkonfiguration, sodass auf jedem Builder eine Schaltfläche * force * angezeigt wird. Und das Wichtigste ist, dass ein Scheduler erstellt wird, der alle Änderungen in Bezug auf das angegebene "+ project " / " branch " überwacht und für jede Änderung einen Build auslöst. Es können jedoch keine derartigen Änderungsereignisse auftreten - Sie müssen zuerst eine _änderungsquelle_ erstellen. In der Regel handelt es sich dabei um Versionskontrollsysteme wie SVN oder Git, auf denen Änderungen in einem Zweig erkannt werden können. Buildbot unterstützt die gängigsten, daher können wir seine Funktionalität nutzen, um unser ausgewähltes Upstream-Ports-Tree-Repository als Quelle hinzuzufügen. Ersetzen Sie den Abschnitt " CHANGESOURCES +" vollständig durch die folgende Konfiguration:

/var/buildbot-master/master.cfg (Snippet)

. . .
####### CHANGESOURCES

c['change_source'] = []

c['change_source'].append(changes.SVNPoller(
   'svn://svn.freebsd.org/ports/',
   project='freebsd-ports',
   split_file=util.svn.split_file_branches,
   svnbin='svnlite',
   pollInterval=4 * 3600))

# Example for Git:
# c['change_source'].append(changes.GitPoller(
#     repourl='https://github.com/AndiDog/freebsd-ports.git',
#     project='freebsd-ports',
#     branches=['custom'],
#     pollInterval=4 * 3600))
. . .

Dadurch wird das SVN-Repository alle vier Stunden auf dem Buildbot-Master abgefragt, und alle neuen (noch nicht gesehenen) Änderungen werden an übereinstimmende Scheduler weitergeleitet, was wiederum Builds auslösen würde, die schließlich zur Ausführung auf unserem einzelnen Buildbot-Worker gesendet werden. Der Ports-Baum ist sehr groß, und beim ersten Start laden diese Poller den vollständigen Verlauf herunter (für Git nur die angegebenen Zweige). Dies kann einige Minuten dauern und erheblichen Speicherplatz beanspruchen (mehrere Gigabyte).

Wenden Sie die neue Konfigurationsdatei an, indem Sie Buildbot neu starten:

service buildbot restart

In diesem Beispiel haben Sie die Auflistung der Upstream-Ports aus "+ svn: // svn.freebsd.org / ports / " verwendet und Builds werden immer dann geplant, wenn sich der Zweig " 2019Q2 +" ändert. Wie bereits erwähnt, sind die vierteljährlichen Zweigstellen größtenteils stabil und werden nur selten aktualisiert. Da Sie wahrscheinlich nicht warten möchten, bis eine solche Änderung eingeht, bevor der Build zum ersten Mal ausgelöst wird, lassen Sie es uns einmal von Hand ausführen.

Öffnen Sie Ihr Buildbot-Webinterface (+ http: /// buildbot / +) und navigieren Sie zu * Builds> Builders> bulk-112amd64-2019Q2 *. Es werden noch keine Builds angezeigt.

image: https: //assets.digitalocean.com/articles/buildbot_poudriere/step7a.png [Bulk-Builder-Seite - noch keine Builds]

Klicken Sie oben rechts auf die Schaltfläche * force * und dann auf * Start Build *. Dadurch wird der Build mit seinen Standardeinstellungen ausgelöst, d. H. Grund, Zweig und andere Werte werden nicht überschrieben. Es kann eine Minute dauern, bis der Schritt "Update Ports Tree" ausgeführt wird. Schließlich sollte der Poudriere-Build auch erfolgreich ausgeführt werden. Das Webinterface zeigt den Build als erfolgreich an.

Durch Klicken auf einen der Links (* Poudriere-Build * - und * Poudriere-Protokolle *) gelangen Sie zur Poudriere-Weboberfläche und erstellen Protokolle für diesen bestimmten Build (wie in Schritt 6 gezeigt). Erweitern Sie durch Klicken auf den Pfeil neben * make bulk * und dann * stdio> view all… lines *, um die vollständige Ausgabe des Befehls + poudriere bulk …​ + anzuzeigen.

Nach Abschluss des ersten Builds sind die Pakete nun verfügbar, wie in Nginx in Schritt 6 konfiguriert. Gehen Sie in einem Browser zu "+ http: /// packages / " (oder " http: /// packages / ") und klicken Sie sich durch das von Poudriere erstellte Paket-Repository. Sie finden die eigentlichen Paketdateien (` *. Txz `), sobald Sie eines der Repositorys betreten und zum Unterverzeichnis ` All / +` navigieren.

Jetzt, da Pakete über HTTPS verfügbar sind (oder HTTP, wenn Sie dies entschieden haben) und automatisch auf Änderungen der Portstruktur basieren, können Sie einen oder mehrere Hosts für die Verwendung dieser Pakete konfigurieren.

Schritt 8 - Konfigurieren von Paketclients

In diesem Schritt benötigen Sie einen zweiten FreeBSD-Server und richten ihn so ein, dass er die auf dem CI-Server erstellten Pakete abrufen und installieren kann. Wir werden diesen zweiten Server den * Paket-Client * nennen.

SSH in den * Client * Host. Die meisten verbleibenden Anweisungen in diesem Abschnitt werden auf dem * Client * ausgeführt:

ssh

Erstellen Sie das Verzeichnis für benutzerdefinierte Paket-Repository-Konfigurationen:

sudo mkdir -p /usr/local/etc/pkg/repos

Öffnen Sie als * root * -Benutzer einen Editor, um die Datei + / usr / local / etc / pkg / repos / ci.conf + zu erstellen, und geben Sie an, wie und wo Pakete abgerufen werden sollen:

sudo ee /usr/local/etc/pkg/repos/ci.conf

Wenn Sie sich für die Paketsignatur entschieden haben, verwenden Sie diesen Inhalt:

/usr/local/etc/pkg/repos/ci.conf

ci: {
   url: "http:///packages/",
   signature_type: "pubkey",
   pubkey: "/usr/local/etc/pkg/repos/ci.pub",
   enabled: yes
}

Wenn Sie auf die Paketsignatur verzichten möchten, deaktivieren Sie alternativ die Signaturprüfungen wie folgt:

/usr/local/etc/pkg/repos/ci.conf

ci: {
   url: "http:///packages/",
   signature_type: "none",
   enabled: yes
}

Sie haben das Paket-Repository fertig konfiguriert und aktiviert. Bei einer regulären FreeBSD-Installation wird jedoch auch das offizielle Paket-Repository "FreeBSD" aktiviert. Das Mischen von installierten Paketen aus verschiedenen Quellen ist eine kinderleichte Möglichkeit, Ihre Produktionssoftware irgendwann aufgrund von inkompatiblen Softwareversionen oder unterschiedlichen ABI-, API- oder Build-Optionen zum Absturz zu bringen. Alle Pakete auf einem Host sollten aus derselben Quelle stammen.

Die Standardkonfiguration des offiziellen Repository ist in + / etc / pkg / FreeBSD.conf + gespeichert. Diese Datei gehört zum Basissystem und sollte nicht berührt werden. Sie können jedoch die Einstellungen überschreiben, dh wir möchten das Repository vollständig deaktivieren, indem Sie das entsprechende Flag in eine Konfigurationsdatei unter "+ / usr / local / etc / pkg / repos " einfügen, in der auch Ihr eigenes Repository konfiguriert ist. Bitte erstellen Sie eine neue Datei " / usr / local / etc / pkg / repos / FreeBSD.conf +" mit einem Editor und verwenden Sie den folgenden Inhalt, um das FreeBSD-Repository zu deaktivieren:

sudo ee /usr/local/etc/pkg/repos/FreeBSD.conf

/usr/local/etc/pkg/repos/FreeBSD.conf

FreeBSD: {
   enabled: no
}

Wenn Sie sich auf einem vollständig unberührten * Paket-Client * -Host befinden, sind noch keine Pakete installiert, und Sie können sofort mit der Verwendung Ihres eigenen Paket-Repositorys beginnen. Wenn jedoch nur ein Paket von einer anderen Quelle installiert wurde, wird empfohlen, diese Pakete zu deinstallieren und mit Ihrer eigenen Quelle von vorne zu beginnen. Der Paketmanager "+ pkg " selbst wird als Paket installiert. Um das Henne-Ei-Problem zu lösen, wird das FreeBSD-Basissystem mit einer kleinen ausführbaren Datei " / usr / sbin / pkg " ausgeliefert, die den Paketmanager booten kann. Das heißt, laden Sie das Paket " pkg " herunter und installieren Sie es als erstes Paket auf dem System. Ab diesem Zeitpunkt unterstützt Sie die ausführbare Datei " / usr / local / sbin / pkg +" dieses Pakets als vollständiger Paketmanager.

Führen Sie den folgenden Befehl aus, um + pkg + zu booten:

sudo pkg bootstrap

In der Ausgabe von "+ package bootstrap" sollten Sie sehen, dass Pakete aus Ihrem eigenen Paket-Repository stammen, das wir in der Konfigurationsdatei "+ ci +" genannt haben. Wenn Sie einen Paketsignaturschlüssel verwenden, wird in der Ausgabe auch auf die Sicherheitsüberprüfung hingewiesen.

OutputThe package management tool is not yet installed on your system.
Do you want to fetch and install it now? [y/N]: y
Bootstrapping pkg from http:///packages/, please wait...
... done
Installing pkg-1.10.5_5...
Extracting pkg-1.10.5_5: 100%

Wenn Sie diese erfolgreiche Ausgabe sehen, fahren Sie mit dem nächsten Notenblock fort. Wenn jedoch der Paketmanager oder andere Pakete bereits von einer anderen Quelle installiert wurden und diese Fehlermeldung angezeigt wird:

Outputpkg already bootstrapped at /usr/local/sbin/pkg

Folgen Sie dann bitte den Anweisungen im Hinweis.

In dem wahrscheinlichen Fall, dass Sie Ihren Paket-Host mit einem Let’s Encrypt-Zertifikat für HTTPS einrichten, stoßen Sie auf das Hühnchen-und-Ei-Problem, bei dem Ihr Paket-Host nicht vertrauenswürdig ist, Sie jedoch das Paket + ca_root_nss + installieren müssen ( vertrauenswürdige Stammzertifizierungsstellen enthalten), um der Let’s Encrypt-Zertifizierungsstelle zu vertrauen und damit auch dem Server zu vertrauen, auf dem Ihre benutzerdefinierten Pakete gehostet werden. Das gleiche Problem würde auftreten, wenn Sie eine interne Zertifizierungsstelle verwenden (von Ihnen oder Ihrem Unternehmen selbst signiert). Zertifikatsüberprüfungsfehler führen zu einer Fehlerausgabe wie folgt, wenn der Paketmanager gebootet wird:

OutputThe package management tool is not yet installed on your system.
Do you want to fetch and install it now? [y/N]: y
Bootstrapping pkg from https://example.com/packages/112amd64-2019Q2, please wait...
Certificate verification failed for /C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3
34389740104:error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed:/usr/src/crypto/openssl/ssl/s3_clnt.c:1269:
[...]

Wenn Sie diesen Fehler sehen, befolgen Sie bitte die Anweisungen im Hinweis unten. Andernfalls sind Sie fertig und können diesen Teil überspringen und nach der Notiz fortfahren.

Wenn Sie bereits vorhandene Pakete gelöscht haben, ist es jetzt ein guter Zeitpunkt, wichtige Tools neu zu installieren (z. sudo) sowie alle anderen gewünschten Pakete.

pkg install bash sudo

Und aus der Root-Shell aussteigen, falls das noch der Fall ist:

exit

Um zu testen, ob alles funktioniert, installieren Sie Pakete von der in der Buildbot-Masterkonfiguration angegebenen Liste (Variable + PORTS_TO_BUILD +). Zum Beispiel die Bash-Shell und sudo:

sudo pkg install bash sudo tmux

Bestätigen Sie die Installation erneut mit + y + und dann + ENTER +. Die Paketinstallation sollte ohne Probleme ausgeführt werden.

Sie können "+ pkg info " verwenden, um die derzeit installierten Pakete (einschließlich eventueller Abhängigkeiten) aufzulisten. Um sicherzustellen, dass keine Pakete aus anderen Quellen installiert sind, was zu Konflikten oder Inkompatibilitäten führen kann, können Sie installierte Pakete mit diesen Details mit der Abfrage ` pkg"% n: autoinstalled =% a from repo =% R "` auflisten. Beachten Sie, dass " pkg " als Bootstrap aus " unknown-repository +" angezeigt wird. Aus diesem Grund haben Sie zuvor die Bootstrap-Ausgabe überprüft, um festzustellen, dass der Paket-Manager selbst auch aus Ihrem eigenen Paket-Repository stammt.

In diesem letzten Schritt haben Sie den Zugriff auf das Paket-Repository des CIs auf einem Client konfiguriert und die Prüfung der Paketsignatur zu Sicherheitszwecken optional aktiviert. Sie haben sichergestellt, dass Pakete nur aus einer Quelle stammen, um Kompatibilitätsprobleme zu vermeiden installierte Ihre gewünschten Pakete wie vom CI erstellt.

Fazit

In diesem Lernprogramm haben Sie Poudriere installiert und konfiguriert, die Paketerstellung automatisiert ausgeführt und den sicheren Zugriff auf das Paket-Repository von einem Client-Host aus konfiguriert. Das Ergebnis sind die neuesten erstellten Pakete, die von einer einzigen zentralen Quelle installiert wurden. Das Setup versetzt Sie in eine hervorragende Lage, um Ihre Server konsistent und auf dem neuesten Stand zu halten und Versions-Upgrades externer Softwarepakete zu verwalten.

Um Ihr aktuelles Setup weiter zu verbessern, können Sie ausgewählte Folgeschritte in Betracht ziehen:

  • * Nur für den privaten Zugriff *: Standardmäßig haben Droplets eine öffentliche IP-Adresse im Internet. Buildbot http://docs.buildbot.net/latest/developer/auth.html unterstützt auch die Authentifizierung], ist jedoch standardmäßig ungeschützt.

  • * Warnung bei Build-Problemen *: Lesen Sie zunächst, wie Sie Buildbot reporters einrichten.

  • * Halten Sie den Ports-Baum auf dem neuesten Stand. *: In den Beispielen aus dem Tutorial wurde der Zweig quarterly branch 2019Q2 verwendet. Sie sollten jedoch eventuell auf einen neueren Baum wechseln oder Ihren verwenden eigenes versionskontrolliertes Repository zum Anwenden der gewünschten Patches.

  • * Builds für eigene Projekte hinzufügen *: Das FreeBSD Porter’s Handbook erklärt, wie man ein Build-Rezept (einen port) schreibt, wenn man bauen möchte und installiere deine interne Software als FreeBSD-Pakete.

  • * Überwachen veralteter Pakete auf Clients *: Sie können installierte Pakete auf einem Client mit den neuesten verfügbaren Paketen auf dem CI vergleichen, indem Sie die Ausgabe von `+ sudo pkg update -q && sudo pkg version -q --not-like" = "+ verwenden `, das alle Pakete ausgibt, deren Version nicht genau übereinstimmt. Weitere Informationen finden Sie auf der manpage of pkg-version.

  • * Bereinigungsjob hinzufügen *: Im Laufe der Zeit wird das Buildbot-Worker-Gefängnis voll mit alten Build-Protokolldateien, Quell-Tarballs und möglicherweise veralteten Paketen sein. Verwenden Sie die Befehle "+ poudriere {logclean, distclean, pkgclean} +", um zu bereinigen (siehe manpage of poudriere).

Related