Eine Pipeline in der Cloud

Die Art und Weise, wie Software gehostet und bereitgestellt wird, hat sich durch die Verbreitung von Cloud Computing stark verändert. Für die meisten Dinge im Leben gibt es jetzt Online-Services – für das Einkaufen ebenso wie für die Computerinfrastruktur. In diesem Artikel wollen wir untersuchen, wie Continuous Integration, Continuous Delivery und Continuous Deployment von Cloud-Technologien profitieren können, insbesondere durch „Infrastruktur als Code“ und Container.

Ganz gleich, ob Sie Neuling auf dem Gebiet der CI/CD-Pipelines sind oder bereits über ein lokal gehostetes Setup verfügen: Es ist nützlich zu wissen, wie diese Techniken und Tools funktionieren, um sie leichter an Ihre Anforderungen anpassen zu können.

Infrastruktur als limitierender Faktor

Continuous Integration und Continuous Deployment verfolgen das Ziel, den Software-Releaseprozess schneller und robuster zu machen.

Durch die Kombination des Prinzips „wenig aber oft“ mit der Automatisierung von Builds, Umgebungserstellung und Tests wird die Zeit zwischen Entwicklung und Release verkürzt und gleichzeitig das Vertrauen in die Produktqualität gestärkt.

Die späteren Phasen eines CI/CD-Workflows enthalten in der Regel End-to-End-Tests, Performancetests sowie manuelle Tests, und diese setzen Testumgebungen voraus, die der Produktionsumgebung sehr nahe kommen. Für eine maximale Effizienz und Reproduzierbarkeit beim Testen sollten diese Umgebungen automatisch neu aufgesetzt statt manuell gewartet werden. Um all dies in die Praxis umzusetzen, sind nicht nur DevOps-Kenntnisse und -Tools erforderlich, sondern auch eine ganze Reihe von Infrastrukturelementen, die Rechenkapazitäten für CI-Server, Build-Agents, Testumgebungen und Datenspeicher bereitstellen.

Die Anzahl der Server, die Ihr Build-Prozess erfordert, hängt von der Größe und Komplexität Ihres Projekts und der Anzahl der Mitwirkenden ab. Diese Anzahl kann jedoch im Zeitverlauf variieren.

Wenn Sie die gesamte Infrastruktur Ihrer CI/CD-Pipeline selbst hosten und verwalten, müssen Sie einen Mittelweg finden zwischen dem gleichzeitigen Betrieb mehrerer Jobs in Spitzenzeiten und den Kosten für den Kauf und die Wartung von Systemen, die die meiste Zeit brachliegen. In dieser Hinsicht kann eine Cloud-Infrastruktur erhebliche Vorteile bieten.

Was bietet die Cloud für Ihre Continuous-Integration-Pipeline?

Durch die Verbreitung von Infrastrukturen, die in der Cloud gehostet werden, hat sich die Infrastrukturverwaltung grundlegend verändert.

Durch Infrastructure-as-a-Service (IaaS) werden Computerressourcen über virtuelle Maschinen (VMs) oder Container bereitgestellt. Auf Anfrage (und gegen Entgelt) stehen jederzeit weitere Kapazitäten zur Verfügung – ohne sich um Beschaffung, Installation, Management oder physische Hardware kümmern zu müssen.

Auf diese Weise hat ein Unternehmen keinen Einblick in die physischen Server, auf denen diese VMs oder Container gehostet werden (abgesehen von Informationen zur geografischen Region für Compliance- und Recovery-Zwecke), und dies hat zu einem grundlegenden Umdenken geführt.

Infrastruktur als Code

Durch die enormen physischen Ressourcen, die beim Cloud-Hosting einem Service zugrunde liegen, gelten Server als austauschbare Standardgüter, als „Vieh“ (im Englischen „cattle“). Dies steht im Gegensatz zum traditionellen Bare-Metal-Hosting, bei dem jeder Server seinen eigenen Namen bekam und wie ein Haustier gehätschelt wurde, um ein möglichst langes Leben zu erreichen.

