CI/CD: Kontinuierliche Integration & Lieferung erklärt

CI/CD ermöglicht es den besten Technologieunternehmen, ihre Produkte mehrmals täglich zu verbessern. Hier erfahren Sie, was Sie wissen müssen, um das Gleiche zu erreichen.

ci/cd explained

Was ist CI/CD?

CI/CD ist eine Methode zur Softwareentwicklung, bei der Sie Updates jederzeit nachhaltig veröffentlichen können. Wenn Codeänderungen routinemäßig durchgeführt werden, sind die Entwicklungszyklen häufiger, bedeutungsvoller und schneller.

„CI/CD“ steht für die kombinierten Praktiken der kontinuierlichen Integration (CI) und kontinuierlichen Lieferung (CD).

Kontinuierliche Integration ist eine Voraussetzung für CI/CD und erfordert:

  • Entwickler müssen ihre Änderungen mehrmals täglich in den Hauptcode-Branch zusammenführen.
  • Jede Code-Zusammenführung löst eine automatisierte Code-Bau- und Testsequenz aus. Entwickler erhalten idealerweise Ergebnisse in weniger als 10 Minuten, damit sie sich auf ihre Arbeit konzentrieren können.

Die Aufgabe der kontinuierlichen Integration ist es, ein Artefakt zu erzeugen, das bereitgestellt werden kann. Die Rolle automatisierter Tests in CI besteht darin, sicherzustellen, dass das Artefakt für die jeweilige Version des Codes sicher bereitgestellt werden kann.

In der Praxis der kontinuierlichen Lieferung werden Codeänderungen ebenfalls kontinuierlich bereitgestellt, obwohl die Bereitstellungen manuell ausgelöst werden. Wenn der gesamte Prozess der Übertragung des Codes vom Quell-Repository in die Produktion vollständig automatisiert ist, wird dieser Prozess kontinuierliche Bereitstellung genannt.

Ein Prüfstein für CI/CD

Wenn jeder Entwickler in Ihrem Team jetzt sofort mit dem aufhören kann, was er gerade tut, und die aktuelle Entwicklungsversion des Codes in 20 Minuten oder weniger in die Produktion bringen kann, ohne dass jemand sich Sorgen darüber macht, was passieren könnte – herzlichen Glückwunsch, Sie betreiben erfolgreich CI/CD!

CI/CD-Prinzipien

Praktiken der kontinuierlichen Lieferung erweitern CI weiter, indem sie Prinzipien für erfolgreiche Produktionsbereitstellungen beschreiben:

  • Archivieren Sie das System so, dass es iterative Releases unterstützt. Vermeiden Sie enge Kopplung zwischen Komponenten. Implementieren Sie Metriken, die helfen, Probleme in Echtzeit zu erkennen.
  • Praktizieren Sie testgetriebene Entwicklung, um den Code immer in einem bereitstellbaren Zustand zu halten. Halten Sie ein umfassendes und gesundes automatisiertes Test-Framework aufrecht. Bauen Sie Monitoring, Logging und Fehlertoleranz von Anfang an ein.
  • Arbeiten Sie in kleinen Iterationen. Wenn Sie zum Beispiel in Feature-Branches entwickelen, sollten diese nicht länger als einen Tag bestehen bleiben. Wenn Sie mehr Zeit benötigen, um neue Funktionen zu entwickeln, verwenden Sie Feature-Flags.
  • Entwickler können den Code in produktionsähnliche Staging-Umgebungen schieben. Dies stellt sicher, dass die neue Version der Software funktioniert, wenn sie in die Hände der Benutzer gelangt.
  • Jeder kann jede Version der Software nach Bedarf in jede Umgebung bereitstellen, mit einem Knopfdruck. Wenn Sie ein Wiki zur Bereitstellung konsultieren müssen, ist es vorbei.
  • Wenn Sie es bauen, betreiben Sie es. Autonome Engineering-Teams sollten für die Qualität und Stabilität der Software, die sie bauen, verantwortlich sein. Dies bricht die Silos zwischen traditionellen Entwicklern und Betriebsteams auf, da sie zusammenarbeiten, um übergeordnete Ziele zu erreichen.

