CI/CD-Pipeline: Architektur und Implementierung

PUBLISHED ON DEC 25, 2025 — CICD, DEVOPS, GITHUB-ACTIONS, GITLAB, JENKINS, OPS

Architektur und Implementierung einer CI/CD-Pipeline: Ein umfassendes technisches Handbuch für DevOps-Ingenieure

1. Einleitung: Die Evolution der Softwarebereitstellung

Die Transformation der Softwareentwicklung von monolithischen Wasserfallmodellen hin zu agilen, iterativen Prozessen hat die Notwendigkeit einer automatisierten Bereitstellungsinfrastruktur unumgänglich gemacht. Im Zentrum dieser technologischen Revolution steht die CI/CD-Pipeline (Continuous Integration / Continuous Delivery & Deployment). Sie fungiert als das Herzstück der modernen “Softwarefabrik”, in der Quellcode nicht mehr manuell kompiliert und verschoben wird, sondern einen hochgradig automatisierten Veredelungsprozess durchläuft.

Dieses Dokument dient als technisches Referenzwerk für die Planung, Konstruktion und Wartung einer proprietären CI/CD-Pipeline. Es analysiert die architektonischen Entscheidungen, die bei der Auswahl von Werkzeugen wie Jenkins, GitHub Actions und GitLab CI/CD getroffen werden müssen, und bietet detaillierte Implementierungsstrategien für kritische Komponenten wie Build-Automatisierung, Test-Orchestrierung, Artefakt-Management und Sicherheitsintegration (DevSecOps).

Das Ziel ist nicht nur die bloße Aneinanderreihung von Skripten, sondern die Schaffung eines robusten, idempotenten und auditierbaren Systems, das die “Time-to-Market” reduziert und gleichzeitig die Stabilität von Produktionsumgebungen gewährleistet. Wir betrachten die Pipeline dabei als Produkt, das denselben Qualitätsstandards unterliegt wie die Software, die sie ausliefert.

2. Theoretisches Fundament und Kernarchitektur

Bevor wir in die Implementierungsdetails einsteigen, ist es essenziell, die anatomische Struktur und die theoretischen Prinzipien einer Pipeline zu verstehen. Eine Pipeline ist im Wesentlichen eine Zustandsmaschine, die Code von einem unsicheren Zustand (frisch geschrieben) in einen vertrauenswürdigen Zustand (produktionsbereit) überführt.

2.1 Die vier Säulen der Pipeline-Architektur

Eine vollständige CI/CD-Pipeline gliedert sich in vier fundamentale Phasen, die als Qualitätstore (Quality Gates) fungieren. Ein Fehler in einer dieser Phasen führt zum sofortigen Abbruch des Prozesses (Fail-Fast-Prinzip), um zu verhindern, dass fehlerhafte Artefakte die nachgelagerten Systeme kontaminieren.

2.1.1 Die Source-Phase (Version Control)

Der Ursprung jeder Pipeline ist das Versionskontrollsystem (VCS). In modernen Architekturen ist die Pipeline ereignisgesteuert. Sie reagiert auf spezifische Stimuli innerhalb des VCS, wie etwa einen git push, das Öffnen eines Pull Requests (PR) oder das Erstellen eines Tags.

  • Trigger-Mechanismen: Die Unterscheidung zwischen PR-Pipelines und Merge-Pipelines ist kritisch. PR-Pipelines validieren hypothetische Zustände (Was passiert, wenn dieser Code gemergt wird?), während Merge-Pipelines den definitiven Zustand des main-Branches verarbeiten.
  • Single Source of Truth: Best Practices diktieren, dass nicht nur der Anwendungscode, sondern auch die Pipeline-Konfiguration selbst (Pipeline-as-Code) versioniert wird. Dies ermöglicht eine historische Nachverfolgbarkeit von Build-Logik-Änderungen.

2.1.2 Die Build-Phase (Continuous Integration)