Beim „Vieh“-Ansatz werden bei Aktualisierungs- oder Reparaturbedarf die Server einfach entfernt und durch einen neuen ersetzt, der den Anforderungen entspricht. Es wird keine Zeit oder Mühe aufgewendet, um eine vorhandene Instanz zu modifizieren oder zu reparieren. Stattdessen wird das Image nach Bedarf neu konfiguriert und eine neue Instanz bereitgestellt.

Bei IaaS wird nur nach verwendeten Rechenressourcen abgerechnet, die „Vieh“-Mentalität ist daher verständlich. Hier kommt das Konzept „Infrastruktur als Code“ (IaC) ins Spiel. IaC ist eine DevOps-Methode, bei der die Bereitstellung von Infrastruktur durch Skripte reproduzierbar wird.

Wenn wir alle Konfigurationsdetails als Code in der Quellcodeverwaltung speichern (wie den Anwendungscode selbst), vermeiden wir manuelle Anpassungen an einzelnen Umgebungen, die zu Inkonsistenzen führen.

Genau wie die entwickelte Software kann auch die Infrastruktur über eine CI/CD-Pipeline geleitet werden, um sicherzustellen, dass sie wie erwartet funktioniert. Der Vorteil ist, dass Änderungen problemlos rückgängig gemacht werden können.

Die Verwandlung der Infrastruktur in Code eröffnet neue Automatisierungsmöglichkeiten. Umgebungen können bei Bedarf automatisch erstellt und durch Anlegen einer neuen Konfiguration aktualisiert werden.

Die praktisch unbegrenzte Verfügbarkeit der durch den IaaS-Anbieter bereitgestellten Rechenressourcen ermöglicht eine bedarfsgerechte Skalierung in beiden Richtungen. Gleichzeitig ist sichergestellt, dass Instanzen bei einem Ausfall sofort ersetzt werden können. Dadurch kann unser CI/CD-Setup auf Nachfragespitzen reagieren und einen zuverlässigen Service gewährleisten.

Hardware-Outsourcing

Bei IaaS und CaaS gehört die Wartung der physischen Hardware – einschließlich der Verwaltung der Netzwerk- und Speicherkapazitäten – ebenso wie die Rechenzentrumslogistik zum Serviceangebot des Cloud-Anbieters.

So kann sich Ihr Team darauf konzentrieren, die Pipeline-Prozesse zu optimieren und abzusichern. Da die Kosten eine Funktion von Prozessorleistung und Zeit sind, lohnt sich der Aufwand für eine möglichst weitgehende Parallelisierung der Aufgaben. So erhält das Entwicklerteam schneller Ergebnisse, als wenn über einen längeren Zeitraum weniger Maschinen verwendet werden.

Container

Container entsprechen den IaC-Prinzipien und ermöglichen eine noch effektivere Nutzung der Cloud-gehosteten Infrastruktur. Ein Container enthält ein Softwarepaket mit allen zur Ausführung benötigten Abhängigkeiten. Der Satz „Auf meinem Computer funktioniert es doch“ und die verzweifelte Suche nach kleinsten Konfigurationsunterschieden sind damit Vergangenheit. Eine der bekanntesten Containertechnologien ist Docker, aber auch andere Optionen sind verfügbar.

Wie bei virtuellen Maschinen können in Containern mehrere Anwendungen auf demselben physischen Server ausgeführt werden, wobei sie voneinander isoliert bleiben. Im Gegensatz zu VMs enthalten Container jedoch kein Betriebssystem. Dadurch sind sie schlanker und nehmen nicht einen festen Teil der Hostressourcen in Beschlag. Folglich können auf einem einzelnen Computer weit mehr Container als VMs ausgeführt werden, und somit eignen sich Container ideal für die effiziente Software-Bereitstellung in einer Cloud-Infrastruktur.

Bei Verwendung von Containern werden die Umgebungsabhängigkeiten und Konfigurationsdetails zusammen mit der Software in einem einzigen Artefakt verpackt. Dieses kann auf jedem Computer bereitgestellt werden, der über eine Laufzeitumgebung für den Container verfügt.

