2838gelesen 0Kommentare
Meine bisherigen Tests von PHP-Applikationen waren meist Langläufer. Zuerst müssen grundsätzliche Dinge erledigt werden:
- PHP-Docker-Container aus dem Docker-Hub laden
- Software und Abhängigkeiten installieren
- Module installieren
- Module konfigurieren und aktivieren
- composer und andere Helfer installieren
Nach diesen Aufgaben kann mit der eigentlichen Software weitergemacht werden:
- Git-Repository auschecken
- Mit Hilfe des composer sämtliche Bibliotheken nachladen und Installationsaufgaben erledigen
Und jetzt kann mit dem Testen der Anwendung begonnen werden. Dabei gingen, je nach System- und Netzwerklast mal gerne 5 Minuten vorüber, bis ich einen echten Feedback aus der Continuous Integration Kette zurück bekommen habe. Und – bekanntlich werden Software-Projekte immer komplexer – somit wird der automatisierte Testlauf mit der Zeit immer länger.
Erste Optimierung
So habe ich angefangen Caches für sämtliche Teile wie Docker-Container und composer aufzubauen. Dadurch konnte die Netzwerk-Last reduziert werden, doch die Punkte der Installation und Konfiguration innerhalb des Containers mussten weiterhin erledigt werden.
Anfangs wurde dadurch die Durchlauf-Zeit verkürzt. Doch spätestens mit der ersten Kundenanfrage, den Code mit verschiedenen PHP-Versionen zu testen (PHP 7.1 / PHP 7.2) war die Laufzeit und die anschließende Rückmeldung wieder ernüchternd.
Eigene Docker-Container
Nun wurde schnell klar – ich brauche eigene fertige Docker-Container. Der Gedanke fühlte sich im ersten Moment komplex an – in der Nachbetrachtung hat dies sich allerdings als falsch erwiesen.
Eigene Container Registry
Nun, da ich mit Gitlab arbeite, habe ich zuerst die Funktionalität der Container Registry aktiviert und konfiguriert. Die Registry ermöglicht innerhalb von Gitlab für jedes Projekt einen eigenen Speicherbereich für Docker-Abbilder anzulegen und zu verwalten. (Mehr Informationen zur Registry-Funktion findest du auf docker.com)
Um die Container für eine Vielzahl von Projekten nutzen zu können habe ich ein eigenes Projekt für die Container angelegt.
Eigenes Repository
Im eigenen Projekt gibt es – selbstverständlich – eine .gitlab-ci.yml
Datei, denn die Container sollen nach Anpassungen automatisiert erstellt werden.
Als Grundlage habe ich 2 quell-offene Repositories auf GitHub.com gefunden, die ich als Grundstock für mein Projekt benutzt habe:
Mir waren beim Bau der Container-Images einige Dinge wichtig:
- Als Grundstock werden die offiziellen PHP-Pakete aus dem Docker-Hub verwendet.
- Die Konsistenz der Pakete muss passen – die Container müssen getestet werden
- Für Entwicklung und Produktion werden unterschiedliche Images erstellt (in Arbeit – die Produktions Images sind ohne Test-Software und Erweiterung – außerdem teste ich mit php-cli und für die Produktion benötige ich fpm)
- Alle Container sollen nach Fertigstellung einer Security-Prüfung unterzogen werden (in Arbeit – ich werde hier sysdig inspect ausprobieren – sobald ich das habe schreibe ich dazu einen eigenen Artikel)
Ich habe die PHP-Versionen 7.1, 7.2 und 7.3 gewählt (aktuell verwende ich 7.3 noch nicht, da hier noch keine kompatible xdebug
-Erweiterung verfügbar ist).
Neben der PHP-Container habe ich gleich weitere Images gebaut:
- MariaDB 10.3
- alpine Linux 3.8 mit einigen Basis-Paketen
- nginx 1.15
Du findest mein Repository unter: GitLab.com/hopplin/docker-php