Hier findet die Transformation von abstraktem Code in konkrete Artefakte statt.

  • Kompilierung und Transpilierung: Für kompilierte Sprachen (Go, Java) entstehen Binärdateien. Für interpretierte Sprachen (Node.js, Python) umfasst dies oft das Packaging oder Transpilieren (z.B. TypeScript zu JavaScript).
  • Abhängigkeitsmanagement: Die Installation externer Bibliotheken (npm install, pip install) ist oft der zeitintensivste Schritt. Hier entscheiden Caching-Strategien über die Performance der Pipeline.
  • Artefakt-Erstellung: Das Ziel ist ein immutables Artefakt (z.B. ein Docker-Image), das in allen nachfolgenden Phasen unverändert verwendet wird. Dies verhindert das klassische “It works on my machine”-Phänomen.

2.1.3 Die Test-Phase (Verifikation)

Automatisierte Tests sind der Garant für Vertrauen in die Pipeline.

  • Unit Tests: Isolierte Tests einzelner Funktionen, die extrem schnell ausgeführt werden müssen.
  • Integrationstests: Validierung des Zusammenspiels mehrerer Komponenten, oft unter Zuhilfenahme von Ephemeral Environments (kurzlebigen Service-Containern wie Datenbanken).
  • Statische Analyse: Linting und SAST (Static Application Security Testing) prüfen den Code auf Stil- und Sicherheitsfehler, bevor er überhaupt ausgeführt wird.

2.1.4 Die Deploy-Phase (Delivery vs. Deployment)

Der finale Schritt befördert das validierte Artefakt in eine Zielumgebung.

  • Continuous Delivery: Der Prozess ist automatisiert bis zur Staging-Umgebung; der Schritt in die Produktion erfordert eine manuelle Bestätigung.
  • Continuous Deployment: Jede Änderung, die alle Tests besteht, wird ohne menschliches Zutun live geschaltet. Dies erfordert ein extrem hohes Vertrauen in die Testabdeckung.

3. Strategische Werkzeugauswahl: Eine vergleichende Analyse

Die Wahl der Orchestrierungsplattform ist eine langfristige Architekturentscheidung. Während der Markt unzählige Nischenprodukte bietet, haben sich drei dominante Ökosysteme herauskristallisiert: Jenkins, GitHub Actions und GitLab CI/CD. Jedes System verfolgt eine unterschiedliche Philosophie.

3.1 Jenkins: Der extensible Veteran

Jenkins ist der Industriestandard für Szenarien, die maximale Anpassbarkeit erfordern. Als selbstgehostete Java-Applikation bietet es vollständige Kontrolle über die Infrastruktur.

  • Architektur: Controller-Agent-Modell (früher Master-Slave). Der Controller verwaltet die Konfiguration und Zeitplanung, während Agenten die eigentliche Last der Builds tragen.
  • Stärken: Ein Ökosystem von über 1.800 Plugins ermöglicht die Integration mit fast jedem existierenden Tool. Es ist plattformunabhängig und ideal für On-Premise-Installationen mit strikten Datenhoheitsanforderungen.
  • Schwächen: Hoher Wartungsaufwand (“Jenkins ist ein Hobby, kein Tool”). Administratoren müssen sich um Updates, Sicherheits-Patches und Plugin-Kompatibilität kümmern (“Plugin Hell”). Die Lernkurve für komplexe Groovy-Pipelines ist steil.

3.2 GitHub Actions: Der integrierte Modernist

GitHub Actions hat sich durch die nahtlose Integration in die weltweit größte Code-Hosting-Plattform schnell etabliert.

  • Architektur: SaaS-first (GitHub-hosted Runners) mit der Option auf Self-Hosted Runners. Konfiguration erfolgt über YAML-Dateien.
  • Stärken: “Zero Config” für den Start. Der Marketplace bietet Tausende vorgefertigte Aktionen, die per “Uses”-Direktive eingebunden werden können. Die Integration von Code und CI an einem Ort reduziert den Kontextwechsel für Entwickler.
  • Schwächen: Vendor-Lock-in. Wer GitHub Actions nutzt, bindet sich stark an das GitHub-Ökosystem. Das Debugging von komplexen Fehlern kann schwieriger sein als auf einem Server, auf den man vollen Zugriff hat.

3.3 GitLab CI/CD: Die All-in-One-Plattform

