4 CI/CD mit GitHub Actions

Software zu entwickeln ist eine Sache – sie zuverlässig und wiederholbar in Produktion zu bringen eine andere. Genau hier setzt die Kombination aus Continuous Integration und Continuous Deployment an. Was in der Theorie nach zwei getrennten Konzepten klingt, bildet in der Praxis eine durchgängige Pipeline: Code-Änderungen werden kontinuierlich integriert, getestet und bei Erfolg automatisch ausgeliefert.

GitHub Actions bietet die Werkzeuge, um diese Pipeline direkt dort zu implementieren, wo der Code lebt. Ohne zusätzliche Infrastruktur, ohne separate Tools für Build, Test und Deployment. Die gesamte Automatisierung liegt als Code im Repository und durchläuft denselben Review-Prozess wie die Anwendung selbst.

4.1 Continuous Integration – Früh und oft integrieren

Der Kern von Continuous Integration ist simpel: Änderungen fließen häufig in den Hauptentwicklungszweig ein und werden dabei automatisch validiert. Statt wochenlang isoliert an einem Feature zu arbeiten und am Ende ein Integration-Massaker zu erleben, integrieren Entwickler ihre Arbeit täglich oder sogar mehrmals am Tag.

Diese Philosophie erfordert Automatisierung. Niemand hat Zeit, nach jedem Commit manuell zu bauen und zu testen. GitHub Actions übernimmt diese Aufgabe. Bei jedem Push oder Pull Request startet ein Workflow, der den Code kompiliert, Tests ausführt und Qualitätsprüfungen durchläuft. Schlägt etwas fehl, erfährt das Team sofort davon – nicht erst Tage später.

Die Vorteile liegen auf der Hand: Probleme werden entdeckt, solange der Kontext noch frisch ist. Der Entwickler, der den Bug eingebaut hat, kann ihn fixen, ohne sich erst wieder in die Materie einarbeiten zu müssen. Die Codebasis bleibt in einem kontinuierlich funktionsfähigen Zustand.

Praktischer Hinweis: CI-Workflows sollten schnell sein. Ein Build, der 30 Minuten läuft, bremst die Entwicklung aus. Lieber in parallele Jobs aufteilen oder teure Tests in separate, nächtliche Workflows auslagern.

4.2 Die Anatomie einer CI-Pipeline

Eine typische CI-Pipeline durchläuft mehrere Phasen, die aufeinander aufbauen. Jede Phase validiert einen anderen Aspekt der Code-Qualität:

Checkout und Setup bilden die Basis. Der Code muss aus dem Repository geholt werden, Dependencies müssen installiert werden. Diese Phase ist in fast jedem Workflow identisch. Actions wie actions/checkout und die sprachspezifischen Setup-Actions (actions/setup-node, actions/setup-python, etc.) erledigen die Standardaufgaben.

Build kompiliert den Code. Bei interpretierten Sprachen entfällt dieser Schritt oft, bei kompilierten Sprachen wie Java, Go oder TypeScript ist er essenziell. Der Build dient als erste Validierung – Code, der nicht kompiliert, kann auch nicht funktionieren.

Test ist das Herzstück. Unit Tests validieren einzelne Komponenten isoliert. Integration Tests prüfen das Zusammenspiel mehrerer Komponenten. End-to-End-Tests simulieren echte Benutzerinteraktionen. Die Pyramide der Tests sollte sich in der Ausführungszeit widerspiegeln: Viele schnelle Unit Tests, weniger Integration Tests, noch weniger E2E-Tests.

Qualitätsprüfungen gehen über funktionale Tests hinaus. Linter prüfen Code-Stil. Static Analysis Tools suchen nach potenziellen Bugs und Security-Issues. Code Coverage misst, wie viel Code durch Tests abgedeckt ist. Diese Checks fangen Probleme, die Tests übersehen könnten.

Die Reihenfolge ist bewusst gewählt. Schnelle Checks zuerst, langsame später. Scheitert der Build, macht es keinen Sinn, Tests auszuführen. Schlagen Unit Tests fehl, sind Integration Tests irrelevant. Dieses Fail-Fast-Prinzip spart Rechenzeit und gibt schnelles Feedback.

4.3 Branch-Protection und Status Checks

CI allein bringt wenig, wenn fehlgeschlagene Builds ignoriert werden können. GitHub bietet Branch Protection Rules, die den Main-Branch absichern. Status Checks – also die Ergebnisse von Workflow-Läufen – können als Voraussetzung für Merges definiert werden.

Ein geschützter Branch erlaubt Merges nur, wenn definierte Workflows erfolgreich durchgelaufen sind. Schlägt der CI-Workflow fehl, blockiert GitHub den Merge-Button im Pull Request. Das zwingt zur Disziplin: Nur Code, der alle Qualitätskriterien erfüllt, gelangt in den Main-Branch.

