Installation von Abhängigkeiten mit Nix
Grundlegende Verwendung
Um binäre Abhängigkeiten während der prepare- oder run-Phase der CI-Pipeline zu installieren, unterstützt Codesphere den Nix Package Manager. Nix wird gegenüber traditionellen Linux-Paketmanagern wie apt oder yum aus mehreren Gründen bevorzugt:
- Nix benötigt keine Root-Rechte, um Pakete zu installieren, da es das Root-Dateisystem nicht verändert.
- Nix ermöglicht es, mehrere Versionen eines Pakets gleichzeitig installiert zu haben, was für Tests und Entwicklung nützlich ist.
- Nix bietet eine deklarative Möglichkeit, Abhängigkeiten und deren Versionen festzulegen, was den Einsatz in CI-Pipelines, bei denen Reproduzierbarkeit wichtig ist, ideal macht.
- Nix verwendet Channels zur Verwaltung von Paketversionen, wodurch einfach zwischen verschiedenen Versionen eines Pakets gewechselt oder auf die neueste Version aktualisiert werden kann.
Nix bietet eine große Sammlung vorgefertigter Pakete unter search.nixos.org/packages.
Der einfachste Weg, ein Paket über Nix zu installieren, ist die Verwendung des Befehls nix-env.
nix-env -iA nixpkgs.<PACKAGE_NAME>
Um beispielsweise das Tool cowsay in den Workspace zu installieren, suche nach cowsay in den Nix-Paketen und kopiere den nix-env-Befehl für Nicht-NixOS-Systeme, also:
nix-env -iA nixpkgs.cowsay
Nix installiert Pakete in das Verzeichnis /nix/store unter einem versionierten Pfad, der vom restlichen Dateisystem isoliert ist. Beim Installieren eines Pakets wird ein Symlink zur ausführbaren Datei im Verzeichnis /nix/store erstellt.
In Codesphere wird der Nix Store automatisch zwischen allen Reactives geteilt. Wenn also Nix-Pakete in der prepare-Phase installiert werden, sind sie auch in der run-Phase jedes Services verfügbar, ohne dass sie erneut installiert werden müssen.
Installierte Pakete können mit der Option -q aufgelistet werden:
nix-env -q
Um ein bestimmtes Paket zu aktualisieren, verwende die Option -u:
nix-env -uA nixpkgs.cowsay
Um alle über Nix installierten Pakete zu aktualisieren, führe einfach folgenden Befehl aus:
nix-env -u '*'
Falls nötig, können Pakete mit der Option -e entfernt werden:
nix-env -e cowsay
Nix-Dokumentation
Die vollständige Dokumentation für nix-env findet sich im Nix Manual
Nix Channels und Paketversionen
Nix verwaltet die Version jedes Pakets über Nix Channels. Wenn eine bestimmte Version eines Pakets installiert werden muss, kann der Channel im nix-env-Befehl angegeben werden. Um beispielsweise ein Paket aus dem Channel nixos-25.11 zu installieren, kann Folgendes ausgeführt werden:
nix-channel --add https://nixos.org/channels/nixos-25.11 nixos-25_11
nix-channel --update nixos-25_11
Anschließend kann das Paket aus diesem Channel installiert werden:
nix-env -iA nixos-25_11.<PACKAGE_NAME>
Mit den folgenden Befehlen lässt sich überprüfen, welche Channels bereits hinzugefügt wurden:
nix-channel --list
Nix Channels
Codesphere verwendet standardmäßig den Channel nixos-unstable, der ein Rolling Release ist und häufig mit den neuesten Paketversionen aktualisiert wird. Für die meisten Anwendungsfälle ist dieser Channel geeignet. Falls jedoch mehr Stabilität oder bestimmte Paketversionen benötigt werden, kann wie oben beschrieben zu einem anderen Channel gewechselt werden.
Entwicklungsumgebungen mit Nix Shells erstellen
Bei Verwendung von nix-env werden Abhängigkeiten „global" im Rahmen eines Codesphere Workspace installiert. Als besonderes Merkmal ermöglicht Nix zudem die Erstellung isolierter Umgebungen mit dem Befehl nix-shell.
Bei der Verwendung von Nix Shells sind die installierten Abhängigkeiten flüchtig und spezifisch für die jeweilige Shell-Sitzung, was eine bessere Reproduzierbarkeit und das Nebeneinanderbestehen verschiedener Umgebungen ermöglicht.
Der einfachste Weg, eine Nix Shell zu erstellen, ist die Ausführung von nix-shell mit der Option -p, gefolgt von den Paketen, die in die Shell-Umgebung eingebunden werden sollen. Um beispielsweise eine Nix Shell mit Python 3 und dem NumPy-Paket zu erstellen, kann Folgendes ausgeführt werden:
nix-shell -p python3 python3Packages.numpy
Für besser reproduzierbare Umgebungen kann eine shell.nix-Datei definiert werden. Diese Datei legt die Abhängigkeiten und Umgebungsvariablen fest, die für das Projekt benötigt werden.
Um beispielsweise eine Nix Shell mit denselben Paketen zu erstellen, kann eine shell.nix-Datei mit folgendem Inhalt angelegt werden:
# shell.nix
{ pkgs ? import (fetchTarball "https://channels.nixos.org/nixos-25.11/nixexprs.tar.xz") {} }:
pkgs.mkShell {
nativeBuildInputs = [
pkgs.python3
pkgs.python3Packages.numpy
];
}
Um die Nix Shell zu betreten, führe folgenden Befehl im Verzeichnis mit der Datei shell.nix aus:
nix-shell
Channels in Nix Shells fixieren
Der Befehl fetchTarball „fixiert" die Umgebung auf eine bestimmte Version aller Nix-Pakete und stellt so eine hohe Reproduzierbarkeit des Builds sicher. Die URL kann auf einen bestimmten Commit auf GitHub oder eine Nix-Channel-URL auf nixos.org verweisen.
Alternativ kann <nixpkgs> verwendet werden, um auf den am System konfigurierten Channel zu verweisen, was portabler, aber weniger reproduzierbar ist:
# shell.nix
{ pkgs ? import <nixpkgs> {} }:
pkgs.mkShell {
buildInputs = [ pkgs.python3 ];
}
Die Nix-Sprache ermöglicht die Definition komplexer Umgebungen mit mehreren Abhängigkeiten und benutzerdefinierten Konfigurationen, was über den Rahmen dieser Einführung hinausgeht. Weitere Informationen zum Erstellen und Anpassen von Nix Shells finden sich im Nix Manual.
Nix Shells in CI-Pipelines
nix-shell kann in der CI-Pipeline mit der Option --run aufgerufen werden, um einen Befehl innerhalb der Shell-Umgebung auszuführen. Zum Beispiel:
nix-shell --run "python3 my_script.py"
Dadurch wird my_script.py mit den in der Datei shell.nix definierten Abhängigkeiten in der Umgebung ausgeführt.
Verwendung nativer Linux-Paketmanager
Während der Nix-Ansatz eine große Anzahl gängiger Pakete abdeckt, ist es in manchen Fällen nicht möglich, Abhängigkeiten über Nix zu installieren. Ein Grund dafür könnte sein, dass der Maintainer des Pakets apt-Repositories anbietet, den Quellcode aber nicht veröffentlicht, sodass das Nix-Projekt sie nicht neu bauen kann.
In Codesphere Private Cloud Installationen können weiterhin native Linux-Paketmanager wie apt verwendet werden, indem benutzerdefinierte Basisimages mit den benötigten Paketen erstellt werden, ohne sie auf Workspace-Ebene zu installieren. Weitere Details finden sich im Install Guide.