Der Runner auf dem NAS scheitert an der Docker-App des UGREEN: sie lehnt den Einhängepunkt /var/run/docker.sock ab. Nachgewiesen durch Halbieren der Compose-Datei — ohne diese eine Zeile wird das Projekt angelegt, mit ihr nicht, und die Meldung nennt keinen Grund. Übrig blieben Docker-in-Docker mit privileged oder der Weg über SSH an der Oberfläche vorbei. Beide geben dem Runner faktisch Root auf dem NAS, und das für eine Aufgabe, die der Arbeitsrechner ohnehin erledigen kann: er ist für die Apps nötig, weil Xcode nirgendwo sonst läuft. Der Workflow löst deshalb nicht mehr bei jedem Push aus. Sonst sammelt Gitea Läufe an, die niemand abarbeitet, und die Actions-Seite füllt sich mit Leichen. Er bleibt als workflow_dispatch stehen, der Auslöser ist mit drei Zeilen wieder da. Die Anleitung stellt das Bauen vom Arbeitsrechner nach vorn und hält zwei Dinge fest, die beim Einrichten Zeit gekostet haben: die Docker-App zieht Images nicht selbst, und die Anmeldung an der Registry will ein Zugriffstoken statt des Kontopassworts. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
90 lines
3.6 KiB
YAML
90 lines
3.6 KiB
YAML
# Baut das Flaro-Image und legt es in die Registry dieses Gitea.
|
|
#
|
|
# **Zur Zeit schläft diese Datei.** Gebaut wird auf dem Arbeitsrechner mit
|
|
# `Tools/image-veroeffentlichen.sh` — der Rechner ist für die Apps ohnehin
|
|
# nötig, weil Xcode nirgendwo sonst läuft.
|
|
#
|
|
# **Weil Gitea nicht selbst baut.** Es verteilt Arbeit an einen Act-Runner,
|
|
# und der müsste auf dem NAS laufen. Dort scheitert er: sein Zweck ist das
|
|
# Bauen von Images, also braucht er Zugriff auf Docker, und die Docker-App
|
|
# des UGREEN lehnt den Einhängepunkt `/var/run/docker.sock` ab. Übrig
|
|
# blieben `privileged: true` oder der Weg über SSH an der Oberfläche vorbei
|
|
# — beides gibt dem Runner faktisch Root auf dem NAS.
|
|
#
|
|
# **Deshalb nur `workflow_dispatch`.** Mit einem Push-Auslöser legt Gitea
|
|
# bei jedem Push einen Lauf an, den niemand abarbeitet; nach einer Woche
|
|
# steht die Actions-Seite voll mit Leichen. Kommt irgendwann ein Runner
|
|
# dazu, lässt sich der Lauf von Hand starten — und der Auslöser unten ist
|
|
# mit drei Zeilen wieder da.
|
|
|
|
name: Image bauen und veröffentlichen
|
|
|
|
on:
|
|
# Wieder automatisch, sobald ein Runner existiert:
|
|
# 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' }}"
|
|
# **Der Name des Pakets, nicht der des Repos.** Gitea legt Pakete
|
|
# am Besitzer ab, nicht am Repository — sie dürfen deshalb anders
|
|
# heissen. Hier ist das nötig: das Repo heisst noch „halo", das
|
|
# Programm aber Flaro, und ein Image namens `halo` wäre die eine
|
|
# Stelle, an der der alte Name überlebt.
|
|
#
|
|
# Kleinbuchstaben, weil die Registry nichts anderes annimmt.
|
|
BESITZER=$(echo "${{ gitea.repository_owner }}" | tr '[:upper:]' '[:lower:]')
|
|
BILD="$REGISTRY/$BESITZER/${{ vars.IMAGE_NAME || 'flaro' }}"
|
|
|
|
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
|