Um CI/CD Realität werden zu lassen, müssen Sie alles was Sie im Software-Lieferprozess automatisieren können automatisieren und es in einer CI/CD-Pipeline ausführen.

ci/cd process

Beispiel-CI/CD-Workflows

Hier ist ein einfaches Beispiel für eine vollständig automatisierte CI/CD (Continuous Deployment) Pipeline:

a simple ci/cd workflow example
CI/CD sollte nicht komplizierter sein als nötig

Jede Änderung am Master-Git-Branch führt auf Semaphore die folgenden Schritte aus:

  • Bauen Sie den Code und die Web-Ressourcen, wobei der Abhängigkeits-Cache wiederverwendet wird.
  • Führen Sie ein automatisiertes Test-Suite aus. Dies ist eine JavaScript/Node.js-Anwendung, daher sind die Tests mit Jest geschrieben.
  • Wenn die Tests bestehen, wird ein Deployment-Block ausgeführt, der den Produktionscode aktualisiert, der in der Cloud läuft.

CI/CD mit manuellen Schritten

Hier ist ein CI/CD-Workflow für Kubernetes, der mehr Schritte umfasst:

ci/cd workflow example with manual steps
Multi-stage CI/CD mit Docker und Kubernetes, mit manuellen Schritten, um strategisch in Staging- oder Produktionsumgebungen bereitzustellen (klicken, um die Vollgröße anzuzeigen)

In diesem Beispiel werden bei jeder Änderung automatisch die folgenden Schritte ausgeführt:

  • Die Anwendung aus Quellcode und Abhängigkeiten bauen.
  • Eine automatisierte Test-Suite ausführen.
  • Wenn die Tests bestehen, automatisch ein Docker-Container-Image erstellen und in ein privates Repository pushen.

Am Ende der Docker-Bau-Pipeline haben wir ein funktionsfähiges Artefakt, ein Container-Image. Der Entwickler oder formeller gesagt der Release-Manager kann entscheiden, manuell auszulösen:

  • Bereitstellung in Staging oder Produktion, die möglicherweise Smoke-Tests umfasst, um sicherzustellen, dass keine größeren Probleme eingeführt wurden.
  • Tagging des Container-Images als Artefakt, das in die Produktion eingeführt wurde, um Audits und Rollbacks zu ermöglichen.

Was sind die Vorteile von CI/CD?

CI/CD ist viel mehr als die Automatisierung von Aufgaben, um menschliche Fehler zu vermeiden. Es ermöglicht uns, neue Lösungen so schnell, effizient und kostengünstig wie möglich in die Hände der Benutzer zu bringen.

Wie Dave Farley, Mitautor des Buches „Continuous Delivery“ und Software-Engineering-Experte, in einem Podcast von Semaphore hervorhebt:

Softwareentwicklung ist immer ein Lern-, Entdeckungs- und Experimentierprozess. […] Wenn man das Buch „Accelerate“ und den „State of DevOps“-Bericht liest, zeigen die Zahlen, dass Organisationen, die kontinuierliche Lieferung praktizieren, qualitativ hochwertigere Software schneller produzieren. Die Personen, die daran arbeiten, haben mehr Freude daran, und die Organisationen, die es praktizieren, verdienen mehr Geld.

Dave Farley im Semaphore Uncut-Podcast

