Das Thema Build-Skripte wird im PHP-Umfeld immer wichtiger – dank Virtualisierung, dem verstärkten Einsatz von Middleware in der Applikationsarchitektur und dem Aufkommen von immer neuen Tools, die Teilaspekte der Applikationsentwicklung und -pflege drastisch vereinfachen.
Der Status quo im Jahr 2017 ist ein ganz anderer als noch vor zwei oder mehr Jahren. Diese neuen Anforderungen auf bereits bestehenden Systemen abzubilden, fällt dabei zusehends schwerer. Im folgenden Artikel wollen wir eine Abgrenzung dieser neuen Anforderungen wagen und mit PSH einen möglichen Lösungsvorschlag präsentieren.
Aktuelle Build-Systeme, wie z. B. Ant, bieten viele Möglichkeiten, um Prozesse zu automatisieren, doch benötigen für einen effektiven Einsatz einen zeitintensiven Einarbeitungsaufwand. Zusätzlich müssen in der Regel Abhängigkeiten wie Java o. Ä. installiert sein, die die eigentliche Applikation gar nicht zur Ausführung benötigt. Build-Systeme entwickeln sich zusehends zu einer Middleware, da sie immer mehr Systeme und Dienste miteinander verknüpfen müssen (Abb. 1).

Auf der einen Seite müssen verschiedene Environments für die Entwicklung und Continuous Integration provisioniert werden, andererseits muss die Applikation abhängig von dem Environment spezifisch konfiguriert werden können. Die Instanzen unterscheiden sich in der Regel durch unterschiedliche Zugangsdaten und Pfadangaben. Des Weiteren ist zum Beispiel in einem automatisch generierten Release-Package PHPUnit nicht notwendig. Aus den beschriebenen Szenarien ergeben sich schnell verschiedene Kombinationsmöglichkeiten von Environments und notwendigen Skripten (Tabelle 1).
Environment | Skripte |
---|---|
Local | Initialisierung der Applikation, Ausführung der Testsuite, Cache der Applikation leeren |
Local Docker | Initialisierung der Applikation, Ausführung der Testsuite, Cache der Applikation leeren, Docker-Container verwalten, Continuous Integration, Softwarequalitätsmetriken überprüfen |
Vagrant/Windows | Entwicklung, Releasepackage erstellen |
Continuous Integration Docker | Ausführung der Testsuite, Cache der Applikation leeren, Daily-Builds, Softwarequalitätsmetriken überprüfen, Releasepackage bauen |
Live | Aktualisierung der Applikation |
Tabelle 1: Applikationsumgebungen
Aus unserem Entwicklungsalltag und Erfahrungen aus mehreren Open-Source-Projekten ergeben sich nachfolgend dargestellte Anforderungen an ein Build-System, die sich mit den meisten Anforderungen von Webanwendungen decken.
Einfache Orchestrierung von Services und Systemen
Es gibt für einen Programmierer verschiedene Möglichkeiten, eine Entwicklungsumgebung aufzusetzen. Die geläufigsten sind Vagrant, Docker oder eine vollständige lokale Installation aller notwendigen Serverdienste. Wie man in Abbildung 2 sehen kann, sind für das Aufsetzen einer lokalen Docker-Umgebung für die Entwicklung verschiedene Schritte notwendig: Zuerst müssen die benötigten Docker-Container gebaut und gestartet werden, danach ist eine Initialisierung der Applikation, in der Regel mit Composer, notwendig. Abschließend kommt meist ein Grunt-Prozess zum Einsatz, der die notwendigen *.css- und *.js-Dateien für das Frontend generiert. Diese Schritte werden durch kleinere Shell-Skripte ausgeführt und somit orchestriert.

Das Build-System als dünne Garantieschicht
Ein ideales Build-System legt sich wie eine dünne Haut auf die entwickelte Software und bringt keine unnötige Komplexität mit ein. Es informiert im Build-Prozess zuverlässig über Fehler und unterstützt den Entwickler bei der Automatisierung des Prozesses mit hilfreichen Werkzeugen. Ein exemplarischer CI-Prozess ist in Abbildung 3 zu sehen. Auch hier werden im ersten Schritt die benötigten Docker-Container ...