Ein Weg vom Quelltext in die Registry — und von dort aufs NAS
Damit das Image dort landet, wo das NAS es holen kann. **`.gitea/workflows/image.yml`** — Gitea baut selbst. Bei jedem Push auf `main` entsteht das Image für **beide** Architekturen und landet in der Registry desselben Gitea. Niemand muss daran denken, niemand muss angemeldet sein, und niemand kann die Architektur vergessen. Voraussetzung ist ein registrierter Act-Runner. Hat deiner keinen, läuft die Datei nie an — dafür gibt es den zweiten Weg. **`Tools/image-veroeffentlichen.sh`** — ein Befehl vom Arbeitsrechner, baut amd64 und arm64 und lädt hoch. Angemeldet wird einmalig von Hand; das Passwort tippt nur, wer es kennt. Beides legt `:latest` ab, dazu den Kurz-Hash und auf einem Git-Tag dessen Namen — damit sich eine Fassung festnageln lässt, statt immer „latest" zu ziehen. Die Anleitung bekommt vier neue Abschnitte: Gitea baut selbst, von Hand bauen, das Paket öffentlich stellen, und **die Registry im NAS eintragen** — also genau der Dialog „Quellname des Images", mit Alias `gitea` und Link `https://git.scarriffle.com/`. Für ein privates Paket ein Zugriffstoken mit `read:package`, nicht das Kontopasswort: ein Token lässt sich einzeln widerrufen. Die Beispiel-Compose zeigte auf `ghcr.io/scarriffle/flaro` — dort liegt nichts und lag nie etwas. Jetzt auf die Gitea-Registry. --- **Ein Fehler im eigenen Skript, gefunden beim ersten Lauf.** Die Prüfung „läuft Docker?" war `docker info | grep -q .` — und `grep -q` beendet die Pipe beim ersten Treffer, Docker bekommt SIGPIPE, und mit `set -o pipefail` gilt das als Fehlschlag. Das Skript meldete „Docker läuft nicht", während Docker lief und gerade ein Image gebaut hatte. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
f2b5ee633b
commit
c12748e262
@@ -0,0 +1,75 @@
|
||||
# Baut das Flaro-Image und legt es in die Registry dieses Gitea.
|
||||
#
|
||||
# **Warum hier und nicht auf dem Arbeitsrechner.** Ein Bau von Hand heisst:
|
||||
# jemand muss daran denken, muss die richtige Architektur angeben und muss
|
||||
# angemeldet sein. Hier passiert es bei jedem Push von selbst, immer für
|
||||
# beide Architekturen, und die Anmeldung besorgt Gitea.
|
||||
#
|
||||
# **Voraussetzung ist ein Runner.** Ohne einen registrierten Act-Runner
|
||||
# läuft diese Datei nie an — dann bleibt der Weg von Hand aus
|
||||
# `Tools/image-veroeffentlichen.sh`.
|
||||
|
||||
name: Image bauen und veröffentlichen
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [main]
|
||||
tags: ['v*']
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
image:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Quelltext holen
|
||||
uses: actions/checkout@v4
|
||||
|
||||
# **buildx, nicht das eingebaute `docker build`.** Nur damit lassen
|
||||
# sich zwei Architekturen in einem Manifest ablegen; ohne das bekommt
|
||||
# ein Intel-NAS ein arm64-Image und meldet „exec format error".
|
||||
- name: buildx vorbereiten
|
||||
uses: docker/setup-buildx-action@v3
|
||||
|
||||
- name: QEMU für die fremde Architektur
|
||||
uses: docker/setup-qemu-action@v3
|
||||
|
||||
- name: An der Registry anmelden
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
registry: ${{ vars.REGISTRY || 'git.scarriffle.com' }}
|
||||
username: ${{ gitea.actor }}
|
||||
password: ${{ secrets.GITEA_TOKEN }}
|
||||
|
||||
- name: Marken bestimmen
|
||||
id: marken
|
||||
run: |
|
||||
REGISTRY="${{ vars.REGISTRY || 'git.scarriffle.com' }}"
|
||||
# Gitea verlangt Kleinbuchstaben im Pfad; der Besitzername kann
|
||||
# gross geschrieben sein.
|
||||
PFAD=$(echo "${{ gitea.repository }}" | tr '[:upper:]' '[:lower:]')
|
||||
BILD="$REGISTRY/$PFAD"
|
||||
|
||||
MARKEN="$BILD:latest,$BILD:${GITHUB_SHA::7}"
|
||||
# Auf einem Git-Tag zusätzlich dessen Namen — damit sich eine
|
||||
# Fassung festnageln lässt, statt immer „latest" zu ziehen.
|
||||
if [ "${GITHUB_REF_TYPE}" = "tag" ]; then
|
||||
MARKEN="$MARKEN,$BILD:${GITHUB_REF_NAME#v}"
|
||||
fi
|
||||
echo "marken=$MARKEN" >> "$GITHUB_OUTPUT"
|
||||
echo "Gebaut wird: $MARKEN"
|
||||
|
||||
- name: Bauen und hochladen
|
||||
uses: docker/build-push-action@v5
|
||||
with:
|
||||
context: .
|
||||
file: server/Dockerfile
|
||||
# **Beide Architekturen.** amd64 für die Intel-NAS, arm64 für
|
||||
# ARM-Geräte und für den Apple-Rechner.
|
||||
platforms: linux/amd64,linux/arm64
|
||||
push: true
|
||||
tags: ${{ steps.marken.outputs.marken }}
|
||||
# Zwischenergebnisse behalten: ohne das lädt jeder Lauf alle
|
||||
# Pakete neu, und ein Bau dauert statt zwei Minuten zwölf.
|
||||
cache-from: type=gha
|
||||
cache-to: type=gha,mode=max
|
||||
Reference in New Issue
Block a user