Im Hosting-Team von Babiel verwenden wir (natürlich) Git-Repos für unsere Anwendungen und Konfigurationen. Wir nutzen Gitlab um die Repos zu hosten. Dabei arbeiten wir stark mit Featurebranches, Merge Requests und CI-Pipelines, damit Änderungen vor dem Rollout einen Code-Review und automatische Tests durchlaufen können. Üblicherweise erlauben wir in unseren Repos nicht, direkt in den Hauptbranch (master/main) zu pushen, damit dort keine Änderungen ankommen, die die Pipeline für die Kolleg*innen kaputt machen würden.
Manchmal möchte man einen Branch tatsächlich deployen, um ihn bewerten zu können, bevor man ihn merget. Bei Gitlab gibt es dazu das Feature „Review Apps“, mit dem Branches in eine temporäre Umgebung ausgerollt werden können. Gitlab zeigt auch einen Link zu dieser Umgebung an, so dass man direkt dorthin springen kann. Wenn man den Branch löscht (was meistens automatisch beim Merge passiert), wird die temporäre Umgebung ebenfalls gelöscht.
Review Apps sind ein sehr nützliches Feature. Wir benutzen es für die meisten Services, die wir auf Kubernetes betreiben, denn dort können wir schnell zusätzliche Umgebungen erstellen und ebenso schnell auch wieder löschen.
Aber für manche Anwendungen ist es nicht möglich oder praktikabel, kurzfristig eine temporäre Instanz zu starten. Vielleicht lässt sich eine Instanz nicht ohne Vorarbeit einfach erstellen. Vielleicht bräuchte man zum Testen bestehende Daten, die in einer frischen Instanz nicht zur Verfügung stünden. Für ausgiebige Tests oder iterative Entwicklung ist es hier sinnvoll, sich auf dem Client eine Bastelumgebung zu schaffen (z.B. mit Docker oder Vagrant). Aber für viele Änderungen wäre das Overkill — man möchte nur kurz eine Änderung verifizieren, bevor man sie merget und produktiv ausrollt.
Für solche Situationen haben wir einen Weg gefunden, der für uns gut funktioniert: Wir betreiben dauerhaft ein Staging-Environment, auf dem auf Knopfdruck ein Branch ausgerollt werden kann. Gitlab erzwingt keine feste Zuordnung zwischen Branch und Environment, d.h. das Environment kann von beliebigen Branches benutzt werden.
Wir benutzen das Feature insbesondere für Monitoring, wo wir auf bestehende Daten zurückgreifen möchten wenn wir z.B. neue Alerts für Prometheus erstellen.
Der Ansatz hat natürlich ein Bottleneck mit der gemeinsamen Stage-Umgebung, den dedizierte Review-Umgebungen nicht hätten. Es ist also möglich, dass man sich mit mehreren Branches ins Gehege kommt. Bei unserer Teamgröße haben wir bisher aber keine Probleme mit den Repos, wo wir diesen Ansatz fahren. Bei Bedarf kann man im Gitlab sehen, wann wer welchen Stand auf die Umgebung ausgerollt hat.
Zusammengefasst ist dieser Ansatz für uns ein sehr nützlicher Kompromiss, der Review Apps auf Anwendungen überträgt, wo sie sonst nicht nutzbar wären. Damit erhöht er unser Vertrauen in Changes ohne viel zusätzlichen Aufwand.
Falls dieser Artikel dein Interesse geweckt hat, we are hiring 😉