Wenn Ihr Unternehmen CI/CD praktiziert, wird es einen Wettbewerbsvorteil haben, der es Ihnen ermöglicht:

  • Software mit weniger Risiko zu liefern. CI/CD-Pipelines standardisieren die Release-Prozesse über Projekte hinweg. Durch das Testen jeder Änderung im Quellcode reduzieren wir die Wahrscheinlichkeit, Fehler einzuführen.
  • Neue Funktionen häufiger zu veröffentlichen. Eine CI/CD-Pipeline kann Ihren gesamten Weg vom Commit bis zur Produktion auf einem einzigen Bildschirm visualisieren. Sie können durch die Phasen navigieren, Ineffizienzen erkennen und Ihren Prozess optimieren. Durch das Entfernen von Produktivitätshemmnissen ermöglichen Sie Ihrem Unternehmen, erfolgreich zu sein.
  • Das Produkt zu liefern, das die Benutzer benötigen. Häufige Updates führen zu mehr Benutzerfeedback. Sie können dies nutzen, indem Sie Funktionen A/B testen oder frühe Versionen von Produkten mit echten Kunden testen. Auf diese Weise vermeiden Sie es, zu viel in Funktionen zu investieren, die Ihre Kunden nicht benötigen, und konzentrieren sich auf die, die wichtig sind.
  • Die Produktivität der Entwickler zu verbessern. Engineering-Teams, die kein CI/CD praktizieren, arbeiten oft unter Stress. Es gibt ständige Probleme mit schlechten Deployments und schwer zu behebenden Ausfällen. Entwickler schreiben viel Code, der nie verwendet wird. Lange Feature-Branches sind zu groß, um eine angemessene Peer-Überprüfung zu erhalten, sodass die Codequalität abnimmt. Im Gegensatz dazu führt CI/CD dazu, dass das Produktmanagement auf Benutzerwirkung optimiert. Entwickler deployen Code, während er frisch in ihren Köpfen ist. Das Ergebnis ist ein zufriedenes Engineering-Team.

Die Vorteile von CI/CD multiplizieren sich: schnelle Deploy-Zyklen führen zu weniger riskanten und häufigeren Updates, was zu schnellerem Lernen und mehr Benutzerfeedback führt, was wiederum zu zufriedenen Entwicklern führt, die bessere Produkte erstellen.

Wann ist CI/CD nicht umsetzbar?

Continuous Delivery ist großartig, funktioniert aber möglicherweise nicht bei meinem Projekt.“ Tatsächlich gibt es einige Fälle, in denen CD möglicherweise nicht geeignet ist:

  • Ihre Kunden möchten keine kontinuierlichen Updates für ihre Systeme.
  • Vorschriften schränken ein, wie Software aktualisiert werden kann. Beispielsweise ist es in der Luft- und Raumfahrt, der Telekommunikation und der Medizintechnik nicht möglich, Software kontinuierlich zu aktualisieren.

Selbst in einer Umgebung, die CD ablehnt, können Teams die Vorteile einfacher Bereitstellungen und das Halten des Systems in einem einsatzbereiten Zustand genießen. Sie können auch die Vorteile von CI vollständig nutzen.

Für einen detaillierteren Blick auf CI und seine Best Practices lesen Sie Semaphores Leitfaden zu Continuous Integration.

Ein typischer Weg zu CI/CD

Wenn Sie an lange Entwicklungszyklen gewöhnt sind, müssen Sie Ihre Denkweise ändern.

Aber wenn Sie darüber nachdenken, CI/CD zu übernehmen, haben Sie bereits einen wichtigen ersten Schritt gemacht!

Betrachten Sie alles, was CI/CD behindert, als technische Schulden, und behandeln Sie es auch so. Schätzen Sie den erforderlichen Arbeitsaufwand ein, setzen Sie klare Erwartungen mit allen Beteiligten und planen Sie Zeit ein, um daran zu arbeiten.

Es gibt zwei wesentliche Meilensteine auf Ihrem Weg zum CI/CD-Erfolg. Der erste ist die Implementierung von CI: schnelle, zuverlässige und häufige Integrationen. Der zweite ist die Implementierung von CD: Automatisierung des Deployments, um es mit einem Knopfdruck durchzuführen, und die Möglichkeit, neuen Code in produktionsähnlichen Umgebungen einfach zu testen.

Zu häufigeren Integrationen kommen

1/ Der erste Schritt ist, das Master-Branch so zu behandeln, als ob Sie es jederzeit bereitstellen könnten. Da Sie das vorher nicht getan haben, wird es schwer sein. Aber es ist der Beginn, etwas Schmerzhaftes oft zu tun, bis es nicht mehr schmerzhaft ist.

2/ Behandeln Sie jeden Testfehler als Bug. Das schließt auch Flaky Tests ein. Extrahieren Sie das Protokoll, untersuchen Sie es und beheben Sie es. Egal, wofür der Test war, Sie können das Problem nicht schließen, bis es behoben ist.

