Eine Einführung in die kontinuierliche Integration, Bereitstellung und Bereitstellung

Einführung

Das Entwickeln und Freigeben von Software kann ein komplizierter Prozess sein, insbesondere wenn Anwendungen, Teams und die Bereitstellungsinfrastruktur selbst immer komplexer werden. Oft werden die Herausforderungen größer, wenn Projekte wachsen. Um Software schnell und konsistent zu entwickeln, zu testen und freizugeben, haben Entwickler und Organisationen drei verwandte, aber unterschiedliche Strategien entwickelt, um diese Prozesse zu verwalten und zu automatisieren.

Die kontinuierliche Integration konzentriert sich darauf, die Arbeit einzelner Entwickler mehrmals täglich in ein Haupt-Repository zu integrieren, um Integrationsfehler frühzeitig zu erkennen und die gemeinsame Entwicklung zu beschleunigen. Bei der kontinuierlichen Bereitstellung geht es darum, die Reibung beim Bereitstellungs- oder Freigabeprozess zu verringern und die zum Bereitstellen eines Builds erforderlichen Schritte zu automatisieren, damit der Code jederzeit sicher freigegeben werden kann. Die fortlaufende Bereitstellung geht noch einen Schritt weiter, indem sie bei jeder Codeänderung automatisch bereitgestellt wird.

In diesem Handbuch werden wir jede dieser Strategien erläutern, wie sie miteinander in Beziehung stehen und wie ihre Einbeziehung in Ihren Anwendungslebenszyklus Ihre Softwareentwicklungs- und -veröffentlichungspraktiken verändern kann. Weitere Informationen zu den Unterschieden zwischen verschiedenen Open-Source-CI / CD-Projekten finden Sie unter https://www.digitalocean.com/community/tutorials/ci-cd-tools-comparison-jenkins-gitlab-ci-buildbot -drone-and-concourse [CI / CD-Tool-Vergleich].

Was ist kontinuierliche Integration und warum ist sie hilfreich?

  • Continuous Integration * ist eine Methode, die Entwickler dazu ermutigt, ihren Code früh und häufig in einen Hauptzweig eines gemeinsam genutzten Repositorys zu integrieren. Anstatt einzelne Features zu erstellen und am Ende eines Entwicklungszyklus zu integrieren, wird Code von jedem Entwickler mehrmals täglich in das gemeinsam genutzte Repository integriert.

Die Idee ist, die Integrationskosten zu minimieren, indem dies frühzeitig in Betracht gezogen wird. Entwickler können Konflikte an den Grenzen zwischen neuem und vorhandenem Code frühzeitig erkennen, während Konflikte noch relativ einfach zu vereinbaren sind. Sobald der Konflikt gelöst ist, kann die Arbeit mit der Gewissheit fortgesetzt werden, dass der neue Code die Anforderungen der vorhandenen Codebasis erfüllt.

Die häufige Integration von Code allein bietet keine Garantie für die Qualität des neuen Codes oder der neuen Funktionalität. In vielen Organisationen ist die Integration kostspielig, da mithilfe manueller Prozesse sichergestellt wird, dass der Code den Standards entspricht, keine Fehler verursacht und vorhandene Funktionen nicht beeinträchtigt. Häufige Integration kann zu Reibungsverlusten führen, wenn der Automatisierungsgrad nicht mit den vorhandenen Maßnahmen zur Mengenqualitätssicherung übereinstimmt.

Um dieser Reibung im Integrationsprozess zu begegnen, setzt die kontinuierliche Integration in der Praxis auf robuste Testsuiten und ein automatisiertes System zur Durchführung dieser Tests. Wenn ein Entwickler Code in das Haupt-Repository einbindet, starten automatisierte Prozesse die Erstellung des neuen Codes. Anschließend werden Testsuiten für den neuen Build ausgeführt, um zu überprüfen, ob Integrationsprobleme aufgetreten sind. Wenn entweder die Build- oder die Testphase fehlschlägt, wird das Team benachrichtigt, damit es daran arbeiten kann, den Build zu reparieren.

Das Endziel der kontinuierlichen Integration ist es, die Integration zu einem einfachen, wiederholbaren Prozess zu machen, der Teil des täglichen Entwicklungsworkflows ist, um die Integrationskosten zu senken und frühzeitig auf Fehler zu reagieren. Es ist von grundlegender Bedeutung für den Erfolg der Strategie, darauf zu achten, dass das System robust, automatisiert und schnell ist, während gleichzeitig eine Teamkultur gepflegt wird, die eine häufige Iteration und Reaktionsfähigkeit bei der Erstellung von Problemen fördert.

