Dokumentation einer Github Actions-Optimierung (Docker-Build)
Beim Erstellen plattformübergreifender Docker-Images mit GitHub Actions war die Ausführung stets langsam. Ich habe die Aufgabenkonfigurationsdatei mithilfe von KI optimieren lassen.
Wird gerendert...
## Wesentliche Verbesserungen (Erfolge)
1. **Checkout mit `fetch-depth: 0` hinzugefügt:** Vor der Verbesserung war die Standardeinstellung ein flacher Klon (`depth=1`), wodurch `git describe --tags` oft nicht in der Lage war, historische Tags korrekt abzurufen, was zu einem Fehlschlag bei der Versionsnummernextraktion führte. Nach dem Hinzufügen von `fetch-depth: 0` hat sich die Zuverlässigkeit erheblich verbessert.
2. **Ausgabe der Versionsnummer auf `$GITHUB_OUTPUT` geändert:** Dies ist die korrekte und empfohlene Vorgehensweise. Vor der Verbesserung funktionierte `>> $GITHUB_ENV` zwar auch, aber `GITHUB_OUTPUT` ist eine modernere und klarer abgegrenzte Methode (besonders geeignet für die Referenzierung in nachfolgenden Schritten).
3. **Umstellung auf die offizielle `docker/build-push-action@v5`:** Dies ist die größte und wichtigste Verbesserung.
- Manuelles Schreiben von `docker buildx build ...` Befehlen entfällt, wodurch das Risiko von Syntaxfehlern reduziert wird.
- Automatische Verarbeitung von Multi-Plattform-Manifesten, Push-Vorgängen, Tags usw.
- Der Code ist prägnanter und besser lesbar.
4. **`setup-qemu-action` hinzugefügt:** Für die `linux/arm64`-Plattform ist beim Bauen auf `ubuntu-latest (x86_64)` eine QEMU-Emulation erforderlich. Vor der Verbesserung fehlte dieser Schritt, wodurch der arm64-Build sehr wahrscheinlich fehlschlug oder extrem langsam war. Nach dem Hinzufügen ist die Multi-Plattform-Unterstützung vollständiger.
5. **Buildx-Cache aktiviert (`cache-from + cache-to: type=gha,mode=max`):** Beschleunigt nachfolgende Builds erheblich, insbesondere bei Multi-Plattform- und Multi-Stage-Dockerfiles.
6. **Explizite Angabe von `context: .` und `file: ./Dockerfile`:** Klarer, obwohl `.` der Standardwert ist, ist es besser für die Wartung, es explizit zu schreiben.
7. **Verwendung von `steps.get_version.outputs.VERSION` zur Referenzierung der Version:** In Verbindung mit GITHUB_OUTPUT verwendet.
## Alte Konfiguration
```yaml
name: Docker
on:
push:
tags:
- v*.*.*
jobs:
docker_build:
environment: docker_hub
runs-on: ubuntu-latest
steps:
- name: Code auschecken
uses: actions/checkout@v4
- name: Version abrufen
id: get_version
run: |
VERSION=$(git describe --tags --always --match 'v*' | sed -n 's|^v\([0-9]*\.[0-9]*\.[0-9]*\)\(-.*\)\{0,1\}|\1|p')
echo "VERSION=$VERSION" >> $GITHUB_ENV # Version als Umgebungsvariable speichern
- name: Bei Docker Hub anmelden
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
# Docker Buildx einrichten (unterstützt Multi-Plattform-Builds)
- name: Docker Buildx einrichten
uses: docker/setup-buildx-action@v3
# Multi-Plattform-Image in einem Schritt bauen und pushen
- name: Multi-Plattform-Image bauen und pushen
run: |
docker buildx build \
--platform linux/amd64,linux/arm64 \
--tag dingdangdog/jimily:${VERSION} \
--tag dingdangdog/jimily:latest \
--push .
- name: Docker-Images bereinigen
run: docker system prune -af
```
## Neue Konfiguration
```yaml
name: Docker
on:
push:
tags:
- v*.*.*
jobs:
docker_build:
environment: docker_hub
runs-on: ubuntu-latest
steps:
- name: Code auschecken
uses: actions/checkout@v4
with:
fetch-depth: 0 # Stellt sicher, dass Tags für die Versionsnummerngenerierung abgerufen werden können
- name: Version abrufen
id: get_version
# Semantische Versionsnummer extrahieren, z.B. 5.1.3 aus v5.1.3
run: |
VERSION=$(git describe --tags --always --match 'v*' | sed -n 's|^v\([0-9]*\.[0-9]*\.[0-9]*\)\(-.*\)\{0,1\}|\1|p')
echo "VERSION=$VERSION" >> $GITHUB_OUTPUT
- name: Bei Docker Hub anmelden
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: QEMU einrichten
uses: docker/setup-qemu-action@v3
with:
platforms: arm64 # Explizite Angabe der zu emulierenden Plattform
- name: Docker Buildx einrichten
uses: docker/setup-buildx-action@v3
- name: Multi-Plattform-Image bauen und pushen
uses: docker/build-push-action@v5
with:
context: .
file: ./Dockerfile
platforms: linux/amd64,linux/arm64
push: true
tags: |
dingdangdog/jimily:${{ steps.get_version.outputs.VERSION }}
dingdangdog/jimily:latest
# Wesentliche Verbesserung: GitHub Actions Cache-Backend aktivieren
cache-from: type=gha
cache-to: type=gha,mode=max
# Build-Argumente übergeben (falls Ihr Dockerfile die Variable VERSION benötigt, können Sie die folgende Zeile aktivieren)
# build-args: |
# APP_VERSION=${{ steps.get_version.outputs.VERSION }}
```Kommentar
Melde dich an, um Kommentare anzuzeigen und zu veröffentlichen
Zur Anmeldung