Best Practices für CI/CD

Die Vorteile von CI/CD sind allgemein bekannt, aber wie können wir diese DevOps-Prozesse optimal nutzen?

Continuous Integration, Delivery und Deployment vereinfachen das Kompilieren, Testen und Veröffentlichen von Code. Diese Prozesse können Sie dabei unterstützen, Ihrer Benutzergemeinde schneller als mit herkömmlichen Methoden ein funktionierendes Produkt bereitzustellen. Eine gut konzipierte automatisierte Pipeline hilft Ihnen und Ihrem Team, konsistent und schnell funktionierende Software auszuliefern und unmittelbares Feedback zu Ihren neuesten Änderungen zu erhalten.

Entdecken Sie Best Practices, die Sie in Ihrer CI/CD-Pipeline anwenden können.

Früh und häufig Commits durchführen

Das Speichern der Gesamtheit Ihres Quellcodes sowie Ihrer Konfigurationsdateien, Skripte und Abhängigkeiten in einer Versionsverwaltung ist ein wichtiger erster Schritt bei der Implementierung von Continuous Integration.

Ein Versionsverwaltungssystem allein reicht jedoch nicht aus – Sie müssen es auch korrekt einsetzen. Continuous Integration soll die Umsetzung von Änderungen erleichtern, die von mehreren Beteiligten vorgenommen werden. Der Schlüssel hierbei sind häufigere Commits, um Ihre Änderungen in kürzeren Abständen für andere bereitzustellen.

So funktioniert es im Detail:

  • Jeder Commit löst eine automatisierte Testbatterie aus, die schnelles Feedback zu Ihren Änderungen gibt, damit Sie eventuelle Fehler schnell beheben können. Je öfter Sie Commits durchführen, desto regelmäßiger erhalten Sie dieses Feedback.
  • Der häufige Austausch von Änderungen mit Ihrem Team stellt sicher, dass alle auf der gleichen Grundlage aufbauen. Dies erleichtert die Zusammenarbeit und verringert das Risiko von Merge-Konflikten bei der Integration großer, komplexer Änderungen.
  • Ihre Branching-Strategie bestimmt, wohin Sie Ihre Änderungen pushen – in den Main-Branch, einen separaten Feature-Branch oder einen speziellen Entwicklungsbranch.
  • Als Anhaltspunkt sollten Sie anstreben, dass jedes Teammitglied mindestens einmal täglich einen Commit durchführt, um seine Änderungen mit den anderen zu teilen.

Anfangshürden überwinden

Häufiges Committen kann sich zunächst unangenehm anfühlen, etwa aus Angst vor Kontrollen oder weil die Aufgaben nicht an einem Tag zu erledigen sind. Von grundlegender Wichtigkeit ist es, im Team eine Kultur der Zusammenarbeit statt der Kritik aufzubauen. Wenn es darum geht, die Arbeitsabläufe zu ändern, ist es hilfreich, über die Art und Weise zu sprechen, wie man als Team arbeitet. Wenn Aufgaben in kleinere, überschaubare Teile gegliedert werden, kann dadurch die Einführung dieser Arbeitsweise erleichtert werden.

Builds grün halten

Sie ziehen den maximalen Nutzen aus Ihrem CI/CD-Workflow, wenn Ihr Codebestand ständig in einem releasefähigen Zustand ist. Dieser Ansatz erhöht die Effizienz, da Fehler sofort nach dem Auftreten behoben werden, und wenn im Produktionseinsatz etwas schiefläuft, können Sie innerhalb kürzester Zeit eine Korrektur vornehmen.

Testautomatisierungen und Pipeline-Phasen bieten ein unmittelbares Feedback darüber, ob Ihr Code releasefähig ist, und bei dieser Best Practice geht es darum, wie Sie auf die identifizierten Probleme reagieren.

Probleme gemeinschaftlich lösen

Das Team sollte kollektiv die Verantwortung für Builds übernehmen und bei Fehlern schnelle Korrekturen priorisieren. Anstatt die Schuld bei der Person zu suchen, die zuletzt Änderungen vorgenommen hat, sollten Probleme gemeinsam gelöst und eine konstruktive Kultur gefördert werden, die den CI/CD-Workflow optimiert und kontinuierliche Verbesserungen insbesondere in Drucksituationen unterstützt.