GitLab verfolgt einen holistischen Ansatz, bei dem Source Code Management, CI/CD, Container Registry und Security Scanning in einer einzigen Applikation gebündelt sind.

  • Architektur: Basierend auf dem GitLab Runner, einem in Go geschriebenen Agenten, der auf fast jedem OS läuft.
  • Stärken: Exzellente Docker-Unterstützung (Docker-in-Docker ist quasi nativ). Die integrierte Container Registry eliminiert die Notwendigkeit externer Artefakt-Speicher für Docker Images. Ideal für Unternehmen, die eine “Single Pane of Glass” für den gesamten DevOps-Zyklus suchen.
  • Schwächen: Die Benutzeroberfläche kann aufgrund der Feature-Dichte überwältigend wirken. Self-Hosting einer kompletten GitLab-Instanz ist ressourcenintensiv.

Tabelle 1: Technischer Vergleich der Marktführer

Merkmal Jenkins GitHub Actions GitLab CI/CD
Pipeline-Definition Groovy (Jenkinsfile) YAML YAML (.gitlab-ci.yml)
Hosting-Modell Primär Self-Hosted SaaS & Self-Hosted SaaS & Self-Hosted
Erweiterbarkeit Plugins (Java) Actions (JS/Docker) Native Features
Container-Support Via Docker Pipeline Plugin Nativ (Service Container) Nativ (Services)
Wartungsaufwand Hoch Niedrig (SaaS) Mittel
Einstiegshürde Hoch Niedrig Mittel

4. Infrastruktur-Vorbereitung und Voraussetzungen

Bevor die erste Zeile Code für die Pipeline geschrieben wird, muss die physikalische oder virtuelle Infrastruktur bereitgestellt werden. Die Qualität der Runner-Infrastruktur bestimmt maßgeblich die Performance und Zuverlässigkeit der Pipeline.

4.1 Die Compute-Ebene: Runner und Agenten

Pipelines benötigen Rechenleistung. Hier gibt es zwei fundamentale Modelle:

  • Shared Runners (SaaS): GitHub und GitLab stellen ephemere VMs (meist Ubuntu) zur Verfügung. Diese sind sofort einsatzbereit, haben aber oft Hardware-Limits (z.B. 2 vCPUs) und Warteschlangen zu Stoßzeiten.
  • Self-Hosted Runners: Für Performance-kritische Builds oder Zugriff auf interne Netzwerkressourcen (z.B. interne Datenbanken) betreiben Unternehmen eigene Runner.

Hardware-Anforderungen: Ein typischer Linux-Runner benötigt mindestens 2 vCPUs und 4-8 GB RAM, um Docker-Container und Kompilierungsprozesse parallel zu handhaben.

Installation: Der Runner-Agent (GitHub Actions Runner oder GitLab Runner) muss als Systemdienst installiert werden, um Neustarts zu überleben.

4.2 Container-Strategie: Docker-in-Docker (DinD)

Da moderne CI/CD-Prozesse fast ausschließlich auf Containern basieren (um saubere Build-Umgebungen zu garantieren), muss der Runner in der Lage sein, Docker-Befehle auszuführen.

  • Problemstellung: Wenn der Runner selbst in einem Docker-Container läuft (was bei Kubernetes-Executors üblich ist), entsteht das Problem “Docker im Docker”.
  • Lösung A (Privileged Mode): Der innere Container erhält volle Root-Rechte auf dem Host. Dies ist sicherheitstechnisch riskant, aber funktional am robustesten.
  • Lösung B (Socket Binding): Der Docker-Socket des Hosts (/var/run/docker.sock) wird in den Container gemountet (“Docker-outside-of-Docker”). Der Container steuert also den Docker-Daemon des Hosts. Dies ist performanter (kein Layer-Overhead), kann aber zu Konflikten bei Dateinamen führen.

4.3 SSH-Zugriff und Netzwerkkonnektivität

Für das Deployment auf virtuelle Maschinen (z.B. AWS EC2) benötigt die Pipeline SSH-Zugriff.

  • Schlüsselmanagement: Ein dediziertes SSH-Schlüsselpaar sollte generiert werden. Der öffentliche Schlüssel kommt auf den Zielserver (authorized_keys), der private Schlüssel wird als Secret in der CI-Plattform hinterlegt.
  • Firewalls: Der Zielserver muss eingehende Verbindungen von den IP-Adressen der Runner akzeptieren. Bei SaaS-Runnern (GitHub/GitLab) ändern sich diese IPs häufig, was Self-Hosted Runners oder VPN-Lösungen attraktiv macht.

