Blog

CI/CD und IaC

Welche Chance bieten sich und was sind die Herausforderungen?

von Thomas Somogyi

Consultant

29. August 2022

Die Integration, das Delivery und Deployment von Code gehören heute zum State-of-the-Art, beinhalten aber verschiedenste, auch nicht-technische Herausforderung, welche es zu meistern gilt.

In diesem Blogbeitrag stellen wir Continuous Integration, Continuous Delivery sowie Continuous Deployment (CI/CD) vor und zeigen auf, welchen Mehrwert mit dessen Einsatz gewonnen wird. Weiter wird im Beitrag erläutert, welche Rolle CI/CD im Infrastructure as Code (IaC)- Ansatz spielt und welche Deployment-Varianten On-Prem und in der Cloud existieren.

Einleitung – Konzept CI/CD

Nur selten verlief in der Zeit vor CI/CD die Integration von Änderungen an einem digitalen Produkt reibungslos. Die ganzheitliche Betrachtung und Prüfung aller Abhängigkeiten zwischen neuem und bestehendem Code gestalteten sich schwierig und oftmals waren aufwändige Nachbesserungen des Codes notwendig, bevor dieser letztendlich ins produktive System integriert werden konnte.

Mit den Prozessen, Techniken und Tools des Konzepts CI/CD wird eine Prämisse geschaffen, welche die kontinuierliche und sofortige Integration von neuem oder geändertem Code in die bestehende Lösung ermöglicht. Mittels CI/CD können Anwendungen kontinuierlich über ihren gesamten Lebenszyklus (Software Development Life Cycle, oder kurz: SDLC) von der Integrations-, über die Testphase, bis hin zur Auslieferung und Bereitstellung der Anwendung, automatisiert überwacht werden. Die im Rahmen von CI/CD eingesetzten Praktiken werden zusammenfassend als „CI/CD-Pipeline“ bezeichnet. Die Entwicklungs- und Betriebsteams, die nach dem DevOps-Ansatz arbeiten, werden damit unterstützt.

CI/CD im Einsatz von IaC

Der Einsatz einer CI/CD-Pipeline ist unter anderem auch im Infrastructure as Code (IaC)-Ansatz von zentraler Bedeutung. Im Rahmen von IaC werden, nebst der Automatisierungslogik, unterschiedliche Eigenschaften von hardware- und softwarebasierten Infrastrukturkomponenten aus der Cloud oder On-Prem in einem Repository abgelegt. Bei solchen, in Dateien abgespeicherten Eigenschaften muss es sich nicht um 1:1-Kopien aktueller Konfigurationen handeln. Oftmals werden parametrisierte Dateien, beispielsweise in der YAML-Notation, bevorzugt. Der grosse Vorteil liegt darin, dass die Informationen in den Konfigurationsdateien im Repository, trotz eines hohen Automatisierungsgrades, immer noch von einer Person gelesen (human-readable) und verstanden werden können. Ob human-readable oder nicht, in jedem Fall ist die CI/CD-Pipeline, die Voraussetzung für eine automatisierte, transparente und kontinuierliche Validierung von Konfigurationsdateien und der anschliessenden Integration von Änderungen in der Infrastruktur.

Continuous Integration (CI)

CI besteht aus dem automatisierten Prozess, welcher die kontinuierliche Integration von Anpassungen einer Anwendung sicherstellt. Continuous Integration unterstützt die Entwickler dabei regelmässig Änderungen am Code vorzunehmen und zu veröffentlichen. Mittels automatisierten Prüfprozessen wie Codeanalysen oder Unit-Tests (Codetests) wird sichergestellt, dass bearbeitete Branches im Code-Repository so zusammengeführt werden können, damit die Anwendung weiterhin funktioniert. Der Branch eines Repository gehört zum Entwicklungsprozess und kann als einen Zweig mit Verweis auf den bestehenden, validierten Code angesehen werden. Müssen Entwickler Änderungen am bestehenden Code vornehmen, wird zuerst ein neuer Branch erstellt, in welchem die Änderung oder Weiterentwicklung erfolgen. Anhand eines «Merges» werden anschliessend die finalen Anpassungen am Code mit dem bestehenden Code im Repository zusammengeführt.

Zusammengefasst enthält die erfolgreiche CI das automatisierte

  • Erstellen der angepassten Anwendung (Build)
  • sowie deren Testen (Test)
  • und das Zusammenführen des geänderten Codes in einem Code-Repository wie beispielsweise GitHub (Merge).

Sofern nicht anders konfiguriert, ist ein Merge erst dann erfolgreich, wenn alle definierten Prozesse (Jobs) innerhalb der «CI/CD-Pipeline» erfolgreich durchgelaufen sind.

