Zum Inhalt

GitHub CI Pipeline mit Deployment

ACHTUNG:
Diese Beispiel sollen das Prinzip zeigen. Es hat nicht den Anspruch, dass es 1:1 so funktioniert. Auch die Versionen der Actions können nicht mehr aktuell sein.
(Denn das Beispiel soll nicht einfach die Lösung für die weiteren Übung vorwegnehmen ;-) )

Deployment eines Docker-Images in eine Registry

Häufig wird nicht direkt ein Artefakt (JAR/WAR) deployed, sondern ein Docker-Image gebaut und in eine Container-Registry gepusht. ZBsp. Docker Hub und GitHub Container Registry (GHCR).

Voraussetzungen

Dockerfile

Das Repository des Projektes muss ein Dockerfile enthalten, das beschreibt, wie das Docker-Image gebaut wird.

Secrets und Berechtigungen

Für den Zugriff auf die Container-Registries sind entsprechende Secrets und Berechtigungen erforderlich:
- DOCKERHUB_USERNAME, DOCKERHUB_TOKEN (Access Token aus Docker Hub).

Beispiel Workflow mit Deployment

# Name des Workflows (erscheint im Actions-Tab in GitHub)
name: Build and Push Docker Image to Docker Hub

# --- Trigger-Bedingungen ---
on:
  # Der Workflow startet automatisch bei einem Push auf den Branch "main"
  push:
    branches: [ main ]

  # Zusätzlich kann der Workflow manuell über den "Run workflow"-Button gestartet werden
  workflow_dispatch:

# --- Definition der Jobs ---
jobs:
  # Ein einzelner Job mit dem Namen "build-and-push"
  build-and-push:

    # GitHub stellt dafür eine frische Ubuntu-VM bereit
    runs-on: ubuntu-latest

    # Jeder Job besteht aus einer Reihe von Schritten (steps)
    steps:

      # 1. Quellcode aus dem Repository auschecken
      # Diese Action lädt den Code (inkl. Dockerfile) in die VM
      - name: Checkout repository
        uses: actions/checkout@v4

      # 2. QEMU aktivieren – ermöglicht Cross-Platform-Builds
      # zBsp. ein amd64-Image auf einer ARM-CPU oder umgekehrt
      - name: Set up QEMU
        uses: docker/setup-qemu-action@v3

      # 3. Docker Buildx einrichten – moderne Build-Engine für Multi-Arch Images
      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3

      # 4. Bei Docker Hub einloggen, um das Image pushen zu können
      # Login erfolgt mit den geheimen Zugangsdaten aus den GitHub Secrets
      - name: Log in to Docker Hub
        uses: docker/login-action@v3
        with:
          registry: docker.io                        # Ziel-Registry
          username: ${{ secrets.DOCKERHUB_USERNAME }} # Docker-Hub-User (Secret)
          password: ${{ secrets.DOCKERHUB_TOKEN }}    # Docker-Hub-Token oder Passwort (Secret)

      # 5. Docker-Image bauen und auf Docker Hub hochladen
      - name: Build and push Docker image
        uses: docker/build-push-action@v5
        with:
          # Pfad zum Build-Kontext (hier das Repo selbst)
          context: .

          # Pfad zur Dockerfile im Projekt
          file: ./Dockerfile

          # Push aktivieren – Image wird nach erfolgreichem Build in die Registry hochgeladen
          push: true

          # Für beide Architekturen bauen: amd64 (Standard-PCs) und arm64 (z. B. Macs, Raspberry Pi)
          platforms: linux/amd64, linux/arm64

          # Zwei Tags vergeben:
          # a) "latest" – für die jeweils aktuelle Version
          # b) Commit-Hash – eindeutiger Fingerabdruck jeder Build-Version
          tags: |
            docker.io/${{ secrets.DOCKERHUB_USERNAME }}/myproject:latest
            docker.io/${{ secrets.DOCKERHUB_USERNAME }}/myproject:${{ github.sha }}

Zugriff auf die Container-Registry

  • Docker Hub: <dockerhub-user>/my-app
  • GHCR: ghcr.io/<org-oder-user>/my-app