Konzepte und Werkzeuge, die die Entwicklung und das Management von automatisierten Prozessen erheblich erleichtern

Der korrekte Ablauf automatisierter digitaler Prozesse ist für viele Unternehmen enorm wichtig. Gerade bei kritischen Anwendungen können Fehler schnell dramatische Konsequenzen haben und sollten daher auf jeden Fall vermieden werden. Allerdings kann ein starker Fokus auf Sicherheit auch dazu führen, dass keine Weiterentwicklung an produktiven Prozessen mehr stattfindet und an bestehenden, aber veralteten Strukturen festgehalten wird, obwohl bessere Alternativen verfügbar wären. Daher ist es wichtig, einen Mittelweg zu finden, der es erlaubt, beide Aspekte zu berücksichtigen. 

Überführung des Prozesses in Code

Der erste Schritt in der Kette hin zur vollständigen Prozessautomatisierung ist die Überführung des Prozesses in (maschinenlesbaren) Code. Dies ist oft Aufgabe der Entwickler, welche die individuellen Prozessanforderungen in Code übersetzen. Das Endresultat kann dann z.B. ein Skript sein, welches jeden Tag eine bestimmte Aufgabe ausführen soll. Oder eine Software, welche eine bestehende App um neue Funktionalitäten erweitert.

Unabhängig von der tatsächlichen Struktur des zugrundeliegenden Codes, soll die darauf aufbauende Automatisierung mehrere Ziele verfolgen. Zum einen soll die Bereitstellung nur minimale oder keine menschlichen Eingriffe erfordern. Zum anderen soll der Prozess möglichst fehlerfrei und wartungsarm ablaufen, und dies oft über längere Zeiträume. Und sollen Änderungen in bestehende Prozesse integriert werden, so soll dies auf möglichst sichere Art und Weise geschehen.

Dabei ist gerade die Fehleranfälligkeit ein kniffliger Punkt. Fast immer existiert der entwickelte Code nicht in einem isolierten Zustand, sondern benötigt einen ganzen Kosmos aus anderen Programmen und Abhängigkeiten, um wie geplant zu funktionieren. Eine Änderung oder ein Update in einer dieser Abhängigkeiten kann dann schnell zu unvorhergesehenen Netzwerkeffekten führen und den laufenden Prozess lahmlegen.

Flexibilität durch Container

Um dies zu verhindern, empfiehlt sich die Überführung des Codes in einen sogenannten Container. Unter einem Container kann man sich eine isolierte Umgebung für den zugrundeliegenden Code vorstellen, welche alle notwendigen Programmabhängigkeiten in einer fest definierten Form enthält. Ein Container ist wie ein eingefrorenes Standbild – solange keine Anpassungen vorgenommen werden, bleibt der Containerinhalt unverändert und somit kann der darin enthaltene Prozess in identischer Form immer wieder erneut durchgeführt werden.

Dadurch, dass ein Container alle notwendigen Abhängigkeiten bereits enthält, bieten sich noch weitere Vorteile bezüglich Skalierbarkeit und Verfügbarkeit. So kann bei Scheitern eines laufenden Prozesses oder bei einem Anstieg in der Auslastung, schnell ein neuer Container bereitgestellt werden, ohne langwierige Installations- oder Konfigurationsprozesse durchlaufen zu müssen. Damit kann unverzüglich auf Änderungen in den Prozessanforderungen reagiert werden.

Ein weiterer Vorteil von Containern besteht darin, dass sich komplexe Anwendungen modularisieren lassen. So müssen z.B. die einzelnen Bestandteile einer App nicht in einer gemeinsamen Programmumgebung untergebracht, sondern können in separaten Containern verwaltet werden. Dadurch können die einzelnen Bestandteile auch unabhängig voneinander weiterentwickelt werden. Braucht z.B. eine Komponente eine neuere Version eines Programms, so reicht es, den entsprechenden Container anzupassen. Die restlichen Komponenten können in ihren jeweiligen Einstellungen verbleiben. Dadurch werden mögliche Auswirkungen auf andere Module minimiert.

Automatisiertes Testen für einen reibungslosen Produktivbetrieb

Gerade bei komplexen Anwendungen wie einer modularen App ist es wichtig, dass die Komponenten auch nach einem Update einzelner Bestandteile weiterhin korrekt zusammenarbeiten. Aus diesem Grund gibt es oft eine Testumgebung, in welcher die Änderungen getestet werden können, bevor sie in das tatsächliche Produkt eingebaut werden. Dies soll verhindern, dass unabsichtliche Fehler den produktiven Betrieb stören.

Auch das Testen und Überführen lässt sich automatisieren. Dies geschieht mittels Pipelines, in welchen einzelne Schritte (z.B. Tests) ausgeführt werden können. So kann spezifiziert werden, dass ein neuer Container erst live geschaltet wird, wenn alle zugehörigen Tests erfolgreich durchgeführt worden sind. Sollte ein Test scheitern, wird die Pipeline gestoppt und der Entwickler erhält die Möglichkeit, den Fehler zu beheben, ohne dass dieser den produktiven Betrieb stört. Dieser Prozessablauf wird auch als Continuous Integration/Continuous Delivery (CI/CD) bezeichnet.

Viele Entwicklungsplattformen wie z.B. Github oder Bitbucket bieten die Möglichkeit, den gesamten CI/CD-Prozess durchzuführen und zu automatisieren. Oftmals genügt es dann, dass ein Entwickler eine neue Version seines Codes hochlädt. Dieser wird dann automatisch in einen Container überführt, welcher getestet und anschließend direkt ausgeliefert werden kann. Viele dieser Entwicklungsplattformen bieten auch die Möglichkeit, den entsprechenden Container direkt zu einem Cloudanbieter wie z.B. AWS oder Microsoft Azure zu deployen, wo dieser direkt in den produktiven Betrieb integriert werden kann.

Obwohl das Aufsetzen der gesamten Pipeline natürlich einen zusätzlichen Mehraufwand erfordert, machen sich die Vorteile schnell bezahlt. Durch die Containerisierung und die Automatisierung des Testprozesses, wird die Fehleranfälligkeit reduziert und die automatische Bereitstellung sorgt für eine direkte Integration der neuesten Anpassungen in bestehende Anwendungen. Werden dazu noch zusätzliche Prozessorchestrierungstool wie z.B. Kubernetes oder Apache Airflow eingesetzt, kann auch das Management und die Überwachung automatisiert werden und somit die Verfügbarkeit und die Robustheit des laufenden Prozesses erhöht werden.

Fazit

Der containerisierte CI/CD-Prozess bietet einen enormen Mehrwert für die Entwicklung und Bereitstellung eigener Anwendungen. Er reduziert nicht nur die Fehleranfälligkeit, sondern sorgt auch für ein agiles und flexibles Weiterentwickeln bestehender Anwendungen. Im besten Fall kann der Entwickler dann durch einen einzigen Klick seine neuesten Anpassungen in den produktiven Betrieb überführen und die gewonnene Zeit dafür nutzen, an weiteren Innovationen zu arbeiten.

Sie wollen sich gerne über weitere spannende Themen mit uns austauschen? Dann kontaktieren Sie uns gerne unverbindlich! 

Was können wir für Sie tun?

Veröffentlich am 25.1.2022

Thema: cloud, AWS, Data Mesh, Datenplattform, API, Container, Infrastruktur