Continuous Delivery (CD)

Der Abkürzung «CD» werden zwei Bedeutungen zugeschrieben. Einerseits Continuous Delivery, anderseits Continuous Deployment. Diese ähnlichen Konzepte werden oftmals synonym verwendet. Im Rahmen beider Konzepte werden die, auf CI nachfolgenden, automatisierten Prozesse in der Pipeline gestaltet. Teilweise wird anhand der Begriffe Continuous Delivery und Continuous Deployment die Ausprägung der Automatisierung konkretisiert. Was das heisst, wird in diesem Blog im Abschnitt Continuous Deployment erläutert. Ein, in die Pipeline integriertes CI ist die Voraussetzung für einen effizienten CD-Prozess. Das Continuous Delivery ermöglicht nach erfolgreicher Code-Validierung durch die CI die automatisierte Bereitstellung von Anwendungen in eine oder mehrere Umgebungen. Entwickler nutzen üblicherweise Umgebungen für die Build-, Test- und Deploy-Phase. Mögliche Prozesse (Jobs) aus den verschiedenen Phasen gibt es viele.

Zum Beispiel können dies

  • das Erstellen eines Builds der Anwendung,
  • das Verwalten und die Schemavalidierung von Umgebungsvariablen, die eine ganze Infrastruktur oder einzelne Komponente davon definieren,
  • das Testen und Zurücksetzen einer Umgebung oder spezifischer Komponenten davon, falls die Tests fehlschlagen
  • und viele weitere Aktivitäten sein.

Das erfolgreiche Durchlaufen aller Continuous Delivery-Phasen erlaubt dem Operation-Team die rasche und unkomplizierte Bereitstellung einer validierten Anwendung oder Infrastrukturkonfiguration für die Produktion.

Continuous Deployment (CD)

Das Continuous Deployment ist eine Erweiterung des Continuous Delivery. Continuous Deployment ermöglicht das Automatisieren der Freigaben von Anpassungen einer App oder auch von Infrastrukturkonfigurationsdateien. Continuous Deployment erlaubt folglich eine nahtlose und schnelle, teils in wenigen Minuten erfolgte Integration von Code-Anpassungen in ein produktives Umfeld. Möglich machen dies durchdachte und umfangreiche, automatische Tests innerhalb der verschiedenen Phasen in der CI/CD-Pipeline. Ein voll automatisiertes Deployment ist aber nicht immer sinnvoll. Können die automatischen Prüf- und Testelemente der Pipeline das Einhalten aller Richtlinien und somit die Gewährleistung der Governance aufgrund bestimmter Gegebenheiten nicht abdecken, so muss das Deployment manuell erfolgen. Zumindest bis die notwendige Prämisse geschaffen wurde. Dies kann anhand von Verbesserungen wie Standardisierung, dem Anpassen bestehender Prozesse (sofern möglich), dem Auflösen von externen Abhängigkeiten oder deren Berücksichtigung mittels Zugriffs über eine Schnittstelle, usw. ermöglicht werden.

CD/CD und IaC – Deployment-Varianten

In der Cloud wie auch On-Prem bieten sich verschiedene Use-Cases an, welche sich für CI/CD eignen. Beispielsweise können durch das DevOps-Team serverless oder mittels Container-Technology schnelle, automatisierte Code-Updates verteilt werden. Je nach Zielarchitektur und Umfang der Anpassung bieten sich verschieden Verteilungsansätze an. Die nachfolgende Auflistung enthält die drei bekanntesten, welche in der Cloud und On-Prem eingesetzt werden können.

CI/CD – Verteilungsansätze
Das Blue-Green Deployment sieht eine Entwicklung auf parallel dedizierten Infrastrukturen vor. In der Produktionsumgebung (blue) befindet sich die letzte, funktionierende Version von Anwendungen oder Anpassungen an der Infrastruktur. In der Staging-Ebene (green) werden die angepassten Anwendungen oder die durch angepasste Konfigurationsdateien veränderte Infrastruktur (IaC) umfänglich auf ihre Funktionen und Performance getestet. Dieser Deployment-Ansatz ermöglicht effizientes Implementieren von Änderungen, kann aber, je nach Komplexität der Produktionsumgebung, kostenintensiv sein.
Mittels Rolling Deployment werden Anpassungen inkrementell verteilt. Dies reduziert das Risiko von Ausfällen und ermöglicht bei Problemen einfache Rollbacks auf den zuvor funktionierenden Zustand. Folglich müssen als Voraussetzung für eine rollierende Verteilung, die Services mit der alten und neuen Version kompatibel sein. Je nachdem sind dies Anwendungsversionen oder im Fall von IaC Infrastrukturkonfigurationsdateien.
Das Side-by-Side Deployment ähnelt dem Blue-Green Deployment. Im Unterschied zu Blue-Green werden die Änderungen nicht über zwei Umgebungen verteilt, sondern direkt einer ausgewählten Benutzergruppe produktiv zur Verfügung gestellt. Sobald die Benutzergruppe, die in der CI/CD-Pipeline zuvor getesteten Funktionen und Performance bestätigt, können die Updates an alle übrigen Benutzer verteilt werden. Dies ermöglicht den Entwicklern, gleich wie beim Rolling-Deployment, den Parallelbetrieb verschiedener Versionen und zusätzlich das Einholen von echten Benutzer-Feedbacks, ohne hohes Risiko von Ausfallzeiten.

