An introduction to CI/CD in german (english article following soon)
In diesem Artikel wird das Konzept der häufig verwendeten Abkürzung "CI/CD" vorgestellt. Sie ist häufig in Kombination zu agiler Softwareentwicklung zu finden, ist aber keine Voraussetzung für diese. Unter "CI/CD" versteht man eine Abwandlung eines Teilbereichs der Softwareentwicklung durch die Automatisierung von essentiellen Schritten bei der Verbreitung des fertigen Softwareprojekts. Die Abkürzung besteht hier aus zwei Teilen: wobei "CI" ein fester Bestandteil und Voraussetzung von "CD" ist; sie werden jedoch Vorzugsweise in der anfänglich gegebenen Kombination genannt.
In der klassischen Softwareentwicklung, die inzwischen kaum noch vertreten ist, wird das Wasserfall Modell verwendet bei der das Softwareprojekt viele verschiedene Phasen durchläuft. Diese Phasen sind Aufgabentechnisch klar voneinander getrennt und überschneiden sich nur gering. Die Oberbegriffe dieser Phasen sind in der Regel: Planung, Entwicklung, Testen und Abgabe.
Bezogen auf das Projekt steht am Anfang die vollständige Planung des Projektes, hier werden auch bereits alle Feinheiten definiert. Die detaillierte Planung wird in enger Absprache oder auch Zusammenarbeit mit dem Kunden erstellt. Dies ist normalerweise das letzte mal, dass der Kunde auf das Produkt Einfluss nimmt, bis das Projektprodukt am Ende übergeben wird. Nach der Planung kommt eine lange Entwicklungsphase in der das Produkt seine Form erhält, es wird sich penibel an den Plan gehalten, jedoch bekommt weder der Kunde das Produkt zu sehen noch können größere Änderungen einfach realisiert werden, da weniger in abtrennbaren Modulen und mehr das gesamte Produkt von vorne nach hinten abarbeitet wird. Nachdem das Projekt fertig entwickelt worden ist, folgt eine Testphase bei der Mitarbeiter der "Quality Assurance" (QA) das Softwarepaket auf Fehler überprüfen und diese umständlich, durch die große zeitliche Trennung, an die Entwickler zurückgeben. Der beschriebene Kreislauf zwischen QA und den Entwicklern wird so lange durchgeführt bis keine Fehler mehr gefunden werden können.
Zuletzt, nach der langen Entwicklungsdauer und vielen Testdurchläufen, bekommt der Kunde einen Einblick in das fertige Projekt. Im Idealfall hat der Kunde keine Beschwerden mehr vorzuzeigen und das Projekt kann von der Entwicklungsfirma im Kundensystem installiert werden.
Dieser Prozess, von der Planung bis hin zum vollständig getesteten Produkt, dauert, im Vergleich zur im nächsten Kapitel besprochenen Methode, lange, ohne in der Zwischenzeit größere Absprachen mit dem Kunden zu führen oder einen Ansatz eines vorzeigbaren Produktes auf der Hand zu haben. In unserer heutigen Zeit, in der alles schnell fertiggestellt werden muss und einfach auf Änderungswünsche eingegangen werden können muss, ist diese Art der Softwareentwicklung in den meisten Fällen ungeeignet.
Heutzutage wird eine andere Variante der Softwareentwicklung verwendet. Die agile Softwareentwicklung ist ausgelegt für ändernde Produktanforderungen im Laufe der Entwicklungsphase. Anstelle von klar getrennten seriellen Blöcken, der Planung, Entwicklung, Test und Installation, gehen diese in der agilen Entwicklung ineinander über beziehungsweise laufen größtenteils parallel ab.
Auch in der agilen Entwicklung können Reste dieser strikten Grenzen, der seriellen Phasen sowie die Einteilung des Entwicklungsablauf wiedergefunden werden. Am Anfang, wie auch im Wasserfall Modell, steht die Planung des Projektes, hier werden jedoch nur wenige Details über die Umsetzung definiert. In der ersten Planungsphase geht es hauptsächlich um das Erstellen eines groben Überblicks von dem gewünschten Produkt. Hier werden meist vor allem besondere Detailansprüche nicht klar definiert. Diese grobe Planung wird später in einem vergleichsweise kleinen Entwicklerteam von meist weniger als zehn Personen verwendet um ein so genanntes "Minimum viable Product" (MVP) zu erstellen, ein Produkt, welches die wichtigsten Funktionen bietet und dem Kunden ein erstes "Proof of concept" bieten kann. Bereits in der Erstellung dieses MVP werden zahlreiche Unterschritte getätigt um einfach, schnell und übersichtlich um in dem kleinen Team das Produkt zu entwickeln. Die Entwickler und Tester treffen sich regelmäßig als vollständige Gruppe inklusive Leiter, welcher im engen Kontakt mit dem Kunden steht, um weitere Details und Features zu besprechen, welche bis zum nächsten Treffen entwickelt werden sollen. Unabhängig von diesen Großrunden stehen die Entwickler und Tester im ständigen und engen Kontakt um gegenseitig Hilfestellungen zu bieten, den Code aufeinander abzustimmen sowie Fehler gemeinsam zu lösen. Diese enge Zusammenarbeit zwischen Entwicklung, Test sowie Kunde hat einen entscheidenden Vorteil gegenüber der Wasserfall Methode. Da das Produkt nicht schon am Anfang vollständig durchgeplant worden ist, kann relativ einfach auf das Produkt Einfluss genommen und so an geänderte Anforderungen angepasst werden.
Das Prinzip der CI/CD greift direkt in den Ablauf der agilen Entwicklung ein und ist eine Fortsetzung dieses Prinzips.
Kurzgesagt bezeichnet die Abkürzung "CI/CD" einen automatisierten Weg um ein Softwareprojekt zu testen, zusammenzustellen und eventuell zu installieren bzw. auszuliefern.
Die Abkürzung kann in drei Abschnitte unterteilt werden, "CI" - Continous Integration, sowie "CD" - Continous delivery/Continous deployment, wobei es keinen allgemeinen Konsens gibt, was mit "CD" gemeint sein soll.
"Continous intergration", der Englische Name der Abkürzung "CI", bezeichnet den Prozess des ständigen automatisierten Testens. Dies setzt voraus, dass das Entwicklerteam Testfälle aufgesetzt hat und diese ständig dem Soll-Entwicklungsstand entsprechend aktualisiert. In diesem Schritt wird das Projekt kompiliert und anhand von vorgefertigten Testfällen und Testumgebungen automatisch getestet. Bei einem erfolgreichen Durchlauf aller Tests wird die Software zur manuellen Verbreitung bzw. Installation bereitgestellt. Hiermit endet der Aufgabenbereich der CI. Dort wo die Continous Integration mit der Automatisierung endet geht CD, je nach Definition, ein bis zwei Schritte weiter.
"Continous delivery", der nächste Schritt der CI/CD Kette, erhält beim erfolgreichen Durchlaufen der Testfälle die Software und führt selbst weitere Tests durch, welche in einer Umgebung und mit Daten durchgeführt werden, die der Produktion sehr nahe komme. Beispielsweise werden Datenbanken mit mehr als nur Platzhaltern gefüllt und andere notwendigen der Realtität nachahmend aufgesetzte Komponenten werden angebunden. So sollen so viele Fehler wie möglich erkannt werden, bevor es an den Kunden als nächste Iteration (kleinere Version/kleineres Update) abgegeben bzw. auf dessen Server installiert wird. Sind die Tests erfolgreich, wird die aktualisierte Software auf einen Produktion-Server geladen und gegebenenfalls nötige Änderungen an Konfigurationen und ähnlichem werden durchgeführt.
"Continous deployment" geht einen Schritt weiter. Hier wird der letzte menschliche Handgriff, das finale Veröffentlichen und einbinden in die bestehende Netzwerkstruktur, ebenfalls automatisiert. Identisch zum Continous delivery werden die intensivieren Tests durchgeführt, das Produkt wird auf den ersten nicht-kritischen Server installiert und, hier anders, automatisch nach erfolgreicher Installation in das Netzwerk eingebunden und nach kritischen Problemen direkt nach der Einbindung geprüft.
Unabhängig von der jeweiligen Definition von CD greift das Prinzip der CI/CD in die Entwicklung ein und verändert grundlegend das Programmierern im Alltag. Betrachtet man beide Aspekte getrennt, beeinflusst CI die eigentliche Entwicklung währenddessen CD das Arbeiten der Quality Assurance (QA) und der Operations (Ops) vollständig verändert und zu weiten Teilen sogar abschafft.
Die Nutzung einer CI/CD Toolchain erfordert eine spezielle Vorgehensweise in der Programmierung an vielen kleinen Stellen. Die Grundbedingung für das Aufsetzen der Toolchain ist das verwenden einer Versionskontrolle wie Git, bei der die Entwickler regelmäßig, teilweise mehrmals täglich, ihre Änderungen auf einen gemeinsamen Server committen (Anglizismus für eng. "(to) commit"), sodass auch für kleine Änderungen die CI das Projekt überprüfen kann und die Zusammenarbeit im Team gefördert wird. Desweiteren werden, um die Tests durchzuführen, Testfälle benötigt, die das gesamte Projekt abdecken und abtesten sollten. Bei Änderungen an der Funktionsweise der Software ist es selbstverständlich nötig die Testfälle dem gewünschten Ergebnis anzupassen. Diese Testfälle müssen jedoch nicht unbedingt existieren, gerade bei kleinen Projekten, die vielleicht in der Freizeit erstellt werden, reicht vielleicht das erfolgreiche Kompilieren als einziger Testfall aus um schnellstmöglich an ein MVP zu kommen. Mit dem Umstellen des Committen und dem Erstellen von Testfällen sind die Grundbedingen geschaffen um ein CI anbinden zu können.
Für CD übernehmen die Entwickler Teile der QA und Ops und werden zu so genannten DevOps, kurz für Developer und Operations. Sie passen die Toolchain der CI/CD ständig dem derzeitigen Entwicklungsstand an, sodass das das Aufgabengebiet der QA, das Testen des Systems, zu großen Teilen durch die automatisierten Tests wegfällt und das der Operations, das Installieren der neuen Systeme, vollständig durch die Continous development abgenommen wird. Dafür sind gute Kenntnisse der gesamten Systemstruktur, deren Betriebssysteme und die Zusammenarbeit der einzelnen Komponenten von den DevOps essenziell.
Das implementieren einer CI/CD Toolchain hat viele Vorteile, insbesondere der klassischen Entwicklung gegenüber. Richtig implementiert kann solch eine Toolchain Unmengen an Geld sparen. Durch das Einführen von Testfällen, die das gesamte System abdecken und das automatisierte Installieren eines Systems können viele Stunden eingespart werden, da nicht mehr zahlreiche Mitarbeiter das Projekt durchtesten müssen und keine stundenlangen Nachtschichten für die Installation mehr bezahlt werden müssen. Stattdessen können diese Aufgaben automatisiert oder mittels eines einfachen Knopfdrucks durchgeführt werden. Die Arbeitsweise von CI/CD fördert mehr Kollaboration zwischen den Entwicklern und den restlichen Teammitgliedern, welches zu mehr Freude und wieder zu mehr Produktivität führen kann. Zuletzt kann das aufsetzen von Continous Delivery und automatische Installieren der neuen Version bei jedem Commit den Kontakt zu den Benutzern fördern und schneller Feedback eingesammelt werden.
Jedoch kann CI/CD auch ein paar Nachteile und Probleme mit sich führen. Es ist nicht immer trivial und einfach eine CI/CD Toolchain aufzusetzten und erst recht in ein bereits existierendes größeres Projekt einzubinden. Auch wenn die Toolchain viel Zeit einsparen kann müssen, gerade wenn das Projekt größere Ausmaße hat oder annimmt, zwischendurch einige Zeit investiert werden um die Toolchain aufzusetzten und in Stand zu halten. Das Umstellen der Kollaboration zwischen den Entwicklern und im Team kann schief laufen, wenn keiner im Team bereits Erfahrung sammeln konnte noch enger verknüpft im Team zu arbeiten und anständige Commits zu schreiben, kann der gesamte Prozess sehr anstrengend sein und sogar länger Dauern als die vorherig verwendete Methode. Zuletzt, je nach Kundenstruktur und Projekt, bietet es sich in manch einem Fall nicht an eine CI/CD Pipeline vollständig zu implementieren, da entweder die Berechtigungen des Kunden oder das eingesetzte Gebiet zu groß ist umd den Überblick behalten zu können und alle Eventualitäten einplanen zu können.
Glücklicherweise gibt es für die meisten dieser Probleme bereits gut Ansätze um diese Probleme zu verhindern, so genannte "Best Practices" die die Zusammenarbeit mit der CI/CD so einfach wie möglich gestalten. Wenn sich mit dem Grad des Einflussbereichs auseinandergesetzt wurde und klar ist, inwieweit eine CI/CD Toolchain sinnvoll und inwieweit sie einsetzbar ist, kommt es nun auf den Entwicklungsstand des derzeitigen Projektes an. Falls das Projekt bereits einen größeren Umfang erreicht haben sollte und schon weit fortgeschritten ist, kann ein Umstieg auf eine CI/CD Toolchain nicht mehr sinnvoll sein, falls doch sollte die Toolchain schrittweise aufgesetzt und erprobt werden. So sollte das Team beispielsweise den Umgang mit der Verflochtenen Arbeitsweise der agilen Entwicklung verinnerlicht haben. Steht das Projekt noch am Anfang und dem Team ist die Entwicklung mit CI/CD nicht unbekannt, kann die Toolchain auch zu Anfang schon aufgesetzt werden und mit dem Projekt gemeinsam wachsen.
Wie auch schon zuvor angedeutet ist es sinnvoll, um eine derartige Toolchain verwenden zu können, die Mitarbeiter des Teams angemessen zu schulen, um sich in der agilen Entwicklung, im Team und der CI/CD einfach bewegen zu können und Hand in Hand miteinander arbeiten zu können.