Triviale Fehler vermeiden

Um das Risiko zu verringern, dass Builds aufgrund von einfachen Problemen wie Syntaxfehlern oder fehlenden Abhängigkeiten fehlschlagen, sollten Teammitglieder lokale Builds erstellen und erste Tests ausführen, bevor sie ihre Änderungen einpflegen. Dabei sollte im Idealfall jeder dieselben Skripte wie das CI/CD-System verwenden, um Doppelarbeit zu vermeiden.

Nur einen Build erstellen

Ein häufiger Fehler ist die Erstellung eines neuen Builds in jeder Phase Ihrer CI/CD-Pipeline. Wenn für verschiedene Umgebungen jeweils ein neuer Build erstellt wird, können sich Inkonsistenzen einschleichen, und so kann man sich nie sicher sein, dass alle vorherigen Tests bestanden wurden.

Stattdessen sollten Sie ein einziges Build-Artefakt durch jede Phase der Pipeline schleusen, um es schließlich für die Produktion freizugeben.

Systemunabhängige Builds pflegen

Achten Sie darauf, Ihre Builds systemunabhängig zu halten, indem Sie Variablen, Authentifizierungsparameter, Konfigurationsdateien oder Skripte über das Deployment-Skript aufrufen, anstatt sie in den Build selbst zu integrieren.

Build-Artefakte zentral versionieren und speichern

Behandeln Sie Build-Artefakte als Produkte Ihres Quellcodes. Versionieren und speichern Sie sie statt in Ihrer Versionsverwaltung in einem zentralen Artefakt-Repository wie Nexus.

Deployment automatisieren

Nutzen Sie Ihren CI-Server, um die Bereitstellung desselben Build-Artefakts an jede Testumgebung zu automatisieren. In dem Maße, wie das Artefakt die einzelnen Phasen erfolgreich durchläuft, wächst auch das Vertrauen Ihres Teams in seine Zuverlässigkeit.

Tests optimieren

Auch wenn CI/CD in hohem Maße auf automatisierte Tests setzt, um die Softwarequalität zu gewährleisten, bedeutet das nicht, dass Sie jede Eventualität testen sollten.

Es ist wichtig, eine Balance zwischen Test-Coverage und Performance zu erreichen. Wenn es zu lange dauert, bis Ihre Tests Ergebnisse liefern, besteht die Gefahr, dass nach Gründen und Wegen gesucht wird, um den Prozess zu umgehen oder abzukürzen.

Mehrere Test-Coverage-Schichten verwenden

Bauen Sie Ihre automatisierte Test-Coverage schichtweise auf, beginnend mit Unit-Tests, die von Integrations- oder Komponententests gefolgt werden.

Schnelles Feedback priorisieren

Führen Sie schnell durchlaufende Tests zuerst durch, um so früh wie möglich Feedback zu erhalten. Normalerweise werden Unit-Tests am schnellsten ausgeführt.

Parallelisierung von Tests erwägen

Überlegen Sie, ob Ihre Tests in Stapel aufgeteilt und parallel ausgeführt werden können, um noch schneller Ergebnisse zu erhalten.

Länger laufende Tests für spätere Phasen aufheben

Führen Sie längere Tests erst dann durch, wenn die schnelleren Tests bestanden sind und Sie bereits ein gewisses Vertrauen in den Build haben.

Abhängigkeit von manueller Qualitätssicherung begrenzen

In Anbetracht des Zeit- und Arbeitsaufwands, der für eine manuelle Qualitätssicherung benötigt wird, sollte diese Phase in Grenzen gehalten werden, bis alle automatisierten Tests erfolgreich abgeschlossen sind.

Auf allgemeinere Tests konzentrieren

Verwenden Sie keine länger laufenden Tests, um alle Eventualitäten zu prüfen. Priorisieren Sie eine breitere Coverage mit Tests auf der Detailebene und konzentrieren Sie High-Level-Tests auf spezifische Risikobereiche, die für Ihr Produkt und Ihre Benutzergemeinde relevant sind.