Was ist eine kontinuierliche Lieferung und warum ist sie hilfreich?

  • Continuous Delivery * ist eine Erweiterung der kontinuierlichen Integration. Das Hauptaugenmerk liegt auf der Automatisierung des Software-Bereitstellungsprozesses, sodass Teams ihren Code jederzeit einfach und sicher in der Produktion bereitstellen können. Indem sichergestellt wird, dass die Codebasis immer einsatzbereit ist, wird das Freigeben von Software zu einem unauffälligen Ereignis ohne komplizierte Rituale. Die Teams können sich darauf verlassen, dass sie ohne komplexe Koordination oder spätes Testen jederzeit freigeben können. Wie bei der kontinuierlichen Integration ist die kontinuierliche Bereitstellung eine Praxis, die eine Mischung aus technischen und organisatorischen Verbesserungen erfordert, um effektiv zu sein.

Auf der Technologieseite ist die kontinuierliche Bereitstellung stark auf Bereitstellungs-Pipelines angewiesen, um die Test- und Bereitstellungsprozesse zu automatisieren. Eine * Bereitstellungs-Pipeline * ist ein automatisiertes System, das zunehmend strenge Testsuiten für einen Build in mehreren aufeinander folgenden Phasen ausführt. Dies setzt dort an, wo die kontinuierliche Integration aufhört. Daher ist ein zuverlässiger Aufbau der kontinuierlichen Integration eine Voraussetzung für die Implementierung der kontinuierlichen Bereitstellung.

In jeder Phase besteht der Build entweder die Tests nicht, wodurch das Team benachrichtigt wird, oder besteht die Tests, wodurch automatisch in die nächste Phase übergegangen wird. Während der Build die Pipeline durchläuft, wird der Build in späteren Phasen in Umgebungen bereitgestellt, die die Produktionsumgebung so genau wie möglich widerspiegeln. Auf diese Weise können Build, Bereitstellungsprozess und Umgebung gleichzeitig getestet werden. Die Pipeline endet mit einem Build, der jederzeit in einem einzigen Schritt für die Produktion bereitgestellt werden kann.

Die organisatorischen Aspekte der kontinuierlichen Bereitstellung fördern die Priorisierung der „Bereitstellbarkeit“ als Hauptanliegen. Dies wirkt sich auf die Art und Weise aus, in der Features in die restliche Codebasis integriert und eingebunden werden. Das Design des Codes muss so gestaltet werden, dass die Funktionen jederzeit sicher in der Produktion bereitgestellt werden können, auch wenn sie unvollständig sind. Ein Link: # Zusätzliche Terminologie [Anzahl der Techniken] wurde entwickelt, um in diesem Bereich zu helfen.

Die kontinuierliche Bereitstellung ist attraktiv, da sie die Schritte zwischen dem Einchecken von Code in das Repository und der Entscheidung, ob erprobte funktionale Builds für Ihre Produktionsinfrastruktur freigegeben werden sollen, automatisiert. Die Schritte, die dazu beitragen, die Qualität und Richtigkeit des Codes zu bestätigen, werden automatisiert. Die endgültige Entscheidung darüber, was freigegeben werden soll, bleibt jedoch der Organisation überlassen, um maximale Flexibilität zu gewährleisten.

Was ist Continuous Deployment und warum ist es hilfreich?

  • Continuous Deployment * ist eine Erweiterung der Continuous Delivery, mit der jeder Build, der den vollständigen Testzyklus durchläuft, automatisch bereitgestellt wird. Anstatt darauf zu warten, dass ein menschlicher Gatekeeper entscheidet, was und wann in der Produktion bereitgestellt werden soll, stellt ein kontinuierliches Bereitstellungssystem alles bereit, was die Bereitstellungspipeline erfolgreich durchlaufen hat. Beachten Sie, dass neuer Code zwar automatisch bereitgestellt wird, es jedoch Techniken gibt, um neue Funktionen zu einem späteren Zeitpunkt oder für eine Untergruppe von Benutzern zu aktivieren. Durch die automatische Bereitstellung werden Funktionen und Fehlerbehebungen schnell an Kunden weitergegeben, kleinere Änderungen mit begrenztem Umfang gefördert und Unklarheiten darüber vermieden, was derzeit für die Produktion bereitgestellt wird.