Anwendungen können auf mehrere Container aufgeteilt werden – dies ist zum Beispiel bei einer Microservice-Architektur der Fall. Die Container müssen dann auf demselben Computer oder einem vernetzten Cluster bereitgestellt werden. Container-Orchestrierungstools wie Kubernetes vereinfachen die Arbeit mit einer großen Anzahl von Containern, indem Aufgaben wie Bereitstellung, Verwaltung und Skalierung automatisiert werden.

Der Einsatz von Containern in einem CI/CD-Workflow bedeutet eine erhebliche Vereinfachung bei der Bereitstellung des neuesten Builds für die verschiedenen Phasen der Pipeline. Das Build-Artefakt ist ein Container-Image, das unverändert in jeder Testumgebung bereitgestellt werden kann, bevor es für die Produktion freigegeben wird.

In CI/CD-Cloud-Pipeline sorgen Container für eine effiziente Auslastung der Rechenressourcen und ermöglichen die Verwendung von Automatisierungstools. Bei Lastspitzen können Sie die Kapazitäten erhöhen, und wenn der Bedarf nachlässt, können Sie Kosten sparen, indem Sie Container entsorgen und die zugrunde liegende Infrastruktur freigeben.

Neben IaaS bieten jetzt mehrere Cloud-Anbieter auch Container-as-a-Service (CaaS) an. Dadurch können Unternehmen Container direkt bereitstellen, ohne eine Orchestrierungsplattform zu verwalten und Cluster zu konfigurieren.

Überlegungen zum Cloud-CI-Hosting

Eine CI/CD-Pipeline in der Cloud bietet zwar erhebliche Vorteile hinsichtlich Infrastrukturkosten, Skalierbarkeit und Zuverlässigkeit, es sind jedoch auch einige Nachteile zu berücksichtigen.

Erfahrung und Fachwissen

Der Einsatz von Cloud-Diensten wie IaaS und CaaS ist zwangsläufig mit einer Lernkurve verbunden. Wenn Sie noch keine Kompetenzen in diesen Bereichen aufgebaut haben, werden Ihre Teammitglieder etwas Zeit für die Einarbeitung brauchen, oder Sie müssen versuchen, dieses Wissen extern zu beschaffen. Erfahrungen bei der Arbeit mit Cloud-Technologien sind jedoch gesuchte Qualifikationen, und wenn Sie Ihren Teams die Möglichkeit geben, diese Fähigkeiten zu entwickeln und mit den neuesten Technologien zu arbeiten, kann dies für die Mitarbeiterbindung und -gewinnung von Vorteil sein.

Systemarchitektur

Wenn Sie Ihre Software für die Cloud entwickeln und dabei Microservices, Container und andere native Cloud-Methoden einsetzen, ist das automatisierte Durchlaufen der CI/CD-Pipeline in der Cloud mithilfe von Containern relativ einfach. Wenn Sie hingegen eine monolithische Architektur einsetzen, kann das Verpacken Ihrer Software in Container mit Herausforderungen verbunden sein.

Natürlich sind Container keine Voraussetzung für eine Cloud-gehostete Pipeline. Sie können weiterhin virtuelle Maschinen in der Infrastruktur Ihres Cloud-Anbieters verwenden, um Builds auszuführen und konsistente Vorproduktionsumgebungen zum Testen bereitzustellen. VMs verbrauchen jedoch mehr Ressourcen als Container, und Sie müssen die Umgebungen separat konfigurieren.

Kosten

Die Maxime „Zeit ist Geld“ gilt auch in der Cloud, und Sie möchten sicherlich nicht für Rechenressourcen bezahlen, die ungenutzt bleiben. Cloud-Hosting kann nur dann kosteneffizient sein, wenn es sinnvoll genutzt wird. Um die Auslastung zu überwachen und inaktive Instanzen nach einer Wartezeit freizugeben, benötigen Sie entweder Tools, oder Sie müssen diese Logik selbst implementieren. Die Selbstbau-Alternative erfordert möglicherweise Kompetenzen, über die Ihr Unternehmen noch nicht verfügt – es lohnt sich daher, die verfügbaren Optionen zu analysieren und abzuwägen.

Sicherheit