Eine Empfehlung der Deployment-Variante ist situativ und hängt vom zu verteilenden Produkt und von der Infrastruktur ab.

Nachfolgend beschreiben wir einen exemplarischen Auszug von Lösungen für CI/CD und IaC-Vorhaben:

TerraformProjekt von HashiCorp, welches sehr flexibel einsetzbar und kompatibel mit bekannten Cloud-Anbietern wie AWS, Azure, GCP und OpenStack ist.
AnsibleProjekt von Red Hat, das als Orchestrierungs- und Konfigurationstool das Automatisieren von repetitiven und komplexen Prozessen mittels Playbooks ermöglicht.
AWS CloudFormationIaC Service, welcher das Verwalten, Skalieren und Automatisieren von AWS-Ressourcen mittels Templates innerhalb der AWS-Umgebung ermöglicht.
Azure Resource ManagerIaC Tool der Azure Umgebung, welches unter anderem das Deployment sowie Verwalten von Azure Ressourcen mittels ARM Templates ermöglicht.
Google Cloud Deployment ManagerInfrastruktur Deployment Service von Google, welcher das Erstellen, Provisionieren und Konfigurieren von GCP Ressourcen mittels Templates und Code ermöglicht.
ChefBekanntes IaC Tool, das aufgrund seiner flexiblen Einsatzmöglichkeit und dem Bereitstellen einer eigenen API zusammen mit Terraform in AWS, Azure und GCP eingesetzt werden kann.
PuppetÄhnliches Tool wie Chef, welches auch häufig für das Überwachen definierter und provisionierter IaC-Eigenschaften und zur automatischen Korrektur von Abweichungen zum Soll-Zustand eingesetzt wird.
VagrantWeitere Lösung von HashiCorp, welches ein schnelles Erstellen von Entwicklungsumgebungen ermöglicht und für kleinere Umgebungen mit einer geringen Anzahl VMs ausgerichtet ist.

Im hybriden Cloudumfeld reichen die hauseigenen CI/CD- und IaC-Lösungen der Cloud-Plattformen wie AWS, GCP und Azure in der Regel nicht aus. Beispielsweise können Terraform und Ansible aufgrund ihrer hohen Flexibilität und Kompatibilität vor allem in Multicloud-Umgebungen eine passende Lösung für IaC sein.

Multicloud Header

Blog

Multicloud

Erfahren Sie in unserem Blogbeitrag über Multicloud, was es sonst noch so hinsichtlich Multicloud-Szenarien zu beachten gilt.

Implementation – Chance und Herausforderungen

Anhand der Implementation von CI/CD kann von diversen Chancen profitiert werden. Die wichtigsten Chancen sind in der nachfolgenden Auflistung exemplarisch zusammengefasst:

Chancen
Kürzere Einführungszeiten in die Produktion und schnelles Feedback – Anhand des automatisierten Testens und der Validierung in der CI/CD-Pipeline entfallen mühsame, manuelle und somit zeitaufwändige Schritte.
Robustere Releases & frühere Erkennung von Fehlern (Bugs) – Ausgiebiges Testen von Code und Funktionen. Einfache Fehler werden vermieden.
Hohe Visibilität (Transparenz) – Mittels CI/CD-Pipeline können einzelne Testergebnisse im Detail geprüft werden. Werden Mängel oder Fehler in neuem Code entdeckt, so wird dies transparent aufgezeigt.
Kostenreduktion – Reduzierung der Kosten anhand Reduktion simpler Fehler. Langfristig gesehen ist die Nutzung von CI/CD aufgrund der Automatisierung weniger fehleranfällig und somit nachhaltig günstiger.
Höhere Kundenzufriedenheit – Der konsistente und zuverlässige Entwicklungsprozess resultiert in zuverlässigeren Releases, Updates und Fehlerbehebungen. Dies steigert die Kundenzufriedenheit.