Dieser vollständig automatisierte Bereitstellungszyklus kann für Unternehmen Anlass zur Sorge sein, die Kontrolle über die Freigabe an ihr Automatisierungssystem abzugeben. Der durch automatisierte Bereitstellungen gebotene Kompromiss wird manchmal als zu gefährlich für die von ihnen bereitgestellte Auszahlung angesehen.

Andere Gruppen nutzen das Versprechen der automatischen Freigabe als Methode, um sicherzustellen, dass die Best Practices stets eingehalten werden, und um den Testprozess auf eine begrenzte Produktionsumgebung auszudehnen. Ohne eine abschließende manuelle Überprüfung vor der Bereitstellung eines Codeteils müssen Entwickler sicherstellen, dass ihr Code gut gestaltet ist und die Testsuiten auf dem neuesten Stand sind. Dies bringt die Entscheidung, was und wann an das Haupt-Repository übergeben werden soll und was und wann für die Produktion freigegeben werden soll, zu einem einzigen Punkt, der fest in den Händen des Entwicklungsteams liegt.

Durch die kontinuierliche Bereitstellung können Unternehmen auch von einem konsistenten frühen Feedback profitieren. Features können Benutzern sofort zur Verfügung gestellt werden, und Fehler oder nicht hilfreiche Implementierungen können frühzeitig erkannt werden, bevor das Team umfangreiche Anstrengungen in eine unproduktive Richtung unternimmt. Schnelles Feedback, dass eine Funktion nicht hilfreich ist, ermöglicht es dem Team, den Fokus zu verlagern, anstatt mehr Energie in einen Bereich mit minimaler Auswirkung zu leiten.

Schlüsselkonzepte und -praktiken für kontinuierliche Prozesse

Während die kontinuierliche Integration, Bereitstellung und Bereitstellung in ihrem Umfang unterschiedlich ist, gibt es einige Konzepte und Vorgehensweisen, die für den Erfolg eines jeden von grundlegender Bedeutung sind.

Kleine, iterative Änderungen

Eine der wichtigsten Methoden bei der kontinuierlichen Integration ist es, kleine Veränderungen zu fördern. Entwickler sollten üben, größere Arbeiten in kleine Stücke zu zerlegen und diese frühzeitig zu begehen. Spezielle Techniken wie das Verzweigen nach Abstraktion und Feature-Flags (siehe unten) helfen dabei, die Funktionalität des Hauptzweigs vor laufenden Codeänderungen zu schützen.

Kleine Änderungen minimieren die Möglichkeit und die Auswirkung von Integrationsproblemen. Durch die frühestmögliche Einbindung in den gemeinsamen Zweig und die kontinuierliche Weiterentwicklung werden die Integrationskosten gesenkt und die nicht zusammenhängende Arbeit regelmäßig synchronisiert.

Stammbasierte Entwicklung

Bei der stammbasierten Entwicklung wird in regelmäßigen Abständen im Hauptzweig des Repository gearbeitet oder wieder in das gemeinsam genutzte Repository integriert. Kurzlebige Feature-Zweige sind zulässig, sofern sie geringfügige Änderungen darstellen und so bald wie möglich wieder zusammengeführt werden.

Die Idee hinter der stammbasierten Entwicklung besteht darin, große Commits zu vermeiden, die gegen das oben diskutierte Konzept kleiner, iterativer Änderungen verstoßen. Der Code steht Peers frühzeitig zur Verfügung, damit Konflikte gelöst werden können, wenn ihr Umfang gering ist.

Freigaben werden vom Hauptzweig oder von einem speziell für diesen Zweck aus dem Trunk erstellten Freigabezweig durchgeführt. In den Veröffentlichungszweigen findet keine Entwicklung statt, um den Fokus auf den Hauptzweig als einzige Quelle der Wahrheit zu behalten.

Halten Sie die Bau- und Testphasen schnell

Jeder der Prozesse basiert auf automatisiertem Erstellen und Testen, um die Richtigkeit zu überprüfen. Da die Erstellungs- und Testschritte häufig ausgeführt werden müssen, müssen diese Prozesse unbedingt optimiert werden, um den Zeitaufwand für diese Schritte zu minimieren.