Umgebungen bereinigen

Bei einer längeren Ausführung von Vorproduktionsumgebungen kann es zu Abweichungen der Einstellungen von der ursprünglichen Installation und untereinander kommen. Diese Konfigurationsabweichungen können zu inkonsistenten Testergebnissen führen und Ihren CI/CD-Prozess torpedieren.

Das Zurücksetzen Ihrer Test- und Staging-Umgebungen zwischen jedem Pipeline-Lauf ist eine Best Practice, in die es sich zu investieren lohnt.

Container oder virtuelle Maschinen verwenden

Hosten Sie Ihre Testumgebungen in Containern oder virtuellen Systemen, um sie schnell zurücksetzen zu können.

Auf Infrastruktur als Code setzen

Lassen Sie das Erstellen und Herunterfahren von Umgebungen skriptgesteuert ablaufen. Sie können diese Schritte dann über Ihren CI/CD-Server automatisieren.

Skalierbarkeit berücksichtigen

Die skriptbasierte Erstellung von Umgebungen erleichtert die Skalierung Ihres CI/CD-Prozesses und die gleichzeitige Ausführung mehrerer Pipelines.

Statische Umgebungen vermeiden

Wenn Sie sich für statische Umgebungen entscheiden, müssen Sie jede einzelne pflegen, um Konfigurationsabweichungen zu vermeiden. Dies kann die Qualitätssicherung verlangsamen und Releases verzögern.

Ihre Pipeline sichern

Da Ihre CI/CD-Pipeline Zugriff auf Ihren Code und die Zugangsdaten für die Bereitstellung in die Produktion hat, ist sie ein ideales Ziel für Angriffe. Daher ist es unerlässlich, bewährte Sicherheitstechniken in Ihrem CI/CD-Prozess anzuwenden.

  • Zugriff auf die Versionsverwaltung: Sichern Sie den Zugang zu Ihren VCS-Repositories und machen Sie eine Mehrfaktor-Authentifizierung verpflichtend für alle Mitwirkenden. Wenn Sie Dritten erlauben, Änderungen beizusteuern, sollten Sie einen Prozess zur Überprüfung der Änderungen einrichten, bevor durch sie ein Buildvorgang ausgelöst werden kann.
  • Zugangsdaten-Management: Für den Zugriff auf Services und Umgebungen in der CI/CD-Pipeline werden oft Zugangsdaten und API-Schlüssel benötigt. Speichern Sie Zugangsdaten niemals im Quellcode. Verwenden Sie stattdessen einen speziellen Geheimwert-Speicher und stellen Sie sicher, dass Zugangsdaten nicht in Protokolle oder Build-Artefakte gelangen.
  • Abhängigkeitsprüfungen: Im Rahmen Ihrer CI-Prüfungen sollten Sie Abhängigkeiten von Drittanbietern auf bekannte Schwachstellen überprüfen.
  • Sichere Kommunikation: Sorgen Sie dafür, dass die Kommunikation zwischen Ihrem CI-Server und Ihren Build-Systemen gesichert ist, und halten Sie alle Systeme auf dem aktuellen Stand, indem Sie die neuesten Patches installieren.
  • Prinzip der Rechteminimierung: Befolgen Sie in Ihrer gesamten Pipeline das Prinzip der Rechteminimierung. Dies erschwert Island-Hopping-Angriffe, wenn ein Account kompromittiert wurde.
  • Änderungsmanagement: Unterziehen Sie Ihre Pipeline-Konfiguration einem Änderungsmanagement, damit alle Änderungen vor der Anwendung überprüft werden.

Den Prozess respektieren

Wenn Sie erst einmal in Ihre CI/CD-Strategie investiert und eine zuverlässige Pipeline aufgebaut haben, die Ihnen Vertrauen in Ihre Releases gibt, sollten Sie diese Bemühungen nicht untergraben, indem Sie einzelnen Personen erlauben, den Prozess zu umgehen.

