- 1 Section
- 10 Lessons
- unbegrenzt
- CI/CD, Automatisierung & IaC10
- 1.1Was ist CI/CD?
- 1.2CI/CD-Pipeline aufbauen: Phasen und Stages
- 1.3GitHub Actions: Workflows und YAML
- 1.4GitLab CI/CD: Pipelines und Jobs
- 1.5Jenkins: Grundlagen und Jenkinsfile
- 1.6Automatisiertes Testen in der Pipeline
- 1.7Ansible: Playbooks und Inventory
- 1.8Terraform: Infrastructure as Code
- 1.9Monitoring der Pipeline
- 1.10Aufgaben CI/CD
GitLab CI/CD: Pipelines und Jobs
GitLab CI/CD ist neben GitHub Actions die zweite große CI-Plattform am Markt. Während GitHub Actions oft bei Open-Source-Projekten und kleineren Teams glänzt, ist GitLab das DevOps-Schwergewicht für Enterprise und Self-Hosting. Es bietet eine alles-in-einem-Lösung: Git-Repo, CI/CD, Container-Registry, Issue-Tracking, Wiki – alles aus einer Hand.
Diese Lektion zeigt dir den GitLab-CI-Workflow mit der Datei .gitlab-ci.yml: Stages, Jobs, Variables, Rules, Artifacts, Cache, GitLab Runner. Wenn du L3 GitHub Actions kannst, wirst du viele Parallelen sehen – die Konzepte sind ähnlich, die Syntax leicht anders.
1) Was unterscheidet GitLab von GitHub?
Beide Plattformen sind sich auf den ersten Blick sehr ähnlich. Aber es gibt strukturelle Unterschiede, die GitLab gerade für Unternehmen attraktiv machen:
.github/workflows/*.yml ✓.gitlab-ci.yml ✓2) Die zentrale Datei: .gitlab-ci.yml
Während GitHub mehrere Workflow-Files erlaubt, hat GitLab eine zentrale Datei: .gitlab-ci.yml im Repo-Wurzelverzeichnis. Das ist Konvention – über include: kannst du sie in Module aufteilen.
Beachte zwei wichtige Unterschiede zu GitHub Actions:
image:: GitLab definiert standardmäßig in welchem Docker-Image der Job läuft (z.B.node:20-alpine). Bei GitHub stehtruns-on: ubuntu-latest– ohne Container-Konzept- Job-Name als Top-Level:
build-frontend:ist gleichzeitig der Job-Name UND der Schlüssel. In GitHub gibt'sjobs.build-frontendals verschachtelte Struktur
3) Stages und Jobs visualisiert
So sieht eine typische GitLab-Pipeline im UI aus. Stages als Spalten, Jobs als Boxen darin:
4) GitLab Runner: das ausführende Element
Wie GitHub Actions braucht GitLab CI/CD Runner – Server die die Jobs ausführen. Es gibt drei Arten:
gitlab-runner registriert. Es gibt verschiedene Executor: Shell, Docker (am häufigsten), Kubernetes, VirtualBox. Mit Docker-Executor läuft jeder Job in einem frischen Container – isoliert und reproduzierbar.5) Variablen: lokal, global, secret
Variablen können auf verschiedenen Ebenen definiert werden – mit klarer Priorität. Job-spezifische überschreiben globale, und Secrets aus der GitLab-UI haben höchste Priorität:
Zusätzlich gibt's Secret-Variablen im GitLab-UI unter Settings → CI/CD → Variables. Hier hinterlegst du API-Tokens, Passwörter usw. – sie tauchen niemals in Logs auf und sind im Klartext nicht abrufbar. Praktisch: man kann sie als „Protected" markieren – dann nur in Pipelines von protected branches verfügbar. „Masked" bewirkt zusätzlich, dass die Variable in Logs durch [MASKED] ersetzt wird.
6) Rules: wann läuft welcher Job?
Historisch nutzte GitLab only: und except: für Filter. Heute ist rules: empfohlen – mächtiger und ausdrucksstärker:
when: manual braucht Mensch-Klick. when: never = Job läuft nicht. Reihenfolge der Rules ist wichtig – erste matchende gewinnt.7) Artifacts und Cache: was bleibt zwischen Jobs?
Zwei Konzepte zum Datenfluss zwischen Jobs, die oft verwechselt werden. Wichtig den Unterschied zu kennen, sonst funktioniert die Pipeline nicht wie erwartet:
| Konzept | Zweck | Lebensdauer |
|---|---|---|
| Artifacts | Build-Output (JAR, dist/, Reports) für nachfolgende Stages | Standard 30 Tage |
| Cache | Dependencies (node_modules, .m2/) für nachfolgende Pipelines | Persistent, bis manuell geleert |
Faustregel: Artifacts sind „Output von diesem Job", Cache ist „Material das ich beim nächsten Mal wieder brauche". Bei artifacts:reports: kann GitLab spezielle Reports auswerten (Test-Coverage, JUnit, Container-Scanning) und im UI integrieren.
8) Includes und Templates: Wiederverwendung
Statt eine 500-Zeilen-yml-Datei zu pflegen, kannst du sie aufteilen mit include:. Das ist eines der Features, das in der Praxis viel Zeit spart und Wartung erleichtert:
Templates sind besonders wertvoll: GitLab liefert vorgefertigte Templates für Security-Scans (SAST, DAST, Dependency-Scanning), Code-Quality, License-Compliance. Mit einer Zeile include: template: ... aktivierst du komplexe Funktionalität.
9) Environments und Auto DevOps
GitLab hat ein eingebautes Konzept für Environments – mehr als nur Stage-Namen. Environments sind eigenständige Entitäten mit Deploy-History, URL und Rollback-Möglichkeit:
GitLab zeigt dann in der Web-UI ein Dashboard mit allen Environments, der aktuell deployten Version, Deploy-Historie und Rollback-Button. Sehr nützlich für Operations-Teams. Mehr zu Deployment-Strategien in K56.
Auto DevOps ist eine GitLab-Spezialität: mit einem Klick aktivierst du eine vorgefertigte Pipeline, die dein Projekt automatisch baut, testet, scannt und auf Kubernetes deployt – ohne dass du ein einziges YAML schreiben musst. GitLab erkennt den Projekt-Typ (Node, Java, Python, etc.), baut ein Docker-Image, läuft Tests, macht Security-Scans und deployed auf einen konfigurierten Cluster. Für 80% der Projekte funktioniert das ohne Anpassung.
10) Vordefinierte CI/CD-Variablen
GitLab stellt viele vordefinierte Variablen bereit, die in Pipelines unschätzbar wertvoll sind. Hier die wichtigsten, die du oft brauchen wirst:
| Variable | Inhalt |
|---|---|
$CI_COMMIT_SHA | Vollständige Git-Commit-SHA |
$CI_COMMIT_SHORT_SHA | Kurze Commit-SHA (8 Zeichen) – für Image-Tags |
$CI_COMMIT_BRANCH | Branch-Name (nur bei branch-Push verfügbar) |
$CI_COMMIT_TAG | Tag-Name (nur bei Tag-Push verfügbar) |
$CI_COMMIT_REF_NAME | Branch- oder Tag-Name (immer verfügbar) |
$CI_COMMIT_REF_SLUG | Sanitisierte Version (für URLs/Cache-Keys) |
$CI_PIPELINE_ID | Eindeutige Pipeline-ID |
$CI_PROJECT_NAME | Name des aktuellen Projekts |
$CI_REGISTRY_IMAGE | URL zum Container-Registry-Repository |
$CI_JOB_TOKEN | Token zum Authentifizieren gegen GitLab API |
Typisches Beispiel-Nutzung: Docker-Image taggen mit Commit-SHA:
11) Komplettes Beispiel
Zum Abschluss eine realistische Pipeline mit allen wichtigen Konzepten – Build, Test, Docker-Image, Deploy auf zwei Umgebungen:
Diese Pipeline deckt vier Stages ab: Build mit Cache, Test mit Coverage-Extraction, Docker-Image-Build mit Docker-in-Docker, Deploy auf Staging automatisch bei main-Push, Deploy auf Production manuell bei Tag. Realistisch für ein mittleres Web-Projekt.
12) Praktische Tipps
Aus der Praxis: kleine Tricks die viel Zeit sparen können:
- CI Lint-Tool: GitLab hat unter Build → Pipeline Editor einen Live-Validator. Tippfehler sofort erkennen.
before_script: Code der vor jedem Job läuft (auf Job- oder globaler Ebene). Spart Duplikation.- YAML Anchors (
&und*): für sich wiederholende Konfiguration – pure YAML-Feature, sehr mächtig. - Manual Approvals mit
when: manual: Mensch entscheidet bevor heikle Aktionen laufen - Allow Failure:
allow_failure: truefür Jobs deren Fehlschlag nicht die Pipeline brechen soll (Linting, Optional-Features) - Trigger: ein Job kann andere Pipelines triggern – Multi-Repo-Workflows möglich
- Parent-Child Pipelines: dynamisch generierte Sub-Pipelines für komplexe Monorepos
- Merge Request Pipelines: laufen nicht auf Branch sondern auf gemergedem Code – findet Konflikte vor Merge
Zusammenfassung
GitLab CI/CD ist die zweite große CI/CD-Plattform am Markt, besonders stark bei Enterprise und Self-Hosting. Pipeline in .gitlab-ci.yml mit globalen stages und Jobs als Top-Level-Keys. Jeder Job läuft in einem Docker-image. Runner-Typen: Shared (gitlab.com), Group, Project, Self-Hosted mit Docker-Executor. Variablen auf mehreren Ebenen, Secrets via GitLab-UI mit Protected/Masked. Rules (modern) statt only/except (alt) für Conditional Execution. Artifacts für Job-zu-Job-Output (30 Tage), Cache für persistente Dependencies. Includes und Templates für Wiederverwendung – GitLab liefert Security-Templates frei Haus. Environments als first-class Citizens mit Deploy-History und Rollback. Auto DevOps für vorgefertigte Pipelines ohne YAML. Vordefinierte Variablen wie $CI_COMMIT_SHORT_SHA sehr nützlich. Wer GitHub Actions kann, lernt GitLab CI in einem Tag.