5. Implementierungs-Guide: GitHub Actions

GitHub Actions bietet durch seine Event-basierte Architektur eine extrem flexible Basis für CI/CD.

5.1 Workflow-Struktur und Syntax

Ein Workflow wird in .github/workflows/main.yml definiert.

  • Triggers (on): Definiert, wann die Pipeline läuft. Ein Standardmuster ist push auf main für Deployments und pull_request für reine Tests.
  • Jobs und Steps: Ein Job läuft auf einem Runner (runs-on: ubuntu-latest). Jobs bestehen aus Steps, die sequenziell ausgeführt werden.

5.2 Caching von Abhängigkeiten (Node.js Beispiel)

Ein Hauptgrund für langsame Pipelines ist das wiederholte Herunterladen von Abhängigkeiten (node_modules).

Implementierung: Die actions/cache-Action speichert Verzeichnisse basierend auf einem Hash-Schlüssel.

- name: Cache node modules
  uses: actions/cache@v3
  with:
    path: ~/.npm
    key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}

Key-Strategie: key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}. Dieser Schlüssel ändert sich nur, wenn sich das Betriebssystem oder die package-lock.json ändert. Bei einem “Cache Hit” wird das Verzeichnis ~/.npm wiederhergestellt, was npm ci massiv beschleunigt.

5.3 Docker Build und Push

Das Erstellen und Veröffentlichen von Docker-Images ist ein Standard-Use-Case.

  • Authentifizierung: Niemals Passwörter im Klartext verwenden. Nutzen Sie docker/login-action mit Secrets (DOCKERHUB_USERNAME, DOCKERHUB_TOKEN).
  • Metadaten: Die docker/metadata-action extrahiert automatisch Tags aus Git-Refs (z.B. wird ein Git-Tag v1.0.0 automatisch zum Docker-Tag v1.0.0 und latest).
  • Buildx: Die Nutzung von docker/setup-buildx-action ermöglicht Multi-Architektur-Builds (z.B. ARM64 für Raspberry Pi und AMD64 für Cloud-Server) in einem einzigen Schritt.

5.4 Retry-Mechanismen für Resilienz

Netzwerkfehler können Pipelines sporadisch fehlschlagen lassen. GitHub Actions bietet keine native retry-Option für einzelne Steps, aber Workarounds existieren.

  • Composite Actions: Nutzung von Aktionen wie nick-fields/retry, die einen Befehl mehrfach ausführen, wenn er fehlschlägt.
  • Matrix-Strategie: Manchmal werden Jobs in einer Matrix ausgeführt, um verschiedene Node-Versionen (14, 16, 18) parallel zu testen. Wenn ein Job fehlschlägt, kann die gesamte Matrix abgebrochen werden (fail-fast: true) oder weiterlaufen.

6. Implementierungs-Guide: GitLab CI/CD

GitLab CI zeichnet sich durch seine starke Integration von Artefakten und Umgebungen aus.

6.1 Pipeline-Architektur und Stages

GitLab-Pipelines sind strikt in Stages gegliedert (Build -> Test -> Deploy). Jobs in derselben Stage laufen parallel. Erst wenn alle Jobs einer Stage erfolgreich sind, beginnt die nächste Stage. Dies erzwingt eine saubere Trennung der Belange.

6.2 Artefakt-Management vs. Caching

Ein häufiges Missverständnis ist der Unterschied zwischen Cache und Artefakten in GitLab.

  • Cache: Ist temporär und projektweit. Er dient der Beschleunigung (z.B. node_modules). Wenn er fehlt, funktioniert der Job trotzdem (nur langsamer).
  • Artefakte: Sind Ergebnisse eines Jobs (z.B. kompilierte Binaries oder dist/ Ordner), die zwingend an den nächsten Job übergeben werden müssen. Sie werden auf den GitLab-Server hochgeladen und sind im UI herunterladbar.

6.3 Deployment Tiers und Environments

