# 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