Bei kleineren oder dringenden Änderungen kommt oft der Wunsch auf, den CI/CD-Prozess zu umgehen. Es ist jedoch aus mehreren Gründen wichtig, diesem Drang nicht nachzugeben:

  • Das Überspringen von automatisierten Qualitätssicherungsstufen kann zu Fehlern führen, die sonst abgefangen worden wären.
  • Probleme sind in der Produktion schwieriger zu reproduzieren und zu debuggen, wenn kein Build zum Testen verfügbar ist.
  • Die Diagnose und Behebung von Problemen in „dringenden“ Releases kann länger dauern als der normale automatisierte Prozess.

Wenn jemand darum bittet, den Prozess zu umgehen, nehmen Sie sich einen Moment Zeit, um die Vorteile einer CI/CD-Pipeline zu erklären. Dabei kann auch die Frage gestellt werden, ob Teile Ihres bestehenden Prozesses verbessert werden können.

Pipeline-Daten überwachen

Zur Einrichtung der Pipeline gehört auch die Überwachung der Produktionsumgebung (also des Produkts).

Die beste Vorgehensweise ist die Einrichtung einer analogen Form der Überwachung für die CI/CD-Pipeline selbst.

CI/CD-Statistiken analysieren

Verwenden Sie die von Ihrem CI/CD-Tool erfassten Daten, um potenzielle Probleme und Verbesserungsmöglichkeiten zu identifizieren.

Häufigkeit der Builds überwachen

Vergleichen Sie die Anzahl der ausgelösten Builds pro Woche, Tag oder Stunde, um die Nutzungsmuster Ihrer Pipeline-Infrastruktur zu verstehen. Durch diese Überwachung können Sie Spitzenzeiten ermitteln und einen Skalierungsbedarf erkennen.

Geschwindigkeit von Deployments erfassen

Verfolgen Sie die Geschwindigkeit von Deployments im Zeitverlauf, um Trends zu erkennen und zu beurteilen, ob Leistungsoptimierungen erforderlich sind.

Erkenntnisse aus automatisierten Tests gewinnen

Nutzen Sie Statistiken aus automatisierten Tests, um Bereiche zu identifizieren, die parallelisiert werden könnten.

QA-Ergebnisse überprüfen

Achten Sie auf routinemäßig ignorierte QA-Ergebnisse, um zu erkennen, an welchen Stellen Sie Ihre Test-Coverage vereinfachen könnten.

Das gesamte Team einbinden

Die Schaffung eines erfolgreichen CI/CD-Workflows setzt nicht nur Prozesse und Tools, sondern auch eine entsprechende Team- und Organisationskultur voraus.

Continuous Integration, Continuous Delivery und Continuous Deployment sind zentrale DevOps-Methoden. Sie zielen darauf ab, die traditionellen Silos zwischen Entwicklung, Qualitätssicherung und Operations aufzubrechen und die Zusammenarbeit zwischen den Disziplinen zu fördern. Die Anwendung dieser Best Practices für DevOps bietet mehrere Vorteile.

Mehr Überblick und Zusammenarbeit

Die Teammitglieder erhalten einen vollständigen Überblick über den gesamten Arbeitsablauf und können bei der Zusammenarbeit von Kompetenzen in unterschiedlichen Fachgebieten profitieren.

Geteilte Verantwortung

Die gemeinsame Verantwortung für die Wartung der Pipeline verhindert, dass eine einzelne Person zum „Single Point of Failure“ wird.

Mitbestimmung und Mitwirkung

Durch die gemeinsame Verantwortung für die Softwarebereitstellung können alle Teammitglieder ihren Beitrag leisten, sei es durch die Korrektur von Buildfehlern, die Automatisierung von Aufgaben oder die Verbesserung von Prozessen.

Vertrauenskultur fördern

Eine Kultur des Vertrauens, in der Teammitglieder experimentieren und Ideen austauschen können, kommt Ihrem Unternehmen zugute und ermöglicht die Auslieferung von besseren Softwareanwendungen.

Wenn etwas schiefgeht, können Sie daraus lernen und Ihre CI/CD-Workflows robuster und effektiver gestalten.

Warum sind Best Practices für CI/CD wichtig?