GitLab bietet fortgeschrittene Deployment-Features.

  • Environments: Durch die Definition environment: production im Job trackt GitLab jede Bereitstellung. Dies ermöglicht im UI einen “Rollback”-Button, der eine frühere Pipeline erneut ausführt, um einen stabilen Zustand wiederherzustellen.
  • Dynamic Environments (Review Apps): Für jeden Merge Request kann eine temporäre Umgebung erstellt werden (environment: name: review/$CI_COMMIT_REF_SLUG). Dies erlaubt Testern, Änderungen live zu sehen, bevor sie gemergt werden.

7. Implementierungs-Guide: Jenkins

Jenkins-Pipelines werden in einem Jenkinsfile definiert. Dies ist der “Pipeline-as-Code”-Ansatz, der die alten UI-basierten Jobs abgelöst hat.

7.1 Declarative vs. Scripted Pipelines

  • Declarative: Beginnt mit pipeline {... }. Bietet eine strikte Struktur und Syntax-Validierung. Dies ist der empfohlene Standard für 90% der Anwendungsfälle, da er lesbarer und wartbarer ist.
  • Scripted: Beginnt mit node {... }. Basiert direkt auf Groovy. Bietet maximale Flexibilität (z.B. komplexe Schleifen, Try-Catch-Blöcke), ist aber schwerer zu verstehen.

7.2 Docker-Agents

Statt Software global auf dem Jenkins-Server zu installieren, können Docker-Container als flüchtige Build-Umgebungen genutzt werden.

Syntax: agent { docker { image 'node:18' } }. Jenkins startet diesen Container, mountet den Workspace, führt die Befehle aus und löscht den Container danach. Dies garantiert eine saubere Umgebung für jeden Build und löst Konflikte zwischen Projekten, die unterschiedliche Node-Versionen benötigen.

7.3 Flaky Test Handler

Jenkins besitzt exzellente Plugins für instabile Tests.

  • Retry: Der Block retry(3) {... } wiederholt einen fehlgeschlagenen Schritt bis zu dreimal.
  • Flaky Test Handler Plugin: Analysiert Testergebnisse über die Zeit und identifiziert Tests, die ohne Codeänderungen mal bestehen und mal fehlschlagen, um diese gesondert zu behandeln.

8. Qualitätssicherung: Testing und Reporting

Eine Pipeline, die nur Code bewegt, ist wertlos. Sie muss Qualität verifizieren.

8.1 JUnit Reporting Integration

Das Parsen von Testergebnissen ist essenziell, um Fehler schnell zu lokalisieren.

  • Format: Die meisten Test-Runner (Jest, Pytest, Maven) können Ergebnisse im JUnit-XML-Format ausgeben.
  • Integration:
    • Jenkins: junit '**/target/surefire-reports/*.xml' erstellt Trend-Graphen im Dashboard.
    • GitLab: artifacts:reports:junit integriert die Ergebnisse direkt in den Merge Request. Entwickler sehen sofort “2 Tests failed” im Diff.
    • GitHub Actions: Benötigt Drittanbieter-Aktionen wie mikepenz/action-junit-report, um Testergebnisse als Annotationen im Code anzuzeigen.

8.2 Code Coverage

Metriken zur Testabdeckung (Code Coverage) sollten erhoben werden. Fällt die Abdeckung unter einen Schwellenwert (z.B. 80%), kann die Pipeline fehlschlagen (Quality Gate). Dies verhindert schleichenden Qualitätsverfall.

9. Deployment-Strategien und Zielumgebungen

Das “D” in CI/CD steht für Delivery oder Deployment. Hier verlässt der Code die kontrollierte Umgebung der Pipeline.

9.1 AWS S3 (Statische Webseiten)

Das Deployment von Frontend-Apps (React, Vue) erfolgt oft durch Synchronisation mit einem S3-Bucket.

Befehl: aws s3 sync ./build s3://mein-bucket --delete. Das Flag --delete ist wichtig, um veraltete Dateien zu entfernen.

Sicherheit: Authentifizierung erfolgt über aws-actions/configure-aws-credentials (GitHub) oder Umgebungsvariablen (GitLab/Jenkins) unter Nutzung von IAM Usern mit minimalen Rechten (Least Privilege).

9.2 EC2 und Virtuelle Maschinen

Deployments auf Server erfordern SSH.

Workflow: 1. SSH-Verbindung aufbauen. 2. Code pullen (git pull) oder Docker Image pullen. 3. Service neustarten.

