3 Beeinträchtigung(xxProbleme) bei der Einführung und im Betrieb von
CI/CD

Die Umsetzung und Einführung eines CI/CD System beinhaltet weit mehr als
die einfache Automatisierung bestehender Prozesse. Sie birgt
tiefgreifende Änderungen für die Softwareentwicklung im Prozess als auch
im mentalen Wandel bezüglich Methode und Tools.

So läuft die Einführung und der Betrieb eines CI/CD Systems nicht immer
reibungslos. Im Folgenden werden häufig anzutreffende Probleme
skizziert, welche zum Teil typisch und häufig im Umfeld von CI/CD sind,
oder durch die starke Integration besonders zum Tragen kommen. Die
Problembeschreibungen basieren auf Experteninterviews,
Literaturrecherchen und Beobachtungen an/inxx verschiedenen
Praxisprojekten.

Die Interviews wurden mit Softwareentwicklern unter CI/CD sowie
Automatisierungs- und Integrationsexperten geführt. (CI/CD Systeme für
VM-Images (xxx)und Microservices in einer Vielzahl komplexer
Zielumgebungen) (xxx genauer beschreiben???)

Meine Praxiserfahrungen basieren auf der Einführung eines CI/CD Systems
unter GitLab-CI sowie dem Aufbau einer Serverless - CI/CD Plattform
unter Jenkins X auf Kubernetes.

Eine weitere Quelle sind Fachartikel, Paper und Erfahrungsberichte zu
verschiedenen CI/CD Systemen in ihrer Anwendung.

Die Probleme wurden erfasst und in Hinblick auf den Zeitpunkt, zu dem
das Problem sichtbar wird (Einführung oder Betrieb), Problemdarstellung,
Ursache und Folge analysiert. Neben dem Zeitpunkt der Problemerscheinung
wird in der Darstellung nach Problemursache gruppiert.

\emph{\textbf{Kapxx Probleme während der Einführung eines CI/CD System}}

In diesem Kapitel werden Probleme dargestellt, welche während der
Planungs- und Einführungsphasen von CI/CD in Erscheinung treten, dabei
können sie zu Verzögerungen im Einführungsprozess fuhren oder sogar eine
Einführung verhindern.

Eine wesentliche Entscheidung in dieser Phase ist die Toolauswahl.

Die Nutzung einer All-in-One Lösung verspricht eine schnelle
Implementierung und Verfügbarkeit von CI/CD, vor Allem wenn sie durch
die firmeninternen Compliance - Vorgaben zugelassen ist (All-in-One
Tool).

Das individuelle CI/CD System wird auf die konkrete Projekt- und
Systemumgebung (Quellcodeverwaltung, Tools zur Codeüberprüfung,
Dependency-Management) ausgelegt. Häufig finden sich in dieser Lösung
Tools, welche bereits im Einsatz sind und so für den Entwickler weniger
Umstellung bedeuten. Unterschiedliche Einzeltools bilden zusammen mit
dem automatisierten System (Build-Server) das CI/CD System.

