Blog-Serie CI/CD: Gitlab CI

In unserem ersten Artikel haben wir einen Überblick über das Thema Continuous Integration & Continuous Deployment (CI/CD) gegeben.

In den nachfolgenden Artikeln wollen wir gängige Tools im Detail vorstellen und konkrete Handlungsempfehlungen geben.

Was ist Gitlab CI?

GitLab CI ist ein Teil des GitLab-Ökosystems, das dem Entwickler Tools zur Automatisierung in der Softwareentwicklung bietet. Es ermöglicht Entwicklern Code-Änderungen kontinuierlich zu integrieren, zu testen, und automatisiert bereitzustellen. Dies  erhöht die Software-Qualität, steigert die Effizienz und verkürzt die Auslieferung von neuen Features.

Funktionsweise von Gitlab CI

Gitlab CI lässt sich grob in 3 Teilbereiche unterteilen:
Definition (Pipelines, Jobs, Stages)
Laufzeitumgebung – Gitlab Runner
Konfiguration

 

Definition (Pipelines, Jobs, Stages)

Gitlab CI arbeitet mit einer Pipeline-basierten Struktur, die es ermöglicht, den Entwicklungsprozess in einzelne, in sich gekapselte und aufeinanderfolgende Schritte zu unterteilen. Diese Schritte werden als sog. „Jobs“ bezeichnet und in „Stages“ zusammengefasst. Eine Pipeline beschreibt alle im Entwicklungsprozess beteiligten Aufgaben für ein Projekt, vom Build über den Test hin zur Bereitstellung.

Job: Ein Job kann das kompilieren, testen oder ausbringen (deployen) von Code sein. Jobs laufen unabhängig voneinander und werden von sog. Runnern ausgeführt.

Stages: Stages sind Gruppen von Jobs. Stages werden sequentiell nacheinander ausgeführt, wobei Jobs  innerhalb einer Stage parallel ausgeführt werden. Alle Jobs innerhalb müssen erfolgreich ausgeführt werden, damit die nächste Stage in einer Pipeline ausgeführt wird – ist dies nicht der Fall – bricht die Pipeline vorzeitig ab.

Laufzeitumgebung – Gitlab Runner

Die Ausführung von Pipeline Jobs erfolgt durch sog. „Runner“. Ein Gitlab Runner ist eine eigenständige Applikation, die in der Pipeline definierte Jobs ausführt.

Runner können auf unterschiedlichen Umgebungen ausgeführt werden – hierzu gehören:

  • Virtuelle Maschinen
  • Docker Container
  • Kubernetes Pod

Folgende Typen von Runnern werden unterschieden:

  • Shared Runners: Von Gitlab verwaltete Runner – stehen allen Projekten innerhalb einer Gitlab Instanz zur Verfügung
  • Specific Runners: Individuell konfigurierte Runner für bestimmte Projekte oder Benutzergruppen

Projektbasierte Konfiguration (.gitlab-ci.yml)

Die Konfiguration einer Gitlab CI Pipeline erfolgt über eine YAML Datei (.gitlab-ci.yml) im Root-Verzeichnis des Projektes.
In der Datei werden alle zur Pipeline gehörigen Jobs & Stages definiert – einschließlich der relevanten auszuführenden Skripte in unterschiedlichen Skript- & Programmiersprachen (Bsp. Bash, perl, GO, python). Neben der Definition von Abhängigkeiten und Bedingungen lassen sich auch Umgebungsvariablen, Benachrichtigungen sowie die relevanten Zielumgebungen (DEV, QA, INT, PROD) definieren.

Beispiel einer Gitlab Pipeline – Code:

Beispiel einer Gitlab Pipeline – Grafische Darstellung:

Beispiel einer Gitlab CI Pipeline

Vorteile der Gitlab CI

  • Integration in Gitlab: Gitlab CI ist nahtlos in die Gitlab-Plattform rund um Code-Verwaltung, Issue-Tracking und Security & Compliance integriert
  • Automatisierung: Gitlab CI ermöglicht eine hohe Automatisierung von Software Entwicklungsprozessen – dies reduziert die Fehleranfälligkeit und den manuellen Aufwand im Projekt
  • Qualität: Durch die Automatisierung von manuellen Tätigkeiten wird sichergestellt, das Abläufe im Prozess immer gleich ausgeführt werden – dies erhöht die Lösungsqualität maßgeblich

Nachteile der Gitlab CI

  • Komplexität: Die große Flexibilität der Lösung kann zu komplexen Konfigurationen führen, die schwer zu verwalten oder zu debuggen sind
  • Kosten: Für umfangreiche Nutzung oder spezielle Funktionen können zusätzliche Kosten (Hardware, Wartung, etc.) entstehen
  • Vendor Lock-In: Eine starke Abhängigkeit von Gitlab kann den Wechsel zu einer anderen CI/CD Lösung erschweren

Fazit

Gitlab CI ist ein mächtiges Werkzeug zur automatisierten Integration, Test und Ausbringung (Deployment) von Software-Artefakten. Entwickler erhalten die Möglichkeit, komplexe Entwicklungsabläufe zu strukturieren und zu automatisieren. Hierdurch wird sowohl die Effizienz als auch die Qualität der Software-Artefakte gesteigert – dies ermöglicht kürzere Release-Zyklen zur Freigabe neuer Funktionen an den Endandwender.

Gitlab CI ist somit ein zentrales Tool für moderne Software- & DevOps Teams um kontinuierlicher und in hoher Qualität Software auszubringen.

Inwieweit sich Gitlab CI von Github Actions unterscheidet – erfahren Sie in unserem nächsten Artikel der CI/CD Blogserie.