#!/bin/sh # publish-images.sh -- Abbilder je Auslieferungskanal bauen und veroeffentlichen # (quick-260914-ku1). # # Kanalmodell: # refs/heads/main -> Kanal beta, Etiketten beta + latest (latest = Alias, entfaellt spaeter) # refs/tags/v* -> Kanal live, Etiketten live + vX.Y.Z # alles andere -> nichts zu tun (Exit 0, kein Bau, kein Push) # # Der Zweig `live` OHNE Tag wird von der Pipeline geprueft, aber nicht veroeffentlicht: # auf `live` ist jeder auslieferbare Stand ein Tag. Ein ungetaggter Merge darf das # `live`-Etikett nicht ueberschreiben, sonst waere der Tag nicht mehr die Wahrheit. # # Die Entscheidung haengt allein an GITHUB_REF, damit sie lokal ohne Runner pruefbar ist: # GITHUB_REF=refs/tags/v1.2.3 sh .gitea/scripts/publish-images.sh --print-plan # # Versionsstempel: APP_VERSION aus `git describe --tags --always` (ohne Tag: kurzer SHA), # APP_COMMIT, APP_BUILD_TIME -- als --build-arg in beide Dockerfiles. Braucht im Checkout # die volle Historie samt Tags (fetch-depth: 0 im Workflow). # # Dieses Skript kennt kein Secret und gibt keines aus; der Registry-Login bleibt im Workflow. # # Phase 18 (18-02): Die Desktop-Pakete kommen aus dem vorgeschalteten Job `desktop` # und werden per actions/cache als desktop-dist/ uebergeben; das Dockerfile der API # kopiert desktop-dist/ ins Abbild. Ohne desktop-dist/manifest.json bricht dieses # Skript im echten Baupfad hart ab -- zweites Netz gegen Pitfall 1 (Cache-Fehlschlag), # der Workflow selbst prueft es bereits vor diesem Schritt. set -eu REGISTRY="${REGISTRY:-localhost:3002/schalli/tessera-ctl}" REF="${GITHUB_REF:-}" case "$REF" in refs/tags/v*) APP_CHANNEL=live TAGS="live ${REF#refs/tags/}" ;; refs/heads/main) APP_CHANNEL=beta TAGS="beta latest" ;; *) echo "Kein Veroeffentlichungs-Anlass fuer '$REF' (nur main und Tags v*): nichts zu tun." exit 0 ;; esac APP_VERSION="$(git describe --tags --always)" APP_COMMIT="$(git rev-parse --short HEAD)" APP_BUILD_TIME="$(date -u +%Y-%m-%dT%H:%M:%SZ)" echo "Tessera $APP_VERSION ($APP_CHANNEL) $APP_COMMIT $APP_BUILD_TIME -> Etiketten: $TAGS" if [ "${1:-}" = "--print-plan" ]; then for IMG in web api; do for TAG in $TAGS; do echo "push $REGISTRY/$IMG:$TAG" done done exit 0 fi if [ ! -f desktop-dist/manifest.json ]; then echo "desktop-dist/manifest.json fehlt -- kein Abbild ohne Desktop-Pakete (Pitfall 1)." >&2 exit 1 fi for IMG in web api; do docker build -t "$REGISTRY/$IMG:$APP_CHANNEL" \ --build-arg APP_VERSION="$APP_VERSION" \ --build-arg APP_CHANNEL="$APP_CHANNEL" \ --build-arg APP_COMMIT="$APP_COMMIT" \ --build-arg APP_BUILD_TIME="$APP_BUILD_TIME" \ -f "apps/$IMG/Dockerfile" . for TAG in $TAGS; do docker tag "$REGISTRY/$IMG:$APP_CHANNEL" "$REGISTRY/$IMG:$TAG" docker push "$REGISTRY/$IMG:$TAG" done done