Problembehandlung: StrictHostKeyChecking=no ist oft notwendig, um interaktive Prompts zu vermeiden, stellt aber ein Sicherheitsrisiko dar (Man-in-the-Middle). Besser ist das Vorbefüllen der known_hosts Datei im Runner.

9.3 Container Registries (Docker Hub / ECR)

Der “Golden Standard” ist das Bauen eines Images, Pushen in eine Registry und anschließendes Triggern der Orchestrierung (Kubernetes/ECS).

Tagging: Nutzung des Commit-SHA als Tag (myapp:a1b2c3d) ermöglicht eindeutige Zuordnung. latest sollte in der Produktion vermieden werden, da es nicht eindeutig ist, welche Version gerade läuft.

10. Sicherheit in der Pipeline (DevSecOps)

Sicherheit darf kein nachgelagerter Gedanke sein.

10.1 Secret Management

Harte Codierung von Zugangsdaten ist untersagt.

  • Vaults: Nutzen Sie die eingebauten Secret-Stores der CI-Tools. Diese injizieren Variablen erst zur Laufzeit in den Prozess.
  • Log-Masking: CI-Tools versuchen, Secrets in Logs durch *** zu ersetzen. Vorsicht bei Base64-Encodings – diese werden oft nicht erkannt und leaken Secrets.

10.2 Vulnerability Scanning

  • Dependency Scanning: Tools wie npm audit oder OWASP Dependency Check prüfen genutzte Bibliotheken auf bekannte CVEs.
  • Container Scanning: Vor dem Push in die Registry sollte das Image (z.B. mit Trivy) auf Sicherheitslücken im Basis-OS (z.B. Alpine/Debian) gescannt werden. Ein “High Severity”-Fund sollte den Build stoppen.

11. Monitoring und Feedback-Loops

Ein fehlgeschlagener Build, den niemand bemerkt, blockiert das Team.

11.1 ChatOps und Notifikationen

Die Integration mit Slack oder MS Teams reduziert die Reaktionszeit.

  • GitHub: Action rtCamp/action-slack-notify. Kann bedingt ausgeführt werden (if: failure()), um nur bei Fehlern zu alarmieren.
  • Jenkins: Slack Plugin ermöglicht farbcodierte Nachrichten (Rot für Fehler, Grün für Erfolg) inklusive Links zu den Logs und Änderungshistorie.

11.2 Pipeline-Metriken (DORA)

Messen Sie die Pipeline selbst.

  • Build-Dauer: Steigt die Zeit schleichend an?
  • Failure Rate: Wie oft schlägt der main-Branch fehl?

Diese Daten sind die Basis für kontinuierliche Verbesserung der Infrastruktur.

12. Fazit

Der Bau einer eigenen CI/CD-Pipeline ist der Schritt vom Handwerk zur industriellen Fertigung von Software. Ob Sie die Flexibilität von Jenkins, die Integration von GitHub Actions oder die All-in-One-Lösung von GitLab wählen, die Prinzipien bleiben gleich: Automatisieren Sie alles, scheitern Sie früh (Fail Fast) und vertrauen Sie nur immutablen Artefakten.

Die in diesem Handbuch vorgestellten Architekturen und Patterns bieten das Fundament für eine skalierbare, sichere und effiziente Softwarebereitstellung, die den Anforderungen moderner DevOps-Organisationen gerecht wird.

Anhang: Referenz-Konfigurationen

A. GitHub Actions: Node.js Production Workflow

name: Production CI/CD

on:
  push:
    branches: [ "main" ]

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: '20'
          cache: 'npm'
      - run: npm ci
      - run: npm test

  build-push:
    needs: test
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: docker/login-action@v3
        with:
          username: ${{ secrets.DOCKER_USER }}
          password: ${{ secrets.DOCKER_TOKEN }}
      - uses: docker/build-push-action@v6
        with:
          push: true
          tags: myapp:latest,myapp:${{ github.sha }}

  notify:
    if: always()
    needs: [test, build-push]
    runs-on: ubuntu-latest
    steps:
      - uses: rtCamp/action-slack-notify@v2
        env:
          SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }}
          SLACK_COLOR: ${{ contains(needs.*.result, 'failure') && 'danger' || 'good' }}