3/ Verbesseren Sie Ihre Testsuite. Möglicherweise müssen Sie einige Codes umschreiben, um Tests zuverlässiger zu machen. Lassen Sie alle Entwickler so sorgfältig Tests schreiben wie Produktionscode. Nach einer Weile werden Sie an einem Punkt angelangen, an dem ein fehlgeschlagener Test einen echten Bug bedeutet. Schließlich werden Sie 100% grüne CI-Bauten erreichen. Das ist Ihr erster Meilenstein. Feiern Sie ihn!

4/ Hören Sie auf, langlebige Feature-Branches zu verwenden, und beginnen Sie, durch Abstraktion mit Feature-Flags zu branchieren. Auf diese Weise pushen alle auf das Master-Branch, und es ist einfach, Funktionen in Entwicklung zusammen mit dem Rest des Systems zu testen. So können Sie Probleme sofort erkennen, anstatt sie Monate später nach dem Mergen zu entdecken.

5/ Optimieren Sie den Feedback-Loop. Untersuchen Sie langsame Tests und verbessern oder schreiben Sie sie um, um schneller zu sein. Investieren Sie in ein CI/CD-Tool, das Ihre CI-Pipeline in Phasen unterteilen und Tests parallel ausführen kann. Semaphore-Kunden berichten oft von drastischen Verbesserungen, wie einer Reduzierung der Build-Zeit von einer Stunde oder sogar zwei auf etwa zehn Minuten. Auf diese Weise testen Sie jeden Pull-Request vollständig, bevor er gemergt wird.

Die Entwicklung einer schnellen und umfassenden automatisierten Testsuite ist eine große Anfangsinvestition. Die Vorteile sind jedoch enorm. Tester und QA können nach Bugs suchen und viel nützlichere Prüfungen durchführen. Entwickler sind sich sicher, dass sie eine Änderung pushen können und CI unvorhergesehene Probleme auffängt. Dieses Vertrauen treibt die Entwicklungsgeschwindigkeit voran.

Häufigere Releases erreichen

6/ Der letzte Schritt besteht darin, das Deployment zu automatisieren.

Wenn Ihr Deployment-Prozess manuell ist, beginnen Sie damit, ihn als Reihe von Aufgaben zu dokumentieren. Automatisieren Sie eine nach der anderen jede Aufgabe mit einem Skript (Bash, Makefile) oder einem Konfigurationsmanagement-Tool wie Ansible, Chef oder Puppet. Sobald Sie fertig sind, fügen Sie alle Aufgaben in einer CI/CD-Pipeline zusammen. Sie können damit beginnen, die Übergänge in jeder Phase manuell auszulösen.

Die Details der Release-Automatisierung hängen stark von Ihrem Technologie-Stack ab. Die Implementierung bei der Verwendung von Python auf Docker wird sich von der Implementierung bei der Verwendung von VMs zum Ausführen von Java-Anwendungsservern unterscheiden.

7/ Wenn Sie in der Cloud deployen, können Sie die Erstellung von Infrastruktur automatisieren, indem Sie „Infrastructure as Code“-Tools wie AWS CloudFormation und Terraform verwenden. Wenn Sie On-Premises deployen, werden Sie wahrscheinlich nicht in der Lage sein, Produktionsumgebungen on-demand zu erstellen und zu löschen. Aber Sie können sie dennoch so einrichten, dass sie immer verfügbar sind.

Das Endergebnis ist, dass Ihr Team nach all diesem Aufwand beginnt, monatlich, dann wöchentlich und schließlich täglich Releases durchzuführen. Sie können agil im ursprünglichen Sinne des Begriffs sein und wertvolle Incremental-Updates liefern, selbst für Enterprise-Kunden.

Erfahren Sie mehr hier: Understanding the CI/CD Pipeline.

Mit CI/CD beginnen

Wenn Sie bereit sind, einen CI/CD-Prozess für Ihr Projekt einzurichten, melden Sie sich für ein kostenloses Semaphore-Konto an. Semaphore bietet autoskalierbare, CI/CD-Pipelines der Enterprise-Klasse als Dienst an.

Weitere Informationen zu den Funktionen von Semaphore finden Sie auf dieser Website.

Suchen Sie in der Dokumentation nach einem CI/CD-Tutorial für Ihre Programmiersprache und Ihren Technologie-Stack.

Star us on GitHub