Erhöhte Build-Zeiten sollten als Hauptproblem behandelt werden, da die Auswirkungen durch die Tatsache, dass jedes Commit einen Build startet, noch verstärkt werden. Da kontinuierliche Prozesse die Entwickler dazu zwingen, sich täglich auf diese Aktivitäten einzulassen, lohnt es sich, die Reibung in diesen Bereichen zu verringern.

Wenn möglich, können verschiedene Abschnitte der Testsuite parallel ausgeführt werden, um den Build schneller durch die Pipeline zu bewegen. Es sollte auch darauf geachtet werden, dass der Anteil jedes Testtyps sinnvoll ist. Unit-Tests sind in der Regel sehr schnell und erfordern nur minimalen Wartungsaufwand. Im Gegensatz dazu sind automatisierte System- oder Abnahmetests häufig komplex und bruchanfällig. Um dies zu berücksichtigen, ist es oft eine gute Idee, sich stark auf Komponententests zu verlassen, eine angemessene Anzahl von Integrationstests durchzuführen und sich dann von der Anzahl späterer, komplexerer Tests abzuwenden.

Konsistenz in der gesamten Bereitstellungspipeline

Da eine Continuous Delivery- oder Bereitstellungsimplementierung die Freigabeberechtigung testen soll, ist es wichtig, die Konsistenz während jedes Schritts des Prozesses aufrechtzuerhalten - des Builds selbst, der Bereitstellungsumgebungen und des Bereitstellungsprozesses selbst:

  • * Code sollte einmal am Anfang der Pipeline erstellt werden *: Die resultierende Software sollte gespeichert werden und für spätere Prozesse zugänglich sein, ohne dass eine Neuerstellung erforderlich ist. Wenn Sie in jeder Phase genau dasselbe Artefakt verwenden, können Sie sicher sein, dass Sie keine Inkonsistenzen aufgrund unterschiedlicher Build-Tools verursachen.

  • * Bereitstellungsumgebungen sollten konsistent sein *: Ein Konfigurationsverwaltungssystem kann die verschiedenen Umgebungen steuern, und Umgebungsänderungen können über die Bereitstellungspipeline selbst vorgenommen werden, um Korrektheit und Konsistenz sicherzustellen. In jedem Testzyklus sollten saubere Bereitstellungsumgebungen bereitgestellt werden, um zu verhindern, dass ältere Bedingungen die Integrität der Tests beeinträchtigen. Die Staging-Umgebungen sollten so gut wie möglich mit der Produktionsumgebung übereinstimmen, um unbekannte Faktoren zu reduzieren, die beim Heraufstufen des Builds auftreten.

  • * Konsistente Prozesse sollten zum Bereitstellen des Builds in jeder Umgebung verwendet werden. *: Jede Bereitstellung sollte automatisiert sein und für jede Bereitstellung sollten dieselben zentralisierten Tools und Verfahren verwendet werden. Ad-hoc-Bereitstellungen sollten vermieden werden, anstatt sie nur mit den Pipeline-Tools bereitzustellen.

Bereitstellung und Freigabe entkoppeln

Die Trennung der Bereitstellung von Code von der Freigabe für Benutzer ist ein äußerst wichtiger Bestandteil der kontinuierlichen Bereitstellung. Code kann für die Produktion bereitgestellt werden, ohne ihn zunächst zu aktivieren oder für Benutzer zugänglich zu machen. Anschließend entscheidet die Organisation, wann neue Funktionen oder Features unabhängig von der Bereitstellung freigegeben werden sollen.

Dies gibt Organisationen ein hohes Maß an Flexibilität, indem Geschäftsentscheidungen von technischen Prozessen getrennt werden. Befindet sich der Code bereits auf den Servern, ist die Bereitstellung kein heikler Teil des Freigabeprozesses mehr, wodurch die Anzahl der Personen und der Arbeitsaufwand zum Zeitpunkt der Freigabe minimiert werden.

Es gibt eine Reihe von Techniken, mit denen Teams den für eine Funktion verantwortlichen Code bereitstellen können, ohne ihn freizugeben. Feature-Flags richten bedingte Logik ein, um zu prüfen, ob Code basierend auf dem Wert einer Umgebungsvariablen ausgeführt werden soll. Durch Verzweigung nach Abstraktion können Entwickler Implementierungen ersetzen, indem sie eine Abstraktionsschicht zwischen Ressourcenkonsumenten und -anbietern platzieren. Eine sorgfältige Planung, um diese Techniken zu integrieren, gibt Ihnen die Möglichkeit, diese beiden Prozesse zu entkoppeln.

