08. März 2022

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:

Image showing a schema describing the inheritance-mechanism from phabalicious. From 1) remote configuration files over local config in parent folder and local config override in parent folder to fable.yaml in the project-folder and finally to fabfile.override.yaml in the project-folder

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:

Image showing an example for methods in phabalicious to deal with certain aspects of your application, e.g. how to interact with a database, how to install your dependencies or how to reset or install a Drupal installation

Eine Vuejs Applikation dagegen könnte wie folgt aussehen:

Image showing an example for methods in phabalicious to deal with certain aspects of your application with a vue application

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?

  1. phab docker run wird das Skript-Snippet aus dem fabfile Bereich ausführen dockerHosts.dockerized. Das Skript selbst führt einen weiteren phab-Befehl aus und zwar docker build welcher die Kompilierung des Docker-Images triggern wird. 
  2. Die zweite Zeile execute(docker, rm)wird den docker task rm ausführen, der sämtliche laufenden Docker-Container stoppen und entfernen wird.
  3. Danach wird der Docker-Container gestartet.
  4. 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 Methoden, um die Konfiguration an die Bedürfnisse der Anwendung anzupassen (in unserem kurzen Beispiel nämlich yarn und docker)
  • 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.

Stephan Maximilian Huber

Stephan Maximilian Huber

Geschäftsführer und Partner

stephan@factorial.io