Cloud Native: Wiederverwendbare CI/CD-Pipelines mit GitLab

In vielen Organisationen entwickeln Softwareteams ihre eigenen CI/CD-Pipelines, um wiederkehrende Aufgaben wie Code-Auschecken, Testing, Scanning, Build und Deployment zu bewältigen. Diese individuelle Vorgehensweise führt oft zu einem unnötigen Mehraufwand bei Konfiguration und Wartung, was Zeit kostet, die besser in die Entwicklung neuer Features investiert wäre. Obwohl die Aufgaben und Workflows zwischen den Teams ähnlich sind, erfindet jedes Team das Rad neu, anstatt von bereits existierenden Lösungen zu profitieren. Diese Praxis kann die Release-Zyklen verlängern und die Effizienz der Teams beeinträchtigen.
Anzeige
Kolumne Cloud Native: Dennis Sobczak Als Senior Software Ingenieur bei adesso SE hat Dennis neben seinen Kernthemen Softwarearchitektur und -Entwicklung auch langjährige Erfahrung mit DevSecOps. Skalierbare und robuste Anwendungen zu erstellen, stehen für Dennis im Vordergrund.
Um diesen Herausforderungen zu begegnen, wäre es sinnvoll, unternehmensweite Standards für CI/CD-Pipelines zu etablieren. Dies könnte durch die Bereitstellung wiederverwendbarer Standard-Bausteine wie Job-Templates und GitLab Components geschehen, die zentral katalogisiert, dokumentiert und teamübergreifend bekannt gemacht werden. Solche Module sollten generisch und flexibel sein, um von verschiedenen Teams leicht eingebaut, ausgetauscht oder erweitert werden zu können, ohne komplexe Abhängigkeiten oder eine Vielzahl von Parametern. Ein unternehmensweiter Standard würde die Effizienz steigern und sicherstellen, dass alle Teams auf bewährte und stabile Lösungen zurückgreifen können, was letztlich die Entwicklung beschleunigt und die Qualität der Software erhöht.
Der erste Ansatz und Voraussetzungen
Im ersten Schritt gilt es, die eingesetzten Technologien – Programmiersprache, resultierende Artefakte, Konfigurationsdateien – zu erfassen und notwendige Steps für die CI/CD-Pipelines, Kontexte sowie die Kontext-Grenzen der Steps vollständig zu definieren.
Den nachfolgenden Szenarien liegt beispielhaft eine Java-Anwendung zugrunde, die in Form eines Maven-Projekts in einem GitLab-Repository vorliegt. Der Technologie-Stack umfasst daher: Java, Maven, Docker und GitLab als CI/CD-System. Der Java-Sourcecode soll zunächst ausgecheckt, getestet (Unit-Tests) und im Anschluss kompiliert werden, also die Stages "test" und "build" durchlaufen.
Die Verzeichnisstruktur der Anwendung:
Anzeige
app/ .mvn/wrapper src # Java Sourcecode der Anwendung .gitignore mvnw # Maven Wrapper pom.xml
Der "naive" Ansatz
Bevor die beiden GitLab-Konzepte Job Templates und GitLab Components zum Einsatz kommen, soll zunächst eine "naive" Test- und Build-Pipeline die Vorgehensweise veranschaulichen.
Zum Ausführen der Unit-Tests kommt das Maven CLI Tool mit dem Kommando mvn test zum Einsatz. Der Befehl mvn package löst den Build der Anwendung aus. Beide Steps setzen ein Docker Container Image voraus, in dem das Maven CLI Tool enthalten und verwendbar ist – sofern sich die Wrapper-Datei mvnw nicht im Repository der Anwendung befindet. Ansonsten wäre statt mvn das Skript ./mvnw mit gleichnamigen Parametern auszuführen.
Das Dockerfile ist wie folgt definiert:
# syntax=docker/dockerfile:1 MAINTAINER