Diese Kombination aus automatisierten Checks und erzwungenen Regeln bildet ein Sicherheitsnetz. Selbst unter Zeitdruck können keine ungetesteten Änderungen durchgewunken werden. Die CI-Pipeline wird vom hilfreichen Tool zur verbindlichen Instanz.

Branch Protection Feature Nutzen Empfehlung
Require status checks Erzwingt erfolgreiche CI-Läufe Immer aktivieren
Require branches to be up to date Verhindert Merge auf veralteter Basis Für kritische Branches
Require pull request reviews Mindestens ein Reviewer muss approven Für Teams ab 3+ Personen
Dismiss stale reviews Neue Commits invalidieren Approvals Bei häufigen Änderungen

4.4 Continuous Deployment – Der Weg in die Produktion

Während CI Code validiert, bringt Continuous Deployment ihn tatsächlich zu den Nutzern. Die Idee: Jede Änderung, die alle Tests besteht, wird automatisch deployed. Keine manuellen Release-Prozesse, keine Deployment-Fenster, keine vergessenen Hotfixes.

Das klingt riskant – und ist es auch, wenn die CI-Pipeline nicht robust genug ist. Aber genau das ist der Punkt: CD zwingt zu exzellenten Tests und Automatisierung. Ein Team, das automatisch deployed, muss seiner Pipeline vertrauen können. Dieses Vertrauen entsteht durch konsequente Investition in Test-Qualität.

GitHub Actions ermöglicht CD durch dieselben Mechanismen wie CI. Ein Workflow, der auf push zum Main-Branch reagiert, kann nach erfolgreichen Tests ein Deployment triggern. Die Deployment-Targets sind vielfältig: Cloud-Provider wie AWS, Azure oder GCP, Container-Plattformen wie Kubernetes, klassische Server via SSH, oder spezialisierte Plattformen wie Vercel oder Netlify.

Analogie: CI ist wie eine Qualitätskontrolle am Fließband – jedes Teil wird geprüft, bevor es weitergeht. CD ist die automatische Auslieferung der fertig geprüften Teile direkt zum Kunden. Beide Prozesse müssen nahtlos ineinandergreifen.

4.5 Deployment-Strategien und Rollout-Control

Nicht jedes Deployment muss identisch ablaufen. Je nach Risiko, Komplexität und Anforderungen bieten sich unterschiedliche Strategien an:

Direct Deployment ist die einfachste Form. Die neue Version ersetzt die alte sofort und vollständig. Schnell, aber auch unerbittlich. Ein kritischer Bug erreicht alle Nutzer gleichzeitig.

Blue-Green Deployment betreibt zwei identische Umgebungen. Die neue Version wird in der inaktiven Umgebung deployed. Nach erfolgreichen Smoke Tests wird der Traffic umgeschaltet. Bei Problemen lässt sich mit einem weiteren Switch zurückrollen.

Canary Releases rollen schrittweise aus. Zunächst erreicht die neue Version nur einen kleinen Prozentsatz der Nutzer. Monitoring zeigt, ob Fehleraten steigen. Läuft alles stabil, wird der Rollout ausgeweitet. Bei Problemen betrifft es nur wenige Nutzer.

Feature Flags entkoppeln Deployment von Release. Code wird deployed, Features bleiben aber deaktiviert. Per Konfiguration lassen sich Features für bestimmte Nutzergruppen freischalten. Das ermöglicht A/B-Tests und schrittweise Releases ohne erneutes Deployment.

Die Wahl der Strategie hängt von mehreren Faktoren ab: Wie kritisch ist die Anwendung? Wie schnell lassen sich Rollbacks durchführen? Welche Monitoring-Infrastruktur existiert? Ein internes Tool kann direct deployen. Eine öffentliche API mit SLA braucht ausgefeilte Rollout-Mechanismen.

4.6 Environments und Approval Gates

GitHub Actions kennt das Konzept der Environments – benannte Deployment-Ziele mit eigenen Konfigurationen. Ein Repository hat typischerweise mehrere Environments: development, staging, production.

Environments bringen zwei wesentliche Features mit. Erstens: Environment-spezifische Secrets. Die Produktions-Datenbank-Credentials sind andere als die des Staging-Systems. Durch Environments bleiben diese Secrets getrennt und ein Workflow bekommt automatisch die richtigen, je nachdem welches Environment er anspricht.

Zweitens: Approval Gates. Für kritische Environments wie Produktion lässt sich definieren, dass ein oder mehrere Teammitglieder das Deployment explizit freigeben müssen. Der Workflow pausiert an dieser Stelle und wartet auf menschliche Intervention. Das kombiniert Automatisierung mit menschlicher Kontrolle – ideal für risikoreiche Deployments.

