Continuous Delivery (CD)
Was ist Continuous Delivery (CD)?
Continuous Delivery (CD), zu Deutsch kontinuierliche Auslieferung, ist ein Ansatz für die Softwareauslieferung, bei dem Entwicklungsteams Code in kurzen, aber kontinuierlichen Zyklen produzieren und testen, in der Regel mit einem hohen Grad an Automatisierung, um die Softwarequalität zu verbessern. Dieser Prozess ermöglicht es den Entwicklungsteams, Software schnell zu erstellen, zu testen und auszuliefern, indem sie mehr inkrementelle Aktualisierungen vornehmen, anstatt einen großen Teil der Zeit für eine komplette Überarbeitung eines bestimmten Produkts zu verwenden.
Continuous Delivery ist ein beliebter Ansatz für die Softwarelieferung, insbesondere für Teams, die DevOps praktizieren. Sie wird in der Regel mit Continuous Integration (CI) kombiniert, um eine Kette von Prozessen für die Softwareentwicklung, die Bereitstellung und Feedback-Schleifen zu bilden, die als CI/CD-Pipeline bezeichnet wird.
Bei der kontinuierlichen Auslieferung wird der Code regelmäßig an die Benutzerakzeptanztests oder an eine Staging-Umgebung geliefert. Der Code wird auf alle Aspekte der Funktionalität getestet, um unerwartete Leistungsprobleme in der Produktion zu vermeiden. Jede Komponente, die die automatisierten Tests besteht, ist ein gültiger Kandidat für die Freigabe. In dieser letzten Phase löst Continuous Delivery eine abschließende Prüfung durch einen Menschen und dann einen Push für die Bereitstellung aus. Alternativ kann der Build auch automatisch bereitgestellt werden, ein Schritt, der als Continuous Deployment bezeichnet wird.
Bei Continuous Delivery finden die Tests frühzeitig statt – ein Konzept, das manchmal als shift left bezeichnet wird. So können die Entwickler an Korrekturen arbeiten, bevor sie sich anderen Aspekten der Entwicklung zuwenden.
CI/CD-Pipeline
Es gibt nicht die eine Standard-Pipeline für Continuous Delivery. Der gemeinsame Nenner zwischen den typischen Pipelines ist die Konzentration auf Themen wie automatisierte Builds, Tests und stufenweise Bereitstellung in einem kontinuierlichen Prozess. Im Folgenden finden Sie die allgemeinen Phasen eines CI/CD-Prozesses:
- Source. Der erste Schritt in der Pipeline ist der, in dem die Entwickler die kleinsten verteilbaren Einheiten des Codes schreiben und übertragen. Der Code wird durch Überprüfungen, Unit-Tests und statische Analysen getestet. Tests für kleine Mengen von Code können effizienter sein als End-to-End-Tests.
- Build. Der Quellcode wird aus dem Repository gesammelt, mit Bibliotheken, Modulen und Abhängigkeiten verknüpft und in eine ausführbare Datei kompiliert. Tools protokollieren den Prozess und weisen auf zu behebende Fehler hin. Bei einigen Builds werden Skripte eingesetzt, um die ausführbare Datei in eine verpackte oder bereitstellbare Ausführungsumgebung zu übersetzen, zum Beispiel eine virtuelle Maschine (VM) oder einen Docker-Container.
- Testen. Zu diesem Zeitpunkt sollte der Code ausführbar sein. Er wird auf der Ebene der Subsysteme getestet, einschließlich Funktions-, Leistungs- und Sicherheitstests. Damit wird sichergestellt, dass der entwickelte Code den Qualitätsstandards eines Endbenutzers und den Spezifikationen des Projekts entspricht. Integrierte Subsysteme erfordern UI- und Netzwerktests und möglicherweise noch weitere Funktions-, Leistungs- und Sicherheitstests. Automatisieren Sie diese Tests wo immer möglich. In dieser Phase der Pipeline können die Anwendungskomponenten getrennt bleiben, um Microservices zu bilden, oder zusammen als ein komplettes System integriert werden.
- Deployment. Schließlich sollte die Software für die Bereitstellung in der Produktionsumgebung bereit sein, aber zunächst wird der Code ein letztes Mal manuell überprüft. Blue/Green Deployment ist eine gängige Methode zur Bereitstellung für Continuous Delivery, bei der zwei Umgebungen identisch konfiguriert werden – eine Umgebung dient den Endbenutzern, während die andere für die Bereitstellung neuen Codes und für Tests bereit ist, zum Beispiel für einen Lasttest, um die Leistung bei hoher Auslastung zu messen. Wenn der freigegebene Code bereit ist, wechseln die Umgebungen die Traffic-Quellen, und der neue Code steht den Benutzern zur Verfügung. Alle Probleme, die nach dem Wechsel entdeckt werden, werden zurück in die vorherige Umgebung geleitet, wo das Softwareteam das Problem behebt.
Durch die Verknüpfung von kontinuierlicher Integration und kontinuierlicher Auslieferung wird sichergestellt, dass der Code, an dem mehrere Entwickler an verschiedenen Standorten arbeiten, in ein einziges Repository integriert wird. Beachten Sie, dass dies kontinuierliche Tests erfordert, um mit den Arbeitsabläufen Schritt zu halten.
Was sind die Vorteile von Continuous Delivery?
Continuous Delivery bietet mehrere Vorteile gegenüber der traditionellen Anwendungsentwicklung und -bereitstellung, einschließlich dem Wasserfallmodell:
Vereinfachung. Ein Entwicklungsteam verbringt weniger Zeit mit der Vorbereitung einer Codebasis für die Freigabe und bündelt nicht mehrere einzelne Änderungen für eine große Freigabe. Stattdessen aktualisieren die Entwickler den Code kontinuierlich und geben ihn in kleinen Schritten frei.
Schnelleres Debugging. Kleine Veröffentlichungen decken Fehler im neuen Code schnell auf. Wenn beispielsweise ein Fehler in einem Code gefunden wird, der in der Produktionsumgebung eingesetzt wird, können die Entwickler den fehlerhaften Code auf eine der letzten inkrementellen Aktualisierungen zurückführen, das Problem beheben, den Code testen, ihn erneut einsetzen und neues Feedback erhalten.
Schnellere Entwicklungszyklen. Continuous Delivery ermöglicht schnellere Iterationen von Anwendungen, da viele Entwickler zu unterschiedlichen Zeiten zusammenarbeiten und Code erstellen können, ohne andere Projekte zu beeinträchtigen. Wenn ein iterativer Prozess aufgrund zunehmender Projektkomplexität unhandlich wird, bietet Continuous Delivery den Entwicklern eine Möglichkeit, zu kleineren, häufigeren Releases zurückzukehren, die zuverlässiger, vorhersehbarer und besser zu verwalten sind.
Continuous Delivery und DevOps
Continuous Delivery wird häufig im Rahmen des DevOps-Paradigmas verwendet. DevOps ist ein kollaborativer Ansatz für die Aufgaben, die von Anwendungsentwicklungs- und IT-Betriebsteams durchgeführt werden, oft mit dem Schwerpunkt auf Automatisierung. Die Ziele von DevOps und Continuous Delivery stimmen überein, um einen kontinuierlichen Arbeitsablauf zu ermöglichen. Einer der Hauptschwerpunkte bei Continuous Delivery ist das schnelle Erstellen, Testen und Freigeben von Software, was auch von DevOps angestrebt wird.
Große und kleine DevOps-Organisationen nutzen Continuous Delivery für Vorteile wie eine schnellere und qualitativ hochwertigere Softwareentwicklung, Release-Prozesse und Code-Commits. DevOps und Continuous Delivery können sich überschneidende Prozesse sein, und diese Prozesse in kürzeren Zyklen ablaufen zu lassen, macht dies möglich.
Continuous Integration und Continuous Delivery
Die kontinuierliche Auslieferung ist eine Erweiterung der kontinuierlichen Integration, einer Softwareentwicklungspraxis, bei der häufige, isolierte Änderungen sofort getestet und zu einer größeren Codebasis hinzugefügt werden. Während sich Continuous Integration mit dem Build und den ersten Codetests des Entwicklungszyklus für jede Version befasst, konzentriert sich Continuous Delivery auf das, was nach dem Build der Änderungen geschieht.
Continuous Integration ist eine Möglichkeit, die Kopien des Codes aller Entwickler regelmäßig in eine Codebasis einzubinden. Einzelne Änderungen werden mit Unit- und Integrationstests getestet und schnell integriert. Durch die kontinuierliche Integration erhält ein Entwicklungsteam gezieltes Feedback zu Änderungen oder Ergänzungen der Codebasis. Wenn ein Fehler eingeführt wird, sollten die Codetests in Continuous Integration ihn aufdecken, bevor der Code der Veröffentlichung näher kommt.
Bei Continuous Delivery ist jeder Commit, der die automatisierten Tests besteht, potenziell ein gültiger Kandidat für die Veröffentlichung. Continuous Integration und Continuous Delivery ermöglichen es einem Unternehmen, automatisierte Tests und Staging-Prozesse durchzuführen, die es den Entwicklern ermöglichen, zu entscheiden, wann und wie oft sie ihren Code in die Produktion überführen.
Es ist jedoch wichtig zu wissen, dass sich das CD in CI/CD auch auf einen anderen Begriff beziehen kann, der eng damit zusammenhängt: Continuous Deployment.
Continuous Delivery versus Continuous Deployment
Continuous Delivery und Continuous Deployment sind ähnliche Konzepte, die häufig miteinander verwechselt werden. Beide werden zusammen mit der kontinuierlichen Integration verwendet, weshalb auch der Begriff CI/CD verwirrend sein kann.
Der Hauptunterschied besteht darin, was während des Bereitstellungsprozesses geschieht. Bei Continuous Delivery durchläuft der Code automatisch mehrere Schritte, um ihn für die Produktionsbereitstellung vorzubereiten, aber er geht nicht automatisch live. Die Code-Änderungen müssen zunächst manuell genehmigt werden, und es ist wahrscheinlich, dass manuelle Tests und Qualitätssicherungsmaßnahmen erforderlich sind. Bei Continuous Deployment kann der Code automatisch getestet, geprüft und für die Produktionsumgebung freigegeben werden, wo er automatisch mit der Benutzernachfrage skaliert und auf Probleme überwacht wird, die einen Rollback erforderlich machen würden.
Continuous Delivery umfasst in der Regel auch einen produktionsähnlichen Staging-Bereich. Zwischen der Freigabe einer Softwareüberprüfung – bei der Änderungen manuell angenommen werden – und der Freigabe des neuen Codes für die Produktion kann es oft zu einer zeitlichen Verzögerung kommen.
Hier kommt der Vorteil des Continuous Deployments ins Spiel. Die Zeitverzögerung, die bei Continuous Delivery auftritt, wird eliminiert. Continuous Deployment erfordert auch keinen Staging-Bereich für Codeänderungen. Stattdessen werden automatisierte Tests schon früh in den Entwicklungsprozess integriert und während aller Phasen der Veröffentlichung fortgesetzt.
Sowohl Continuous Delivery als auch Continuous Deployment stützen sich auf Tools zur Infrastrukturbereitstellung in Echtzeit und zur Anwendungsüberwachung, um Probleme zu entdecken, die in den Feedback-Schleifen der Tests nicht erfasst werden.
Kontinuierliche Integration, Auslieferung und Bereitstellung werden zusammen als kontinuierliche Softwareentwicklung bezeichnet. Sie werden alle auch mit den Methoden von Agile und DevOps in Verbindung gebracht.
Tools für Continuous Delivery
Es gibt eine Fülle von Open-Source- und kommerziellen Tools, die für jede Phase der kontinuierlichen Auslieferung zur Verfügung stehen. Einige Tools bieten Funktionen, die sowohl Aspekte von CI als auch von CD abdecken.
Im Allgemeinen verwenden Softwareteams, die CI/CD praktizieren, verschiedene Tools:
- ein Versionskontrollsystem zur Verwaltung des Codes
- eine automatisierte Build-Engine
- Unit-, Funktions- und Integrationstestsysteme
- Performance-Tester für normale Last- und Stresstests
- Tools für das Konfigurationsmanagement
- ein Artefakt-Repository
Alle diese Tools lassen sich in eine kontinuierliche Pipeline integrieren, und einige bieten Funktionen, die in mehreren Schritten nützlich sind. Unternehmen verlassen sich auch auf die Überwachung in der Produktion und das Kapazitätsmanagement. Teams können sich auch auf Container für eine konsistente Softwarebereitstellung in verschiedenen Umgebungen verlassen – von der Entwicklung über den Test bis hin zur Produktion und integrierten Entwicklungsumgebungen –, um die Komplikationen beim Erstellen und Testen zu verringern.
Public-Cloud-Anbieter wie AWS und Microsoft Azure bieten ebenfalls integrierte Tools für die kontinuierliche Auslieferung an. Entwickler und IT-Mitarbeiter können diese Tools von der Codeentwicklung bis zur Bereitstellung und Produktion sowie zur Überwachung und Skalierung nutzen.
Tools, die einen Aspekt der kontinuierlichen Auslieferung (und in einigen Fällen auch andere CI/CD-Schritte) durchführen, sind unter anderem :