Arten von Tests

Kontinuierliche Integration, Bereitstellung und Bereitstellung basieren in hohem Maße auf automatisierten Tests, um die Wirksamkeit und Richtigkeit jeder Codeänderung zu bestimmen. Während dieser Prozesse sind verschiedene Arten von Tests erforderlich, um Vertrauen in eine bestimmte Lösung zu gewinnen.

Während die folgenden Kategorien in keiner Weise eine erschöpfende Liste darstellen und bei der genauen Definition der einzelnen Typen Meinungsverschiedenheiten bestehen, bieten diese umfassenden Kategorien von Tests eine Vielzahl von Möglichkeiten zur Bewertung von Code in verschiedenen Kontexten.

Rauchprüfung

Bei Rauchprüfungen handelt es sich um eine spezielle Art von Erstprüfungen, mit denen eine grundlegende Funktionalität sowie einige grundlegende Implementierungs- und Umgebungsbedingungen sichergestellt werden sollen. Rauchtests werden im Allgemeinen zu Beginn eines jeden Testzyklus als Plausibilitätsprüfung durchgeführt, bevor eine vollständigere Testsuite ausgeführt wird.

Die Idee hinter dieser Art von Test ist, zu helfen, große rote Fahnen in einer Implementierung zu erkennen und auf Probleme aufmerksam zu machen, die darauf hindeuten könnten, dass weitere Tests entweder nicht möglich oder nicht sinnvoll sind. Rauchtests sind nicht sehr umfangreich, sollten aber extrem schnell sein. Wenn eine Änderung einen Rauchtest nicht besteht, ist dies ein frühes Signal dafür, dass wichtige Behauptungen gebrochen wurden und dass Sie keine Zeit mehr für Tests aufwenden sollten, bis das Problem behoben ist.

Zu Beginn jeder neuen Phasenprüfung können kontextspezifische Rauchprüfungen durchgeführt werden, um sicherzustellen, dass die Grundannahmen und -anforderungen erfüllt sind. Beispielsweise können Rauchtests sowohl vor dem Integrationstest als auch vor der Bereitstellung auf Staging-Servern verwendet werden. Die zu testenden Bedingungen sind jedoch von Fall zu Fall unterschiedlich.

Unit Testing

Unit-Tests sind dafür verantwortlich, einzelne Code-Elemente isoliert und zielgerichtet zu testen. Die Funktionalität einzelner Funktionen und Klassen wird eigenständig getestet. Alle externen Abhängigkeiten werden durch Stub- oder Mock-Implementierungen ersetzt, um den Test vollständig auf den fraglichen Code zu konzentrieren.

Unit-Tests sind unerlässlich, um die Korrektheit einzelner Codekomponenten auf interne Konsistenz und Korrektheit zu prüfen, bevor sie in komplexere Kontexte gestellt werden. Der begrenzte Umfang der Tests und die Beseitigung von Abhängigkeiten erleichtern die Fehlersuche. Es ist auch die beste Zeit, um eine Vielzahl von Eingaben und Code-Zweigen zu testen, die später möglicherweise nur schwer zu erreichen sind. Häufig sind Unit-Tests nach Rauchprüfungen die ersten Tests, die ausgeführt werden, wenn Änderungen vorgenommen werden.

Unit-Tests werden in der Regel von einzelnen Entwicklern auf ihrem eigenen Arbeitsplatz ausgeführt, bevor Änderungen übermittelt werden. Continuous Integration Server führen diese Tests jedoch fast immer wieder aus Sicherheitsgründen durch, bevor sie mit den Integrationstests beginnen.

Integrationstests

Nach Unit-Tests werden Integrationstests durchgeführt, indem Komponenten zusammengefasst und als Baugruppe getestet werden. Während Komponententests die Funktionalität von Code für sich validieren, stellen Integrationstests sicher, dass Komponenten bei der Kommunikation miteinander zusammenarbeiten. Diese Art des Testens bietet die Möglichkeit, eine völlig andere Klasse von Fehlern zu finden, die durch die Interaktion zwischen Komponenten aufgedeckt werden.

