16. Januar 2024
Eine kurze Einführung in phabalicious
Das Open-Source-Tool Phabalicious (oder einfach phab) kann Entwickler*innen bei ihrer täglichen Arbeit in vielerlei Hinsicht unterstützen. Es hilft beim Aufsetzen der lokalen Applikation, um Daten von einer entfernten Installation zu kopieren oder einfach um entfernte Instanzen zu untersuchen. Doch wie funktioniert phabalicious eigentlich? In diesem Artikel möchten wir genau das zeigen, anhand eines praktischen Ansatzes.
phabalicious: Eine Definition
Phabalicious (oder einfach phab) ist ein Open-Source-Projekt, das das Innenleben einer Konfiguration abstrahieren soll. Es handelt sich um eine in PHP/Symfony geschriebene command-line Applikation, die von GitHub heruntergeladen und auf einem lokalen Computer installiert werden kann. Es verwendet die Konfiguration, die in einer speziellen Datei im Stammverzeichnis des Projekts gespeichert ist (das fabfile.yaml
) um Aufgaben in einer Shell auszuführen. Diese Shell kann von einem Docker-Container, einer ssh-Verbindung, einem Kubernetes-Pod oder einer lokalen Shell bereitgestellt werden. Das heißt, es können sämtliche Devops-Skripte in der fabfile gespeichert und auf eine Reihe von Konfigurationen angewendet werden.
Phabalicious in Action
Für diese Demo installieren wir phabalicious in den aktuellen Ordner, damit es später leicht wieder entfernt werden kann. Die Installationsdokumentation ist hier zu finden. Zuerst erstellen wir einen Demonstrationsordner:
Dies sollte zum folgenden Ergebnis führen
Sehr gut! Phab ist installiert und läuft einwandfrei! (Bei Problemen hilft ein Blick in die System-Vorraussetzungen)
A einfaches Vue-basiertes Beispiel
Beginnen wir mit einem einfachen Beispiel, bei dem ein Vue hello-world Projekt verwendet wird. Zunächst einmal müssen wir das Vue-Projekt erstellen. Nehmen wir an, es befindet sich noch im phab
-Demonstrations-Ordner:
Vue sollte ein neues Projekt im Ordner hello-world
angelegt haben. Jetzt erstellen wir eine Datei, um die Konfiguration des Projekts zu speichern:
Konfiguration
Ein zentraler Ort, um alle projektrelevanten Konfigurationen als Teil des Projekts zu speichern, ist die .fabfile.yaml
.
Die Projektkonfiguration ist composable
und kann Daten aus mehreren, auch entfernten Quellen vereinen. Hier ist ein Schema, das den Vererbungsmechanismus von phabalicious beschreibt:
Das Schaubild beschreibt alle potentiellen Wege, wie Daten mit phabalicious vererbt werden können. Globale Konfiguration, die irgendwo auf einem entfernten Server verfügbar ist, können mit Konfigurationsdateien vom lokalen Server und mit der aktuellen Projektkonfiguration in der fabfile.yaml zusammengeführt werden.
Beginnen wir mit einer einfachen Host-Konfiguration:
Running ../phab list:hosts
should list your config:
Bevor wir mit unserer Demo fortfahren, werfen wir einen Blick in den Bereich needs
. Jede Konfiguration kann deklarieren, welche Methoden sie benötigt, um optimal zu funktionieren.
Methoden
Methoden (methods) wissen, wie man mit bestimmten Aspekten einer Anwendung umgeht, z.B. wie man mit einer Datenbank interagiert, wie man seine Programm-Abhängigkeiten installiert oder wie man eine Drupal-Installation zurücksetzt oder installiert.
Hier ist ein Beispiel für eine typische Drupal-Anwendung:
Eine Vuejs Applikation dagegen könnte wie folgt aussehen:
Jede aktivierte Methode für eine Host-Konfiguration kann auf die verfügbaren Befehle reagieren. Schauen wir uns das mal an.
Befehle
Phab bietet eine Reihe von Befehlen (commands), die alle über phab list
aufgelistet werden können. Einer der am häufigsten genutzten Befehle ist reset
(zurücksetzen), der sicherstellt, dass die lokale Applikation die vorherigen Änderungen im Code und der Konfiguration akzeptiert. Normalerweise wird der Befehl reset
ausgeführt, nachdem zu einem neuen Brand gewechselt oder neuer Code in die lokale Installation gemerged wurde.
Wie wir im Screen-Recording sehen können, baut phab die yarn-Anwendung, wenn der reset
-Befehl ausgeführt wird. Dies liegt an unserer Deklaration der needs in der fabfile.yaml
Skripte
Phabalicious macht es einfach, Skripte (scripts) zu erstellen und zu ändern, die auf verschiedenen Instanzen und in fast jeder Phase der Aufgabenausführung ausgeführt werden können. Das bedeutet, dass das gleiche Skript wiederverwendet werden kann, um die Umgebung zu konfigurieren, unabhängig davon, wo sie eingesetzt wird.
Als nächstes fügen wir ein benutzerdefiniertes Skript zu unserem Projekt hinzu:
Now let’s try this out:
Shells
Shells können mit einer Vielzahl von Umgebungen interagieren, darunter lokale oder entfernte Server, sogar hinter Jump-Hosts, Docker- oder Kubernetes-Anwendungen. Solange phabalicious eine Shell für die Anwendung erstellen kann, kann es mit ihr interagieren. Also eine perfekte Lösung für die lokale Entwicklungsumgebung und das Produktionshosting.
Im vorherigen Beispiel wurde das Skript in einer lokalen Shell ausgeführt. Fügen wir nun Docker hinzu und erstellen eine neue Konfiguration, die ein Docker-Image aus unserem Hello-World-Beispiel erstellt und ausführt. Hier ist die angepasste .fabfile.yaml
, beachtet werden sollte die neue Host-Konfiguration und eine Liste von Docker-Tasks:
Das ist unser Docker-Ordner:
Also, los geht’s
Was ist nun im Hintergrund geschehen?
phab docker run
wird das Skript-Snippet aus dem fabfile Bereich ausführendockerHosts.dockerized
. Das Skript selbst führt einen weiteren phab-Befehl aus und zwardocker build
welcher die Kompilierung des Docker-Images triggern wird.- Die zweite Zeile
execute(docker, rm)
wird den docker task rm ausführen, der sämtliche laufenden Docker-Container stoppen und entfernen wird. - Danach wird der Docker-Container gestartet.
- Jetzt sollte der Output der Anwendung hier verfügbar sein: http://localhost:8080
Gehen wir im nächsten Schritt in den Container und inspizieren die Anwendung:
Woher weiß Phabalicous, welche Shell benötigt wird? In der Regel kann es aus den verwendeten Methoden für eine Konfiguration abgeleitet werden, aber man kann sie auch explizit über die Option shellProvider
überschreiben. In unserem Fall nutzen wir docker-exec
.
Zusammenfassung
Diese kurze Einführung hat einige der Schlüsselkonzepte von phabalicious erläutert:
- Modulare M
ethoden
, um die Konfiguration an die Bedürfnisse der Anwendung anzupassen (in unserem kurzen Beispiel nämlichyarn
unddocker
) - Wie Skripte und Ersetzungsmuster zusammenarbeiten, um hostspezifische Konfiguration in Skripten zu verwenden
- Wie wir mit dem
Shell
-Befehl mit unserer Anwendung interagieren können - Wer neugierig ist, was phabalicious unter der Haube ausführt, kann
-v
zum Befehl hinzufügen.
Hoffentlich konnte eine ungefähre Vorstellung davon bekommen werden, wozu phabalicious in der Lage ist. Wir haben nicht über Scaffolders oder Secrets gesprochen, mehr Infos dazu gibt es in der Dokumentation. Es gibt auch einen eher theoretischen Blog-Post über die Architektur von phabalicious. In einer nächsten Folge werden wir versuchen, ein Fabfile zu einem bestehenden Drupal-Projekt hinzuzufügen.