Continuous Integration (CI) und Continuous Deployment/Delivery (CD) sind zentrale Konzepte in der modernen Softwareentwicklung. Während große Unternehmen CI/CD bereits flächendeckend einsetzen, stehen kleine bis mittelgroße Unternehmen oft vor der Frage, ob und wie sich die Implementierung lohnt. In diesem Artikel beleuchten wir die Vorteile, Herausforderungen und für uns bewährte Methoden für den Einsatz von CI/CD im Unternehmen außerhalb des Silicon Valley.
CI/CD außerhalb des Silicon Valley: Ein Überblick
Für Entwickler gab und gibt es eine Vielzahl von Prozessen, die die Zusammenarbeit im Team gewährleisten. Letztlich zeichnet sich aber in all diesen Prozessen ein Muster aus wenigen Hauptkomponenten ab. Das Team arbeitet an neuen Funktionen oder behebt Fehler. Dabei wird eine Änderung am bestehenden Code vorgenommen oder neuer Code hinzugefügt. Das Resultat wird nach der Änderung in ein oder mehrere Artefakt(e) überführt, die letztlich auf diversen Wegen zum Kunden gebracht werden.
Die Übergänge zwischen diesen Schritten wurden oft manuell ausgeführt und benötigten neben den Ressourcen…
- Rechenleistung zur Kompilierung
- installierte Werkzeuge
… auch viel Expertise,
- Welche Kommandos müssen ausgeführt werden?
- Welche Parameter müssen wie gesetzt werden?
Koordination
- Wer führt den Prozess durch?
- Wann darf der Prozess durgeführt werden?
… und vor allem Zeit. Von der Fehleranfälligkeit ganz zu schweigen…
Zeit ist in der IT-Branche immer rar und die immerzu steigende Anzahl der Meetings und “Agile Coaches” lässt vermuten, dass auch die Koordination in Teams oft zu wünschen übriglässt. Es liegt also nahe, die Problemstellen dieser Prozesse zu reduzieren oder deren Durchführung zumindest zu unterstützen. Schließlich nimmt die Frequenz, in der sie ausgeführt werden müssen, mit steigender Unternehmensgröße und Nutzerbasis, stetig zu.
Was ist CI/CD?
CI/CD beschreibt einen automatisierten Prozess der Softwareentwicklung, der aus zwei Hauptbereichen besteht:
- Continuous Integration (CI): Entwickler führen Codeänderungen kontinuierlich in ein gemeinsames Repository. Automatisierte Tests stellen sicher, dass neue Features oder Fixes keine bestehenden Funktionen beeinträchtigen und die neuen Features so funktionieren, wie gewünscht.
- Continuous Deployment/Delivery (CD): Die Software wird nach erfolgreicher Prüfung (halb-)automatisch in die Ausführungsumgebung oder in den Veröffentlichungsprozess gebracht.
Im Kern geht es also darum die wiederkehrenden Prozesse durch Automatisierungen zu vereinfachen, beschleunigen und gleichzeitig auch noch weniger Fehleranfällig zu machen. Klingt gut, oder?
Vorteile von CI/CD im Detail
Die Implementierung von CI/CD bringt Unternehmen zahlreiche Vorteile:
- Schnellere Entwicklungszyklen: Automatisierte Builds und Deployments verkürzen die Zeit von der Entwicklung bis zur Veröffentlichung.
- Höhere Softwarequalität: Durch automatisierte Tests werden Fehler frühzeitig erkannt und können behoben werden, bevor sie den Kunden erreichen.
- Geringere Kosten: Nicht jeder Entwickler braucht einen leistungsfähigen Rechner, um die rechenintensiven Aufgaben überhaupt ausführen zu können. Die bestehende Infrastruktur kann deutlich besser ausgenutzt werden
- Bessere Zusammenarbeit: Quasi als Randerscheinung werden Entwickler-Teams effizienter zusammenarbeiten, da sich CI/CD Prozesse fast ausschließlich mit “guten” Kollaborationswerkzeugen implementieren lassen.
- Wissensbündelung: Das Wissen über die verwendeten Werkzeuge kann gebündelt werden und wird durch die Automatisierungen zu einem gewissen Grad auch dokumentiert.
Herausforderungen und Lösungsansätze
Trotz der zahlreichen Vorteile stehen Unternehmen oft vor Herausforderungen bei der Einführung von CI/CD:
- Initialer Implementierungsaufwand: Die Einführung erfordert eine Anpassung der bestehenden Prozesse. Eine schrittweise Einführung mit Pilotprojekten kann hier helfen.
- Kosten für Tools und Infrastruktur: Kommerzielle Anbieter rufen oft hohe Preise für ihre Lösungen auf. Der Grund dafür sind aber oft Funktionen, die erst in sehr großen Unternehmen zum Tragen kommen. Auch ihre Integrationen können Nachteile haben und werden, zusätzlich zu den Lizenzen, Kosten verursachen. Open-Source-Lösungen wie Jenkins, GitLab CI/CD oder GitHub Actions bieten kosteneffiziente Möglichkeiten für den Einstieg.
- Know-how und Schulung: Automatisierungen sind Software. Die verwendeten Werkzeuge sind Software. Alle Software muss betreut und verstanden werden, um sie effizient einsetzen zu können. Mitarbeiterschulungen und externe Beratung können die Lernkurve verkürzen. Open-Source-Lösungen bieten oft weitreichendere Beispiele und Ressourcen im Netz, müssen dafür allerdings oft auch länger gesucht werden.
Nun aber noch ein paar harte Wahrheiten, die oft verschwiegen werden und gerade in kleinen Unternehmen oder Teams zum Problem führen können.
- Kontinuierlicher Aufwand: Die Automatisierungen fallen nicht vom Himmel. Sie sollten als eigenständiges Softwareprojekt betrachtet werden. Sie haben Fehler, die es zu beheben gilt. Sie müssen verbessert werden und sich den Bedürfnissen des Teams anpassen. Softwareprojekte benötigen immer Zeit und Expertise. Es gilt auch hier stetig abzuwägen, welche Änderungen praktikabel sind, wie diese verifiziert werden können und ob ein (oft nur langfristig erkennbares) positives Kosten/Nutzen-Verhältnis vorliegt.
- Abhängigkeiten: Es passiert schnell, dass man von den eingesetzten Werkzeugen abhängig wird. Das Ökosystem des Anbieters ist meist verlockend, doch eine einzige Lizenz- oder Preisänderung kann kleine Unternehmen oft vor immense Herausforderungen stellen.
- Silos: Wenn Entwickler sich nicht mehr intensiv mit den Details der Werkzeuge beschäftigen müssen, wird dieses Wissen langfristig nur unter einigen wenigen Entwickler verteilt, die sich um die Automatisierungen kümmern.
Best Practices für eine erfolgreiche CI/CD-Einführung
Um CI/CD erfolgreich im Unternehmen zu etablieren, sind folgende Best Practices hilfreich:
- Schrittweise Einführung: Startet mit einem kleinen Projekt, um Erfahrungen zu sammeln.
- Auswahl der Werkzeuge: Jedes CI/CD System hat Vor- und Nachteile. Man sollte mit einem kosteneffektiven System starten, dass eventuell bereits im Ökosystem der verwendeten Werkzeuge vorhanden ist (bspw.: GitLab CI/CD, GitHub Actions). Es sollte aber stets versucht werden, die Automatisierungen so zu implementieren, dass ein Wechsel möglichst einfach vollzogen werden kann.
- Automatisierte Tests priorisieren: Ohne solide Teststrategien ist CI/CD ineffektiv. ABER! Hohe Testabdeckung ist keine Voraussetzung und kann auch im Laufe der Zeit erreicht werden.
- Versionskontrolle optimieren: Auch die Struktur von Repositories hat einen starken Einfluss auf den CI/CD Prozess. Monorepos und verteilte Repositories haben Vor- und Nachteile in der Entwicklung, aber auch in Bezug auf CI/CD Pipelines. Die Auswahl sollte sorgfältig getroffen werden: z.B. erleichtern Monorepos die Entwicklung, können aber die Pipelineentwicklung durch einen Mix an Technologien und Artefakttypen deutlich komplexer machen.
- Monitoring und Feedback einbauen: Benachrichtigungen helfen, Fehler schnell zu bemerken. Die Details zum Fehler sollten zugänglich und möglichst klar sein. Zusätzlich sollten Benachrichtigungen, wenn möglich, direkt weitere Anweisungen oder Hilfestellungen aufzeigen.
- Lokale Ausführbarkeit: Grundsätzlich sollte man vorsehen, die Automatisierungen auch lokal ausführen zu können. Es ist frustrierend, Fehler nicht oder nur durch erneute Ausführung der Pipelines nachstellen zu können. Eine schnelle “Feedback-Loop” ist entscheidend für die Entwicklerproduktivität. Idealerweise sollte man die verwendeten Werkzeuge in die Pipeline und in die lokale Entwicklungsumgebung (und auch IDEs) integrieren.
- Keep it simple: Sicherlich sind einige angebotene Funktionen verlockend. Oftmals ist aber weniger mehr. Weitere Funktionen und höhere Komplexität sollten gerechtfertigt sein.
- Infrastruktur: Eine wartungsarme und überschaubare Infrastruktur wird sich langfristig mehr auszahlen als unendlich skalierbare Lösungen, deren Fähigkeiten man im kleinen Maßstab in der Regel nicht nutzt. Oft sind einzelne statische Runner ausreichend. Solche können oft als simpler Docker Container betrieben werden. Erst wenn diese an ihre Grenzen stoßen, sollte man auf Runner im Clusterbetrieb oder verwaltete Dienste umsteigen.
Fazit
CI/CD bietet Unternehmen erhebliche Vorteile in Bezug auf Effizienz, Qualität und Wettbewerbsfähigkeit. Trotz initialer Herausforderungen kann eine schrittweise Implementierung mit geeigneten Tools den Erfolg sichern. Es gilt jedoch zu beachten, dass es auch kontinuierlichem Aufwand bedarf, diese Systeme zu pflegen und zu optimieren.
Ausblick
Die genaue Ausprägung bzw. die Bestandteile einer CI/CD Pipeline sind davon abhängig, welche Kunden bedient, welche Programmiertechniken angewandt und welche Ziele verfolgt werden. Eine pauschale Aussage über die Pipelinekomponenten lässt sich also nur schwer treffen.
Dennoch wollen wir versuchen ein grobes Beispiel für einen Webentwicklungsstack zu erarbeiten, der auf Java und Type-/JavaScript basiert.
Stay tuned!