In der Regel werden Integrationstests automatisch ausgeführt, wenn Code in ein freigegebenes Repository eingecheckt wird. Ein Continuous Integration Server checkt den Code aus, führt alle erforderlichen Build-Schritte aus (normalerweise wird ein schneller Rauch-Test durchgeführt, um sicherzustellen, dass der Build erfolgreich war) und führt dann Unit- und Integrationstests aus. Module werden in verschiedenen Kombinationen miteinander verbunden und getestet.

Integrationstests sind wichtig für die gemeinsame Arbeit, da sie die Gesundheit des Projekts schützen. Änderungen müssen nachweisen, dass sie die vorhandene Funktionalität nicht beeinträchtigen und wie erwartet mit anderem Code interagieren. Ein sekundäres Ziel von Integrationstests besteht darin, zu überprüfen, ob die Änderungen in einer sauberen Umgebung implementiert werden können. Dies ist häufig der erste Testzyklus, der auf den eigenen Maschinen des Entwicklers durchgeführt wird, sodass während dieses Vorgangs auch unbekannte Software- und Umgebungsabhängigkeiten entdeckt werden können. Dies ist normalerweise auch das erste Mal, dass neuer Code mit echten externen Bibliotheken, Diensten und Daten getestet wird.

Systemprüfung

Sobald die Integrationstests durchgeführt wurden, kann mit einer weiteren Teststufe, dem Systemtest, begonnen werden. Systemtests sind in vielerlei Hinsicht eine Erweiterung des Integrationstests. Der Schwerpunkt der Systemtests liegt auf der Sicherstellung, dass Komponentengruppen als zusammenhängendes Ganzes korrekt funktionieren.

Anstatt sich auf die Schnittstellen zwischen Komponenten zu konzentrieren, bewerten Systemtests in der Regel die Funktionalität einer vollständigen Software. Diese Tests ignorieren die Bestandteile, um die zusammengesetzte Software als eine einheitliche Einheit zu bewerten. Aufgrund dieser Unterscheidung konzentrieren sich Systemtests normalerweise auf benutzer- oder extern zugängliche Schnittstellen.

Abnahmeprüfung

Abnahmetests sind eine der letzten Testarten, die vor der Auslieferung mit Software durchgeführt werden. Anhand von Abnahmetests wird festgestellt, ob eine Software alle Anforderungen aus Sicht des Unternehmens oder des Benutzers erfüllt. Diese Tests werden manchmal anhand der ursprünglichen Spezifikation erstellt und testen häufig Schnittstellen auf die erwartete Funktionalität und Benutzerfreundlichkeit.

Akzeptanztests sind oft eine aufwändigere Phase, die sich über die Veröffentlichung der Software hinaus erstrecken kann. Durch automatisierte Abnahmetests kann sichergestellt werden, dass die technologischen Anforderungen des Entwurfs erfüllt wurden. In der Regel spielt jedoch auch die manuelle Überprüfung eine Rolle.

Häufig beginnt der Abnahmetest mit der Bereitstellung des Builds in einer Staging-Umgebung, die das Produktionssystem widerspiegelt. Von hier aus können die automatisierten Testsuiten ausgeführt werden und interne Benutzer können auf das System zugreifen, um zu überprüfen, ob es so funktioniert, wie sie es benötigen. Nach der Freigabe oder dem Anbieten eines Betazugriffs für Kunden werden weitere Akzeptanztests durchgeführt, indem bewertet wird, wie die Software bei der tatsächlichen Verwendung funktioniert, und indem Feedback von Benutzern eingeholt wird.

Zusätzliche Terminologie