In diesem Zusammenhang wird der Use Case definiert als eine konkrete
Anwendung eines CI/CD Systems für ein Softwareentwicklungsprojekt mit
allen Anforderungen des Projektes. (beispiel einfügenXxxx und xxxx

\textbf{\textgreater\textgreater Kapitel xxx Probleme aufgrund nicht
ausreichender Planungstiefe}

Die im Anschluss dargestellten Herausforderungen bei einer Einführung
von CI/CD können entstehen, wenn bei der Planung Details über den Use
Case sowie die potentiellen Tools nicht tief analysiert werden.

\textbf{E01 - Toolauswahl deckt nicht die Anforderungen des
Softwareentwicklungsprojekts}

Insbesondere bei der Wahl eines All-in-One Tool kann es passieren, dass
der Use Case nicht darstellbar ist. Beispielsweise könnte der Use Case
einer Softwareentwicklung für ein Autoradio nicht mit einem All-in-One
Tool für Cloud- und Webanwendung umgesetzt werden.

\begin{itemize}
\item
  das CI/CD System ist nicht funktionsfähig für diese Anwendung und die
  Toolauswahl muss wiederholt werden
\end{itemize}

\textbf{E02 Umstellung der Nutzer auf Tools und Methode}

Gerade bei einem All-in-One Tool ist die Einführung besonders
herausfordernd. Während bei einer individuellen Lösung häufig bereits
existierende, dem Nutzer bekannte Tools im CI/CD -- System implementiert
werden, ist bei dem All-in-One Tool häufig mehr an Umstellung zu leisten
in Bezug auf Tool und Methode.

\begin{itemize}
\item
  Notwendigkeit von zusätzlichem Training für Methode und Tool
\end{itemize}

\textbf{E03 Migrationsaufwand}

Für ein bereits existierendes Projekt muss die Migration aus der alten
Umgebung in das neue CI/CD System vorgesehen werden.

Code-, Test- und Deploymentscripte sowie die Zielumgebung müssen
angepasst werden (Server, Software, Internetanbindung, Security).

Die problemlose Umstellung auf ein All-in-One Tool hängt stark vom Use
Case ab. Es gibt Anwendungen, deren Integration ohne große Umstellungen
funktionieren kann, vor allem bei Neuentwicklungen. Aber es gibt
entsprechende Gegenbeispiele, welche in dieser Umstellungsphase zu
Problemen oder Verzögerungen führen können.

\begin{itemize}
\item
  Je nach Tool erheblicher Migrationsaufwand
\end{itemize}

\textbf{E04 - Fehlender Automatisierungsexperten/Integrationsexperte}

Wird ein selfhosted CI/CD-System nicht durch einen
Automatisierungsexperten umgesetzt und betreut, stehen die CI Tools zwar
zur Automatisierung bereit, sind aber noch nicht integriert. Der
Entwickler muss die Integration der Tools für sein Projekt nach eigenem
Ermessen selbst vornehmen. Das führt zu einer Vielzahl unterschiedlicher
Setups eines CI/CD - Systems.

Diese unterschiedlichen Setups gehen zu Lasten von Wartbarkeit,
Übersichtlichkeit und Fehleranfälligkeit.

Bei unsachgemäßer Nutzung eines CI/CD Systems können z.B.
Integrationsfehler erst im Deployment zu Tage treten, ob wohl die Tests
erfolgreich durchlaufen wurden.

Die Wartung des CI/CD Systems ist auch Aufgabe des
Automatisierungsexperten. Ein CI/CD System benötigt kontinuierliche
Wartung im laufenden Betrieb. Dazu gehört die Überwachung und Anpassung
von Systemstatus, Automatisierung, Speicherverbrauch, Zertifikaten,
Konfiguration und Architektur.

Die Server müssen angepasst, aufgestockt, beschleunigt und die Balance
überwacht werden.

\begin{itemize}
\item
  Im individuellen CI/CD-System muss diese Aufgabe geplant werden,
  während bei der All-in-One Lösung der Provider diese Aufgabe wahrnimmt
\end{itemize}

\textbf{Kap - \textgreater{} Probleme im Umfeld von Richtlinien und
Standards}

Es gibt eine Vielzahl von projekt- und unternehmensspezifische
Richtlinien, unter denen CI/CD Systeme implementiert und betrieben
werden. Unkenntnis über deren Existenz oder Inhalt führen zu den
folgenden Herausforderungen bei einer Einführung.

\textbf{E05 -- Sicherheitsrichtlinien widersprechen den Zugriffen durch
das Tool}

Dazu gehören Sicherheitsrichtlinien im Unternehmen, beispielsweise
könnte das Ausführen eines privilegierten Containers in einem CI/CD
System nicht zugelassen sein, wenn die CI/CD Systeme Zugriffe auf
Produktivsysteme besitzen und so durch ein modifiziertes CI/CD Script
ein unautorisierter Zugriff auf das Produktionssystem erfolgen könnte.

\begin{itemize}
\item
  Kann zum Scheitern der Systemeinführung führen oder ein Workaround ist
  notwendig
\end{itemize}

\textbf{E06 -- Coding-Konvention}

Unternehmens- oder Projekt-Codingrichtlinien können den Vorgaben des
gewünschten Tools widersprechen. Ein Workaround ist notwendig.

\begin{itemize}
\item
  Kann zum Scheitern der Systemeinführung führen oder ein Workaround ist
  notwendig
\end{itemize}

\textbf{E07- Nicht übereinstimmende Portvorgaben zwischen der
Anwendungssoftware und dem} Tool

Der Portmissmatch ist ein typisches Problem bei All-in-One Lösungen. Das
CI/CD System geht davon aus, dass die Software ihren Service über einen
spezifischen Port zu Verfügung stellen kann (z.B. Port 3000). Die zu
migrierende Software nutzt einen anderen Port oder vielleicht überhaupt
keinen Port, wenn sie z.B. einen Message-Bus anwendet.

Darüber hinaus könnte das CI/CD System das operativexx System, z.B.
Kubernetes so konfigurieren, dass es auf einen Lifeness Check(
Lebenszeichen über den Bereitschaftsstatus der Software) genau über
diesen Port erhält. Solange die Software nicht angepasst ist und dieses
Signal nicht empfangen kann, würde das operative System die Anwendung
immer wieder neu starten, um eine Selbstreparatur zu ermöglichen.

\begin{itemize}
\item
  Pipeline zeigt ungewolltes Verhalten -- ist nicht funktionsfähig
\end{itemize}

\textbf{E08 -- Namespace Restriktionen}

Eine häufig anzutreffende Richtlinie im Kubernetik-Umfeld betrifft die
Vorgabe, in einem Cluster jede Anwendung im eigenen Namespace
bereitzustellen. Häufig aber lässt das CI/ CD Tool nur ein Deployment
auf einen fixen Namespace zu.

\begin{itemize}
\item
  ein Workaround ist notwendig
\end{itemize}

\emph{\textbf{Kap. Probleme, welche im Betrieb eines CI/CD Systems
entstehen können.}}

Viele Herausforderungen in einer Umstellung auf CI/CD werden erst nach
der Einführung einer CI/CD Pipeline sichtbar und Probleme entstehen aus
Unkenntnis über spezifische Anforderungen des Tools - der gewünschte
Prozessdurchlauf funktioniert nicht und es müssen Workarounds gefunden
werden - die Betriebskosten des Tools erhöhen sich.

\textbf{Kap Probleme durch erhöhte Hardwarebeanspruchung}

Eine wesentliche Änderung ist die Umstellung auf eine
Softwareentwicklung durch kleine inkrementelle Änderungen, welche
kontinuierlich implementiert und integriert werden. Daraus ergeben sich
besondere Anforderungen an die Hardware, auf der ein CI/CD System
installiert wird.

\textbf{B01 extreme Laufzeiten im Build-Prozess}

CI/CD Systeme und Plattformen sind in ihrer Anwendung so ausgerichtet,
dass viele Projekte parallel CI/CD betreiben.

Durch den Ansatz, inkrementell kleinste Codeänderungen sofort zu
integrieren, wird bei jeder Codeänderung der Build-Prozess durchlaufen.

\begin{itemize}
\item
  Dieses Vorgehen kann zu einer hohen Belastung der CPU führen, denn im
  Parallelbetrieb mit anderen Projekten kann es zu enormen Laufzeiten
  beim Build-Prozess kommen.
\end{itemize}

Ein Beispiel dieser Problematik unter der Nutzung von Quarkus ist in
x(xxx intenetquelle)

xx zu finden:

Quarkus ist ein neues für Webentwicklung geeignetes Java Framework (APIs
und Microservices) und verspricht ein „Native Compiling`` von Java Code.
Mit diesem Framework können also sehr performante Aps mit einem
minimalen Bedarf an RAM erstellt werden.

Ein Build-Prozess unter Quarkus ist entsprechend aufwendig. Auf einem
Entwicklungs-PC lasst sich ein Build-Prozess in etwa 5 bis 10 Minuten
abbilden, während er auf einem CI/CD System mit einer etwas älteren
Hardware bis zu eineinhalb Stunden dauern kann

\textbf{B02 erschöpfte Speicherkapazität des CI/CD System}

Der Betrieb eines CI / CD Systems kann auch in Bezug auf Speicherplatz
zu Engpässen führen. Für jede kleineste Codeänderung wird das ganze Set
von Artefakten generiert und abgespeichert. Dazu gehören der z.B. der
Code, die Testprotokolle, Reports zur Codeanalyse, Compilerlogs, die
Software selbst und ihr Containerimage.

\begin{itemize}
\item
  Manuelles Eingreifen in die Speicherung der Artefakte wird notwendig
  und ist zudem fehleranfällig.
\end{itemize}

Über ein CI/CD System der Telekom wurden entsprechende Probleme
geschildert: Es entstehen sehr schnell sehr viele Daten und die
Speichermedien laufen voll, da kontinuierlich bei jeder Änderung alles
an Artefakten abgelegt wird.

Kollege xxx --

\textbf{B03 - fehlende Möglichkeit zum kontrolliertem Stopp der
Pipeline}

Sobald eine gewisse Kette von Prozessen angestoßen ist, kann sie nicht
mehr unterbrochen werden und auf den konsistenten Zustand zuvor
zurückgesetzt werden.

\begin{itemize}
\item
  Lange Wartezeiten für eine nicht mehr benötigte Pipelineausführung
\end{itemize}

Kapitel Probleme durch Unkenntnis über Tool und Methode

\textbf{B04 -- ungewolltes Aktivieren der Pipeline durch unbewusste
Nutzung des Masterbranch}

Wird versehentlich direkt auf dem Masterbranch gearbeitet und diese
Änderung im Source Code Managementsystem freigegeben, kann es zur
Ausführung der Release-Pipeline kommen und die Softwareversion wird
unbeabsichtigt ausgeliefert.

\begin{itemize}
\item
  xxxIm Falle von Konflkten geht code verlorenxx
\item
  Nicht gewünschter Code befindet sich in Produktion
\end{itemize}

\begin{quote}
\url{https://code.i-harness.com/de/q/6d10a0}
\end{quote}

Dieses Problem wurde bereits in der Einleitung angerissen. Um hier eine
konkrete Lösungsmöglichkeit zu erarbeiten, erfolgt eine weitere Analyse
innerhalb einer konkreten Systemumgebung.

Das versehentliche Arbeiten auf dem Masterbranch ist zunächst ein
typisches Problem im GitObs (xx) Umfeld. In einem CI/CD Umfeld hat es
noch viel weitreichendere Folgen, denn durch die durchgängige
Automatisierung besteht das Problem nicht nur aus der ungewollten
Branchüberschreibung -- es weitet sich bis in die Produktion aus.

Hierzu die Darstellung dieses Falls am einem Beispiel unter Gitobs(xx):
Mit Hilfe des Versionsmanagementsystem Git besteht die Möglichkeit, dass
jeder Entwickler in seinem eigenen „Featurebranch`` an seinem Code
weiterentwickelt. Dieser Code wird später im Masterbranch
zusammengeführt, um die Codeänderung dem Programm zuzuführen.

Wenn der Entwickler unbewusst anstelle eines persönlichen Featurebranch
den Masterbranch für diese Entwicklung nutzt, wird er im weiteren
Verlauf ein Push-Kommando nutzen (da er davon ausgeht, im Featurebranch
zu arbeiten), um seine Änderungen in einer separaten Testumgebung zu
validieren.

In diesem Fall wird die Push-Operation jedoch nicht auf dem
Featurebranch, sondern auf dem Masterbranch ausgeführt. Anstelle eine
temporäre Testversion zu erhalten, bewirkt der Push auf dem Masterbranch
die Ausführung von CI/CD für ein Release.

Das bedeutet den Start der Releasepipeline, die Codeänderung landet als
neues Softwarerelease im Produktionssystem und nicht, wie gewünscht, in
einer Testumgebung.

In diesem Fall wäre die Notwendigkeit eines kontrollierten Stopps einer
Pipeline von Relevanz. Würde der Entwickler noch während der Ausführung
der Releasepipeline die Situation erkennen -- wäre dieser „Notstopp``
eine Möglichkeit, das Deployment noch zu verhindern.

(siehe \ref{B03} \nameref{B03})

\textbf{B05 -- unbewusste Einbindung von Software, welche durch
Löschungsroutinen nicht permanent zur Verfügung steht}

Häufig gibt es Richtlinien, welche die Löschung von Artefakten einer
Software nach einem vorgegebenen Zeitraum veranlassen, solange sie
keinem offiziellem Release zugeordnet sind. Bei Unkenntnis über eine
solche Richtlinie kann der Zugriff auf die Version der Software durch
diese Löschung verloren gehen.

\begin{itemize}
\item
  Programmabbruch
\end{itemize}

\textbf{B06 -- unzureichende Tests - Nutzung des CI/CD Systems}

Die statische Codeanalyse erwartet den Source Code in einem spezifischen
Ordner. Unkenntnis über diese Vorgabe kann dazu führen, dass der Source
Code in einem anderen Verzeichnis bereitgestellt wird, Das
Codeanalysetool findet im spezifizierten Verzeichnis keinen Code -
manche Tools melden einen positiven Status und der CI/CD Prozess läuft
weiter.

\begin{itemize}
\item
  Ungetesteter Code befindet sich in Produktion
\end{itemize}

\textbf{B07 -- Modultest nur auf Codeabdeckung ausgelegt}

Unkenntnis über Test/ und Tool (Automatisierungs- und
Produktionsrelevanz) Tests durchlaufen alle Codezeilen, ohne die
Funktion zu testen -- Smoketestsxx erklären

Werden Tests nicht tief genug in Bezug auf die Funktionalität
formuliert, kann es zwar sein, dass sie so verfasst sind, dass jede
Zeile des Codes durchlaufen wird, sie dennoch nichts darüber aussagen,
wie funktionsfähig das Modul oder Gesamtsystem ist.

Der Code passiert den Smoktests mit einer positiven Statusmeldung, aber
die Funktion des Moduls /Gesamtsystem ist nicht gewährleistet.

\begin{itemize}
\item
  Funktional ungetesteter Code befindet sich in Produktion
\end{itemize}

\textbf{B08 -- Fehleranfälligkeit bei Migrationen für
Datenbankänderungen}

Häufig geht mit Änderungen im Code auch eine Datenbankmigration einher.
Das automatisierte Deployment muss in der richtigen Reihenfolge
ausgeführt werden: Der Codemigration, muss der Systemstopp folgen
\ldots{} dann sytyotm startxx

\begin{itemize}
\item
  Probleme im Deployment-Vorgang
\end{itemize}