Durch das Befolgen von Best Practices für Continuous Integration, Delivery und Deployment profitieren Sie von zahlreichen Vorteilen.

Schnellere Auslieferung

Die Automatisierung von Build-, Test- und Deployment-Aufgaben beschleunigt den Releaseprozess und ermöglicht eine schnellere Bereitstellung von Softwareupdates. Ein automatisierter CI/CD-Workflow ist unerlässlich, um die Markteinführungszeiten zu verkürzen und Funktionen schneller bereitzustellen.

Regelmäßiges Feedback

Durch eine häufigere Bereitstellung von Änderungen können Sie regelmäßig Feedback von Ihren Benutzer*innen einholen. Anhand der so gewonnenen Erkenntnisse können Sie Ihre Pläne optimieren und Ihre Strategien anpassen.

Verbesserte Codequalität

Automatisierte Qualitätssicherungsprozesse erkennen Fehler früher im Entwicklungszyklus, was eine schnellere Lösungsfindung ermöglicht und zu hochwertigerem Code und leistungsstärkeren Softwareanwendungen führt.

Erhöhte Benutzerzufriedenheit

Automatisierte Prüfungen stellen sicher, dass jede Änderung konsequent geprüft wird. Dies minimiert das Risiko, dass Fehler in die Produktion gelangen. Das Ergebnis: eine reibungslosere Benutzererfahrung und seltenere Ausfälle.

Mehr Zeit für Kreativität

Durch die Automatisierung der monotonen Schritte beim Kompilieren, Testen und Bereitstellen Ihrer Software gewinnen Sie Zeit, die Ihre Teammitglieder kreativen Aufgaben widmen können, zum Beispiel der Entwicklung neuer Funktionen, der Erstellung innovativer Designs oder der Verbesserung Ihrer allgemeinen DevOps-Verfahren.

Eine CI/CD-Deploymentstrategie implementieren

Die Implementierung von Continuous Integration, Continuous Delivery und/oder Continuous Deployment kann eine abschreckende Aufgabe sein. Eine erfolgreiche CI/CD-Strategie umfasst mehrere Schlüsselelemente und erfordert den sukzessiven Aufbau einer starken DevOps-Kultur.

Klare Ziele setzen

Wie bei Software-Entwicklungsprojekten ist es auch hier wichtig, Ziele zu definieren und Ihrem Team zu kommunizieren.

Ganz gleich, ob Sie einen wöchentlichen Release-Rhythmus mit Continuous Delivery für eine Vorproduktionsumgebung benötigen oder Continuous Deployment mit schnellen Benutzer-Updates anstreben – die Festlegung klarer Ziele ist unerlässlich.

Überschaubare Arbeitsblöcke definieren

Sobald Sie ein Ziel festgelegt haben, teilen Sie die Schritte, die zu diesem Ziel führen, in überschaubare Abschnitte auf. Durch eine inkrementelle Implementierung Ihrer Pipeline können Sie die Vorteile von CI/CD von Anfang an nutzen.

Mit CI beginnen

Continuous Integration ist der Einstiegspunkt für die meisten Teams. CI umfasst Aufgaben wie Versionsverwaltung, Branching-Strategien, Hinzufügen oder Erweitern von automatisierten Coverage-Prüfungen und eine beginnende Automatisierung von Builds und Tests. Durch den Einsatz eines CI-Servers können Sie diese Aktivitäten koordinieren, die Ergebnisse zusammenführen und eine Logik implementieren, mit der sich aufeinander folgende Build- und Testphasen automatisieren lassen.

In Richtung CD weiterentwickeln

Sobald Sie einen automatisierten CI-Workflow eingerichtet haben, können Sie zu Continuous Delivery oder Deployment übergehen.

Eine automatisierte Erstellung von Umgebungen spart Ihnen langfristig Zeit und macht Ihre Pipeline zuverlässiger und robuster. Sie können diese Umgebungen dann verwenden, um noch mehr automatisierte und manuelle Tests durchzuführen.

Daten analysieren

