#!/usr/bin/env bash # Baut das Produktiv-Image aus dem aktuellen main-Stand und pusht es in die # Gitea-Registry, getaggt mit :latest UND dem Commit-Kurz-SHA (Rollback). # # Nur fuer freigegebene Staende: das Skript verweigert den Push, wenn du nicht # auf main bist oder uncommittete Aenderungen hast. Fuer Dev-Builds ohne Push # stattdessen scripts/dev-build.sh nutzen. # # Voraussetzung: einmalig `docker login gitea.anticarnist.de` (siehe # docs/deployment.md). set -euo pipefail IMAGE="gitea.anticarnist.de/tom/elternbeirat" # Ins Repo-Root wechseln (Skript liegt in scripts/), damit der Docker-Build- # Kontext stimmt, egal von wo aufgerufen. cd "$(dirname "$0")/.." branch="$(git rev-parse --abbrev-ref HEAD)" if [[ "$branch" != "main" ]]; then echo "ABBRUCH: du bist auf '$branch', nicht auf 'main'." >&2 echo "Ein :latest-Release darf nur aus main gebaut werden." >&2 echo "Fuer einen Dev-Build ohne Push: scripts/dev-build.sh" >&2 exit 1 fi if [[ -n "$(git status --porcelain)" ]]; then echo "ABBRUCH: Arbeitsverzeichnis nicht sauber (uncommittete Aenderungen)." >&2 echo "Erst committen, damit der SHA-Tag den Image-Inhalt eindeutig benennt." >&2 exit 1 fi # Warnung, wenn lokaler main dem Remote voraus ist (ungepushte Commits) — dann # wuerde ein SHA getaggt, den es auf Gitea noch nicht gibt. if git rev-parse --verify --quiet origin/main >/dev/null; then ahead="$(git rev-list --count origin/main..HEAD)" if [[ "$ahead" -gt 0 ]]; then echo "WARNUNG: lokaler main ist origin/main um $ahead Commit(s) voraus." >&2 echo " Erst 'git push', damit der SHA auf Gitea existiert." >&2 read -r -p "Trotzdem fortfahren? [y/N] " answer [[ "$answer" == "y" || "$answer" == "Y" ]] || exit 1 fi fi sha="$(git rev-parse --short HEAD)" echo "Baue $IMAGE (Tags: latest, $sha)" docker build -t "$IMAGE:latest" -t "$IMAGE:$sha" . docker push "$IMAGE" --all-tags echo echo "Fertig. Gepusht: $IMAGE:latest und $IMAGE:$sha" echo "Auf Unraid: Stack 'elternbeirat' -> Compose Down/Up (bzw. Pull), damit" echo "das neue :latest gezogen wird."