Während wir oben einige der allgemeineren Ideen besprochen haben, gibt es viele verwandte Konzepte, auf die Sie stoßen können, wenn Sie Informationen zur kontinuierlichen Integration, Bereitstellung und Bereitstellung erhalten. Definieren wir einige andere Begriffe, die Sie wahrscheinlich sehen werden:

  • * Blaugrüne Bereitstellungen *: Blaugrüne Bereitstellungen sind eine Strategie zum Testen von Code in einer produktionsähnlichen Umgebung und zum Bereitstellen von Code mit minimalen Ausfallzeiten. Es werden zwei Gruppen produktionsfähiger Umgebungen verwaltet, und Code wird für die inaktive Gruppe bereitgestellt, in der Tests durchgeführt werden können. Sobald die Freigabe abgeschlossen ist, wird der Produktionsdatenverkehr mit dem neuen Code an die Server weitergeleitet, sodass die Änderungen sofort verfügbar sind.

  • * Verzweigung nach Abstraktion *: Verzweigung nach Abstraktion ist eine Methode zur Durchführung umfangreicher Refactoring-Vorgänge in einem aktiven Projekt ohne langlebige Entwicklungszweige im Quellcode-Repository, von denen kontinuierliche Integrationspraktiken abgeraten werden. Eine Abstraktionsschicht wird zwischen Verbrauchern und der vorhandenen Implementierung erstellt und bereitgestellt, sodass die neue Implementierung parallel hinter der Abstraktion erstellt werden kann.

  • * Build (noun) *: Ein Build ist eine bestimmte Version von Software, die aus dem Quellcode erstellt wurde. Je nach Sprache kann dies kompilierter Code oder ein konsistenter Satz von interpretiertem Code sein.

  • * Canary Releases *: Canary Releases sind eine Strategie zum Freigeben von Änderungen an eine begrenzte Teilmenge von Benutzern. Die Idee ist, sicherzustellen, dass bei Produktions-Workloads alles korrekt funktioniert, und die Auswirkungen bei Problemen zu minimieren.

  • * Dark Launch *: Beim Dark Launch wird Code für die Produktion bereitgestellt, der zwar Produktionsdatenverkehr empfängt, die Benutzererfahrung jedoch nicht beeinträchtigt. Neue Änderungen werden zusammen mit vorhandenen Implementierungen bereitgestellt, und häufig wird derselbe Datenverkehr zu Testzwecken an beide Stellen weitergeleitet. Die alte Implementierung ist immer noch mit der Benutzeroberfläche verbunden, aber hinter den Kulissen kann der neue Code anhand realer Benutzeranforderungen in der Produktionsumgebung auf Richtigkeit überprüft werden.

  • * Bereitstellungs-Pipeline *: Eine Bereitstellungs-Pipeline besteht aus einer Reihe von Komponenten, die Software durch immer strengere Test- und Bereitstellungsszenarien führen, um ihre Bereitstellungsbereitschaft zu bewerten. Die Pipeline endet normalerweise mit einer automatischen Bereitstellung in der Produktion oder mit der Option, dies manuell zu tun.

  • * Feature Flags * oder * Feature Toggles *: Feature Flags sind eine Technik zum Bereitstellen neuer Features hinter bedingter Logik, die basierend auf dem Wert einer Umgebungsvariablen festlegt, ob sie ausgeführt werden sollen oder nicht. Neuer Code kann ohne Aktivierung in der Produktion bereitgestellt werden, indem das Flag entsprechend gesetzt wird. Um die Software freizugeben, wird der Wert der Umgebungsvariablen geändert, wodurch der neue Codepfad aktiviert wird. Feature-Flags enthalten häufig Logik, die es Teilmengen von Benutzern ermöglicht, auf das neue Feature zuzugreifen. Auf diese Weise wird ein Mechanismus erstellt, mit dem der neue Code schrittweise bereitgestellt wird.

  • * Promoten *: Im Kontext kontinuierlicher Prozesse bedeutet Promoten, dass eine Software, die erstellt wurde, in die nächste Testphase überführt wird.

  • * Soak-Test *: Beim Soak-Test wird Software über einen längeren Zeitraum unter erheblicher Produktions- oder produktionsähnlicher Last getestet.

Fazit

In diesem Handbuch haben wir die kontinuierliche Integration, die kontinuierliche Bereitstellung und die kontinuierliche Bereitstellung vorgestellt und erläutert, wie sie verwendet werden können, um gut getestete Software sicher und schnell zu erstellen und zu veröffentlichen. Diese Prozesse nutzen eine weitgehende Automatisierung und fördern die ständige gemeinsame Nutzung von Code, um Fehler frühzeitig zu beheben. Während die Techniken, Prozesse und Tools, die zur Implementierung dieser Lösungen erforderlich sind, eine erhebliche Herausforderung darstellen, können die Vorteile eines gut konzipierten und ordnungsgemäß verwendeten Systems enorm sein.

In unserer https://www.digitalocean.com/community/tutorials/ci-cd-tools-comparison-jenkins-gitlab-ci-buildbot- finden Sie heraus, welche CI / CD-Lösung für Ihr Projekt geeignet sein könnte. drone-and-concourse [CI / CD-Tool-Vergleichshandbuch] für weitere Informationen.