Beim Hosten von Daten und Diensten in der Cloud war Sicherheit schon immer ein Knackpunkt. Für einige Unternehmen ist bereits der Gedanke, kritische Software auf der Hardware eines Drittanbieters zu speichern, ein No-Go. Andererseits nutzen viele Unternehmen öffentliche Clouds sowohl für ihre Live-Services als auch für ihre Deployment-Pipelines – vom Quellcode-Repository über den CI-Server bis hin zu Testumgebungen.

Um die Risiken zu minimieren, sollten Sie die potenziellen Angriffsmethoden kennen, Schutzmaßnahmen in Ihre Pipeline integrieren, damit sie nicht von böswilligen Akteuren für den Zugriff auf Ihr Live-System missbraucht werden kann, und bei der Verwaltung von Anmeldeinformationen, Testdaten und Zugriffsmethoden auf Best Practices setzen.

Hybrid-Ansätze

Infrastruktur als Code, Container und Container-Orchestrierung haben zwar allesamt ihre Wurzeln in der Cloud – aber dies bedeutet nicht, dass sie nur in hybriden Infrastrukturen verwendet werden können.

Auch in privaten Clouds oder in lokalen Infrastrukturen können diese Tools eingesetzt werden, mit der Einschränkung, dass die Skalierbarkeit der Pipeline begrenzt ist. Wenn Ihr Unternehmen erwägt, in Zukunft zu einer Cloud-gehosteten Infrastruktur zu wechseln, können Sie durch eine frühzeitige Einführung von Cloud-nativen Tools Fachwissen aufbauen und somit den späteren Umstieg vereinfachen.

Das aus der Cloud stammende Prinzip „Infrastruktur als Code“ bietet auch in lokalen Umgebungen zahlreiche Vorteile für Continuous Integration und Continuous Deployment. Erstens können dadurch neue Umgebungen viel schneller eingerichtet werden – Sie müssen ja nur ein Skript ausführen.

Das Speichern der Umgebungserstellung als Code sorgt außerdem für Konsistenz zwischen der Produktionskonfiguration und den Vorproduktionsumgebungen – ganz gleich, ob diese für Sicherheits-, Performance- oder UI-Tests oder als Sandboxen für Support- und Verkaufsteams eingesetzt werden. Durch das Speichern der Infrastruktur-Konfigurationsdateien in der Quellcodeverwaltung kann das Team Inhalt und Zeitpunkt von Änderungen nachvollziehen. Bei Problemen mit den Ausführungsumgebungen wird dadurch das Debuggen wesentlich vereinfacht.

In einigen Fällen verwenden Unternehmen Cloud-Ressourcen nur für bestimmte Phasen der Deployment-Pipeline. Zum Beispiel können Last- und Performancetests sehr ressourcenintensiv sein, sodass es oft kostengünstiger ist, zu ihrer Ausführung eine temporäre Umgebung in der Cloud einzurichten. Wenn Sie diesen Ansatz erwägen, sollten Sie allerdings die potenzielle Komplexität und den Zeitaufwand berücksichtigen, die mit dem Übertragen Ihres Builds in eine andere Infrastruktur verbunden sind.

Warum sollten Sie die Cloud für Ihre CI-Pipeline wählen?

Ein automatisierter CI/CD-Prozess kann erhebliche Vorteile für die Geschwindigkeit der Bereitstellung und die Qualitätssicherung bieten. Allerdings stellt die verfügbare Infrastruktur hinsichtlich Geschwindigkeit und Durchsatz einen limitierenden Faktor dar. Wenn Sie Ihre Pipeline in die Cloud verlegen, müssen Sie nicht mehr eine Balance finden zwischen einer ausreichenden Serverleistung für Spitzenzeiten und den Kosten für den Kauf und die Verwaltung von Servern, die nicht durchgehend ausgelastet sind.

Cloud-native Technologien und Methoden sorgen nicht nur für eine effiziente Nutzung der Cloud-gehosteten Infrastruktur, sondern ermöglichen auch Optimierungen in Bezug auf Continuous Integration und Continuous Deployment. Diese Ansätze können auch bei einer lokalen Infrastruktur verwendet werden, um die Bereitstellung von Software schneller und zuverlässiger zu gestalten.