Für die Implementation und den Betrieb von CI/CD müssen aber auch diverse Herausforderungen gemeistert werden. Eine der grössten und wichtigsten ist die Standardisierung in der eigenen Infrastruktur. Sie bestimmt die Ausprägung des Automatisierungsgrads zu einem grossen Teil. Im Allgemeinen kann davon ausgegangen werden, dass eine homogene Infrastruktur prinzipiell einen hohen und kosteneffizienten Automatisierungsgrad ermöglicht. Heterogene Umgebungen sollten weitgehendst standardisiert werden, sofern eine hohe Automatisierung das Ziel ist. Dabei gilt es zu beachten, dass das Einführen oder lediglich Erhöhen der Standardisierung bereits für sich, ein grösseres Vorhaben sein kann. Weitere Herausforderungen, die es zu meistern gilt, sind:

Herausforderungen
Anpassungen in der Unternehmenskultur – CI/CD wird im Rahmen agiler Unternehmenskulturen und Vorgehensweisen, speziell DevOps, genutzt und gelebt. Folglich müssen die Teams sich in der iterativen, agilen Arbeitsweise wohl fühlen und mit ihr vertraut sein.
Fachwissen – Eine korrekte Implementierung von CI/CD setzt viel Fachwissen und Erfahrung voraus. Nicht nur im technischen, sondern auch im organisatorischen Bereich.
Reactive Resource Management – Um die Performance über alle automatischen Prozesse von CI/CD auch bei erhöhter Beanspruchung zu gewährleisten, sollte das Ressourcenmanagement überwacht und reaktionsfähig sein.
Initiale Entwicklungskosten – Die initialen Aufwände für eine Entwicklungsumgebung, den Knowhow-Aufbau, die Konzeptionierung, Standardisierung und Prozessanpassung können zwar hoch ausfallen, sind aber durch den gewonnenen Mehrwehrt von CI/CD gerechtfertigt.
Microservice Environment – Um eine hohe Skalierbarkeit zu gewährleisten, wird idealerweise eine Microservice-Architektur aufgebaut. Die Architekturverantwortlichen müssen sich der einhergehenden Zunahme der Komplexität und Abhängigkeiten und der Anforderung für deren Administration bewusst sein.

Unsere Einschätzung

Der Aufbau und das Design von CI/CD hängt vom Setup in der eigenen Entwicklungs- und Infrastrukturumgebung ab. Unserer Einschätzung nach existiert kein fertiges Konzept für die CI/CD-Pipeline. Welche Tests und Validierungen in der Continuous Integration, welche Phasen im Continuous Delivery implementiert und wie die Verteilung im Rahmen von CD erfolgt, muss trotz diverser Best Practice-Ansätze individuell eruiert und konzeptioniert werden. Zumindest zu Beginn wird das notwendige Knowhow in den verschiedenen Fachgebieten wie der Softwareentwicklung, der Quality-Assurance und speziell im IaC-Ansatz, auch das vorhandene Fachwissen in den verschieden Infrastrukturbereichen oftmals vernachlässigt.

Der IaC-Ansatz bietet eine visionäre, bereits in der Praxis erprobte Lösung an, welche es ermöglicht Infrastruktur und dessen Services On-Prem wie auch in der Cloud adaptiv, leicht wartbar und sicher zu gestalten. CI/CD bildet dabei ein Kernelement, welches die korrekte und transparente Abbildung der Konfigurationen aus einem zentralen Repository auf Infrastrukturkomponenten ermöglicht. Wie in diesem Blogbeitrag erläutert, lohnt sich der Einsatz von CI/CD. Die kostengünstigen und kurzen Einführungszeiten von Änderungen in die Produktion, robustere Releases und die dadurch erhöhte Kundenzufriedenheit sind nur einige von vielen Chancen, welche CI/CD bietet. Damit diese Chancen genutzt werden können, muss die Implementierung wie auch der Betrieb von CI/CD erfolgreich bewältigt werden. Es gilt Herausforderung wie eine hohe Standardisierung in der IT-Landschaft, mögliche Anpassung in eine agile Organisationsform wie auch die Beschaffung des Fachwissens zu meistern.

Gerne unterstützen wir Sie bei der Analyse, wo Sie hinsichtlich Anforderungen für den Einsatz von CI/CD stehen (Standardisierungsgrad, Organisationsform, usw.) und bei der Evaluierung sowie Konzeption möglicher CI/CD-Lösungen in der Cloud.


Unsere langjährige Erfahrung in den essenziellen Disziplinen setzen wir gewinnbringend für Ihre individuelle Cloud Journey ein. Mit unserer Unterstützung meistern Sie die Hot-Topics wie; Network, Organization, Availability, Automation, CI/CD, IaC, Governance/Compliance, Security & Cost Management.