Files
schalli a6ffe05150 feat(18-02): Task 1 — Job desktop (Linux-AppImage) und Uebergabe an publish per actions/cache
- Neuer CI-Job desktop nach test, laeuft auf main und bei Tags v* (Systemabhaengigkeiten,
  Rust-Toolchain per rustup, Cargo-Zwischenspeicher, Version setzen, cargo check/clippy,
  alte Bundles entfernen, Linux-AppImage bauen, desktop-collect.sh --require linux,
  Uebergabe per actions/cache/save mit Schluessel desktop-dist-${{ gitea.sha }})
- publish haengt jetzt an desktop (needs: desktop) statt an test, holt die Pakete per
  actions/cache/restore mit fail-on-cache-miss: true und prueft das Manifest hart
- publish-images.sh bricht im echten Baupfad ohne desktop-dist/manifest.json ab
  (zweites Netz gegen einen Cache-Fehlschlag, D-08/Pitfall 1)

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-16 16:21:09 +02:00

80 lines
2.8 KiB
Bash
Executable File

#!/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