Sowohl während als auch nach der Einführung einer CI/CD-Strategie lohnt es sich, die Daten Ihrer CI/CD-Tools zu analysieren und gemeinsam mit Ihrem Team Möglichkeiten zur Optimierung Ihres Prozesses zu erkunden. Dieser iterative Ansatz gewährleistet kontinuierliche Verbesserungen und maximiert die Vorteile von CI/CD für Ihr Team und Ihre Organisation.

Zusammenfassung

Durch die folgenden DevOps-Best-Practices können Sie das Optimum aus Continuous Integration, Delivery und Deployment herausholen:

  • Führen Sie häufige Commits Ihrer Änderungen durch. Dadurch können Änderungen leichter integriert werden und Sie erhalten durch automatisierte Builds und Tests regelmäßig Feedback zu Ihrer Arbeit.
  • Legen Sie Wert auf grüne Builds. Wenn Ihr Codebestand stets im releasefähigen Zustand ist, erhöht dies die Codequalität und stellt sicher, dass Sie dringende Probleme im Produktionseinsatz lösen können.
  • Erstellen Sie nur einen Build. Wenn Sie ein und dasselbe Build-Artefakt durch aufeinanderfolgende Umgebungen schleusen, können Sie sicher sein, dass der Code jede Testphase bestanden hat.
  • Optimieren Sie Ihre automatisierten Tests. Selbst automatisierte Tests sind mit Zeitaufwand verbunden. Beginnen Sie mit den Tests, die am schnellsten Ergebnisse liefern.
  • Setzen Sie die Umgebungen nach jedem Pipeline-Lauf zurück. Dadurch vermeiden Sie Konfigurationsabweichungen und stellen sicher, dass auf die Ergebnisse der einzelnen CI/CD-Phasen Verlass ist.
  • Sichern Sie Ihre Pipeline. Aufgrund des Zugriffs auf Ihren Quellcode und Ihre Produktionsumgebung können CI/CD-Pipelines ein lohnendes Ziel für Hacker sein, sodass Sie die CI/CD-Sicherheit unbedingt gewährleisten müssen.
  • Respektieren Sie den Prozess. Wenn eine Änderung trivial oder dringend ist, mag es verlockend erscheinen, Ihre CI/CD-Pipeline zu umgehen, aber auf lange Sicht handeln Sie sich dadurch oft Nachteile ein.
  • Überwachen Sie Ihre Pipeline-Daten. Durch die Analyse der Daten Ihrer Pipeline können Sie diese robuster und effizienter gestalten.
  • Binden Sie Ihr gesamtes Team ein. Die Pipeline am Laufen zu halten sollte niemals die Aufgabe einer einzelnen Person sein. Die Verinnerlichung der DevOps-Mentalität bietet eine Reihe von Vorteilen.

So kann TeamCity helfen

TeamCity ist eine CI/CD-Automatisierungsplattform, mit der Sie Ihre CI/CD-Pipelines aufbauen und skalieren können. Der Einstieg in TeamCity ist leicht, unabhängig davon, wo Sie derzeit in Bezug auf Build- und Test-Automatisierung stehen.

Umfassende Integrationen für alle führenden Versionsverwaltungen, Unterstützung für gängige Build- und Testframeworks und eine intuitive webbasierte Bedienoberfläche sorgen dafür, dass Sie Ihre erste Pipeline in wenigen Minuten erstellen können. Dank einer vollständigen Unterstützung von Konfiguration als Code können Sie alle Pipeline-Definitionen in der Bedienoberfläche erstellen und in Ihrer Versionsverwaltung speichern.

Das hochgradig skalierbare und performante Design von TeamCity garantiert schnelles Feedback bei automatisierten Tests, während eine Integration in die wichtigsten IDEs und Messaging-Plattformen dafür sorgt, dass Sie durch Benachrichtigungen stets auf dem aktuellen Stand gehalten werden, egal wo Sie gerade arbeiten. Umfassende Sicherheitsfunktionen schützen Ihren Quellcode und Ihre Pipelines vor Angriffen.

Und als Teil des Reifungsprozesses können Sie Ihre CI/CD-Abläufe durch die in TeamCity integrierten Test-Coverage-Berichte, die Identifizierung unzuverlässiger Tests und die Statistiken über den Einsatz von Build-Agents weiter optimieren.