Praktischer Hinweis: Approval Gates sollten sparsam eingesetzt werden. Jede manuelle Freigabe ist eine Unterbrechung des Flows. Für häufige Deployments – mehrmals täglich – sind Approvals unpraktikabel. Besser: Robuste automatisierte Tests und gutes Monitoring, das Probleme schnell erkennt.

4.7 Die CI/CD-Pipeline als Ganzes

CI und CD sind keine getrennten Welten, sondern Teile einer durchgängigen Pipeline. Der CI-Teil validiert Änderungen, der CD-Teil bringt sie zu den Nutzern. In GitHub Actions manifestiert sich das oft in einem einzigen Workflow mit mehreren Jobs.

Ein realistisches Setup könnte so aussehen: Der Workflow triggert bei Push zum Main-Branch. Job 1 führt die CI-Checks durch – Build, Tests, Linting. Job 2 hängt von Job 1 ab und deployed zu Staging, aber nur wenn Job 1 erfolgreich war. Job 3 hängt von Job 2 ab und deployed zu Produktion – ebenfalls nur bei Erfolg und zusätzlich mit Approval Gate.

Diese Verkettung stellt sicher, dass jede Stufe auf validierten Code aufbaut. Fehler werden früh erkannt, bevor sie Produktionssysteme erreichen. Die Pipeline wird zum Fließband, das nur einwandfreie Änderungen durchlässt.

4.8 Parallelität und Concurrency Control

Ein häufiges Problem: Mehrere Deployments laufen gleichzeitig. Developer A pushed eine Änderung, zwei Minuten später pusht Developer B. Beide Workflows starten parallel. Ohne Koordination könnte der zweite Workflow das Deployment des ersten überschreiben – mit unvorhersehbaren Folgen.

GitHub Actions bietet Concurrency Control für solche Szenarien. Ein Workflow kann definieren, dass nur eine Instanz gleichzeitig laufen darf. Weitere Instanzen warten oder werden abgebrochen, je nach Konfiguration. Für CD-Workflows ist das essenziell: Nur ein Deployment zur Zeit, sauber nacheinander.

Die Konfiguration erfolgt über den concurrency-Schlüssel mit einer Group-ID. Workflows mit derselben Group-ID schließen sich gegenseitig aus. Für Produktions-Deployments könnte die Group production-deploy heißen – damit ist sichergestellt, dass nie zwei Deployments gleichzeitig laufen, egal von welchem Branch sie kommen.

4.9 Monitoring und Rollback-Strategien

Eine CD-Pipeline endet nicht mit dem Deployment. Post-Deployment-Monitoring ist genauso wichtig wie Pre-Deployment-Testing. Automatisierte Health Checks können grundlegende Funktionalität verifizieren. Ist die Anwendung erreichbar? Antwortet die API? Lässt sich ein Login durchführen?

Diese Checks laufen als Teil des Deployment-Workflows. Schlagen sie fehl, kann ein automatischer Rollback getriggert werden. Das erfordert, dass die Rollback-Logik bereits implementiert ist – sei es durch Blue-Green-Switching, Container-Orchestrierung oder Versions-Tagging.

Darüber hinaus sollte externes Monitoring die Deployment-Pipeline ergänzen. Metriken wie Response Times, Fehlerraten und Ressourcen-Auslastung geben Aufschluss über die tatsächliche Gesundheit der Anwendung. Bei Anomalien nach einem Deployment – erkennbar durch Vergleich mit vorherigen Werten – ist menschliche Intervention gefragt.

Monitoring-Ebene Was wird geprüft Reaktionszeit Automatisierbar
Health Checks Erreichbarkeit, grundlegende Funktion Sekunden Ja
Smoke Tests Kritische User Journeys Minuten Ja
Metriken Performance, Fehlerraten Minuten bis Stunden Teilweise
Business KPIs Conversion, User Engagement Stunden bis Tage Nein

4.10 Der kulturelle Aspekt

CI/CD ist nicht nur Technologie, sondern auch Kultur. Teams müssen bereit sein, häufig zu integrieren und zu deployen. Das erfordert Vertrauen in die Automatisierung und Disziplin beim Schreiben von Tests. Ein Test, der “manchmal” fehlschlägt, untergräbt das Vertrauen. Ein Deployment, das “meist” funktioniert, ist inakzeptabel.

Die Einführung von CI/CD verändert Arbeitsweisen. Feature Branches werden kürzer, denn lange Branches sind Integration-Albträume. Pull Requests werden kleiner, denn große Changes sind schwerer zu reviewen. Releases verlieren ihren Event-Charakter – deployed wird kontinuierlich, nicht einmal im Quartal.

GitHub Actions unterstützt diese Kultur durch niedrige Einstiegshürden. Ein simpler CI-Workflow ist in Minuten aufgesetzt. Die Komplexität wächst mit den Anforderungen, aber der Anfang ist leicht. Das ermöglicht iterative Verbesserung – erst CI etablieren, dann CD hinzufügen, dann Deployment-Strategien verfeinern.