B. GitLab CI: Docker-in-Docker & Environments

stages:
  - build
  - deploy

build_image:
  stage: build
  image: docker:24
  services:
    - docker:24-dind
  script:
    - docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA .
    - docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA

deploy_prod:
  stage: deploy
  image: alpine:latest
  environment:
    name: production
    url: https://myapp.com
  script:
    - apk add --no-cache curl
    - curl -X POST $DEPLOY_WEBHOOK_URL
  only:
    - main

Referenzen

  1. What Is the CI/CD Pipeline? - Palo Alto Networks
  2. What Are CI/CD And The CI/CD Pipeline? - IBM
  3. What is a CI/CD pipeline? - Red Hat
  4. CI/CD Process: Flow, Stages, and Critical Best Practices - Codefresh
  5. CI/CD baseline architecture with Azure Pipelines - Microsoft Learn
  6. Dependency caching reference - GitHub Docs
  7. CI/CD caching examples - GitLab Docs
  8. CI - Docker Docs
  9. How to Use Docker in Jenkins Declarative Pipeline
  10. 14 best CI/CD tools for teams in 2025 - Northflank
  11. 20+ Best CI/CD Tools for DevOps in 2026 - Spacelift
  12. 8 Best CI/CD Tools for DevOps Engineers in 2025 - Firefly
  13. What is considered the current best CI/CD tool to learn? - Reddit
  14. Top 22 CI CD Tools for your DevOps project in 2025 - BrowserStack
  15. How to Build a CI/CD Pipeline with GitHub Actions and Docker - RunCloud
  16. How To Set Up a Continuous Deployment Pipeline with GitLab CI/CD on Ubuntu - DigitalOcean
  17. How to build a CI/CD pipeline with GitHub Actions in four simple steps - GitHub Blog
  18. Adding self-hosted runners - GitHub Docs
  19. Install GitLab Runner manually on GNU/Linux - GitLab Docs
  20. Docker executor - GitLab Docs
  21. Best practice to use cache for Gitlab CI - Reddit
  22. Use Docker to build Docker images - GitLab Docs
  23. Automating Node.js Deployment with GitLab CI/CD - Medium
  24. Tutorials for GitHub Actions - GitHub Docs
  25. Using GitHub Actions Cache with popular languages - WarpBuild Blog
  26. Automate Docker Image Builds and Push to Docker Hub Using GitHub Actions - DEV.to
  27. GitHub Action to build and push Docker images with Buildx
  28. Retry Step · Actions · GitHub Marketplace
  29. How to automatically retry github action jobs on failure? - Stack Overflow
  30. GitLab CI/CD variables - GitLab Docs
  31. Caching in GitLab CI/CD - GitLab Docs
  32. CI/CD YAML syntax reference - GitLab Docs
  33. Build a Node.js and React app with npm - Jenkins
  34. Mastering Docker and Jenkins: Build Robust CI/CD Pipelines Efficiently - Docker Blog
  35. How to build docker images using a Declarative Jenkinsfile - Stack Overflow
  36. Using Docker with Pipeline - Jenkins GitHub Pages
  37. Flaky Test Handler - Jenkins Plugins
  38. Rerun flaky JUnit test in case they failed - Stack Overflow
  39. Pipeline - Jenkins
  40. GitLab CI/CD artifacts reports types - GitLab Docs
  41. Unit test reports - GitLab Docs
  42. action-junit-report - GitHub Marketplace
  43. Deploying a Web App on AWS S3 Using GitHub Actions - AWS
  44. Automating Static Website Deployment with GitHub Actions and AWS S3 - DEV Community
  45. Build and push container images to the container registry - GitLab Docs
  46. Deploying a Docker image to a remote private registry with Gitlab CI - Mike Street
  47. Secrets Management in CI/CD Pipeline: Best Practices & Tools - Devtron
  48. CI/CD Secrets Management: Secure Your Pipelines Effectively - GitGuardian Blog
  49. Ci/cd Pipeline Security: A Comprehensive Guide for 2025 - Shadecoder
  50. CI/CD Security Best Practices - JetBrains TeamCity Blog
  51. Slack Notify · Actions · GitHub Marketplace
  52. Slack Notification - Jenkins Plugins
comments powered by Disqus