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