2.5.1 Gitlab CI

Continuous Integration (CI)

Was ist Continuous integration, kurz CI oder auch schlicht Pipelines genannt? Stell dir vor, du arbeitest mit drei Freunden an einer Hausarbeit in einem gemeinsamen Dokument. Wenn jeder einfach wild losschreibt, ohne zu schauen, was die anderen machen, gibt es am Ende Chaos und doppelte Sätze. Um diesen Problemen vorzubeugen, entwickeln wir nach dem Continuous Integration Prinzip. Dies bedeutet vereinfacht gesagt folgendes:

  • Alle Änderungen am Programmcode werden laufend auf den zentralen Git Server hochgeladen. Bei uns bei Puzzle wird dazu GitLab verwendet.
  • Das System prüft anschliessend ob die Änderungen etwas kaputt machen oder die Applikation weiterhin wie gewünscht funktioniert. Dazu verwenden wir GitLab CI.

GitLab CI

Wir bei Puzzle setzen hauptsächlich GitLab CI für unsere Projekte ein. GitLab CI ist ein sehr mächtiges Tool, um Buildprozesse zu automatisieren. Es sei die Introduction von GitLab empfohlen, welche die Grundkonzepte und den Workflow gut erklärt.

In sehr vielen Puzzle Git Repositories ist eine Datei mit dem Namen .gitlab-ci.yml anzutreffen. Diese Datei steuert die Pipeline und wird nach jeder Code Änderungen auf dem Git Server automatisch ausgeführt.

1
2
3
4
5
6
7
8
9
stages:
  - test

my_first_ci_pipeline:
  stage: test
  tags:
    - small
  script:
    - echo "Hello World"

GitLab Components

Für einige der häufigsten Anwendungsfälle welche in einer CI Pipeline vorkommen, bieten wir sogenannte GitLab Components an. Diese Components können über unterschiedliche Projekte hinweg wiederverwendet werden, damit die Logik einer Pipeline nicht jedes Mal neu geschrieben werden muss.

Alle verfügbaren Komponenten welche angeboten werden, können über den CI/CD Katalog in GitLab eingesehen werden.

Hier sieht ihr eine Verwendung der docker Komponente welche dazu benutzt wird, Docker Images zu bauen.

1
2
3
4
5
6
include:
  - component: gitlab.puzzle.ch/pitc_platform/gitlab/components/docker@v0.2.1
    inputs:
      dockerfile: tests/Dockerfile
      context-folder: tests/
      build-args: "text=ephemeral"

Um sich ein Bild von einer “richtigen” Pipeline zu machen, ist z.B. diejenige im ansible-puzzle Repository ein gutes, wenn auch relativ ausführliches Beispiel.

Baue deine eigene CI Pipeline

Starten wir gleich mit deiner ersten CI Pipeline.

Voraussetzungen

  • git installiert
  • GitLab Zugang
  • Editor installiert
  • Etwas Zeit und Geduld

Git Repo aufsetzen

Für dieses Lab werden wir das Puzzle interne GitLab. Als erstes musst du ein eigenes Git Repository aufsetzten. Dazu kannst du diesen Link aufrufen und ein neues Project erstellen. Achte darauf, dass das Projekt in deinem Persönlichen GitLab Projekt angelegt wird (in diesem Beispiel ist es cschlatter). Den Projekt Namen darfst du selbst wählen, wir haben in unserem Beispiel my-pipeline verwendet.

  • Visibility Level: Internal
  • Project Configuration: ☑️ Initialize repository with a README

Anschliessend auf Create Project klicken, danach ist dein Repository erstellt.

alt text

CI Pipeline konfigurieren (Teil 1)

Nun ist dein Projekt soweit bereit damit du die erste CI Pipeline selbst implementieren kannst. Wie bereits oben erwähnt, wird die ganze Pipeline über das sogenannte .gitlab-ci.yml gesteuert.

Lege als Erstes die Datei in deinem Root Verzeichnis an. Anschliessend kannst du darin den ersten Job definieren.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12

#Stage definition
stages:
  - test
  - build

#Job definition
my-first-job:
  stage: test
  image: harbor-auth-proxy.puzzle.ch/pitc-cicd-public/alpine-base:latest
  script:
    - echo "This is my first job in the test stage."

Nun müssen wir die Änderungen noch in das zentrale Git bringen. Dazu commiten und pushen wir die Änderungen mit folgendem Befehl:

1
2
3
git add .
git commit -m "add my first GitLab CI pipeline"
git push

Anschliessend kannst du im Browser auf GitLab navigieren, und dort unter deinem Projekte auf Pipelines klicken. In dieser Ansicht siehst du alle ausgeführten Pipelines von deinem Projekt inklusive ihrem Status. Wenn alles funktioniert hat, sieht du den Status ✅ Passed

alt text

Anschliessend kannst du einen Eintrag Stages (wie im Bild) klicken, danach öffnet sich ein Popup mit allen Jobs die in dieser Stage liefen.

Ein weiterer klick auf den Namen des Jobs my-first-job (Oder Alternativ über das Menü -> Build -> Jobs und danach den Job auswählen) kannst du alle Details inklusive der Log ausgabe des Jobs anschauen. Dies sieht dann so aus:

alt text

Wir können hier diverse Infos sehen über den Job, zum Beispiel wie lange er gedauert hat, wann er ausgeführt wurde, und natürlich auch was ausgeführt wurde. Wir können auf dem Bild auch die Ausgabe unseres echo Befehls auf Zeile 26 erkennen: This is my first Job in the test stage

CI Pipeline konfigurieren (Teil 2)

Natürlich ist so eine Pipeline zu viel mehr fähig als nur ein paar Linux commands auszuführen. Als nächstes wollen wir einen weiteren Job definieren welcher ein Python Script ausführt.

Lass uns zuerst das Script erstellen. Dazu erstellst du eine neue Datei mit dem Namen main.py und folgendem Inhalt:

1
2
3
import cowsay

cowsay.cow('Hello Puzzle')

Als nächstes müssen wir unsere Pipeline mit einem neuen Job erweitern. Dazu definieren wir in diesem Job mit dem Keyword image ein Image, welches die Ausführung von Python Scripts ermöglicht. Der Script Block besteht aus zwei Befehlen:

  • pip install ... Damit installieren wir alle Abhängigkeiten die unser Script benötigt
  • python main.py Wir weisen Python an, unser Script auszuführen

Füge folgenden Code an das Ende des .gitlab-ci.yml

1
2
3
4
5
6
my-first-python-job:
  stage: build
  image: harbor-auth-proxy.puzzle.ch/docker.io/library/python:3.12-alpine
  script:
    - pip install cowsay
    - python main.py

Anschliessend Commite und Pushe die Änderungen erneut mit folgendem Befehl:

1
2
3
git add .
git commit -m "add my first Python based GitLab CI pipeline"
git push

Anschliessend kannst du wieder in die Pipeline Übersicht wechseln.

alt text

Nun solltest du bei der neusten Pipeline zwei verschiedene Stages sehen, einmal die test und einmal die build stage. Wenn du auf die Build Stage klickst, kannst du zur Ausgabe des my-first-python-job wechseln.

Am Ende des Logs solltest du anschliessend folgende Ausgabe sehen:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
$ python main.py
  ___________
| Hello World |
  ===========
           \
            \
              ^__^
              (oo)\_______
              (__)\       )\/\
                  ||----w |
                  ||     ||
Zuletzt geändert May 12, 2026: Add gitlab ci section (1171243)