diff --git a/Tools/image-veroeffentlichen.sh b/Tools/image-veroeffentlichen.sh index a882af8..01f6646 100755 --- a/Tools/image-veroeffentlichen.sh +++ b/Tools/image-veroeffentlichen.sh @@ -53,6 +53,24 @@ if command -v python3 >/dev/null && [ -f Tools/tokens-pruefen.py ]; then } fi +# Fragt die Registry, welcher Stand dort unter `latest` liegt. +# +# Anonym — das Paket ist öffentlich lesbar. Schlägt es fehl, ist die Antwort +# leer, und der Aufrufer entscheidet, was das bedeutet. +registry_digest() { + local token + token=$(curl -fsS --max-time 20 \ + "https://$REGISTRY/v2/token?scope=repository:$PFAD:pull&service=container_registry" \ + | python3 -c 'import json,sys;print(json.load(sys.stdin).get("token",""))' 2>/dev/null) || return 1 + [ -n "$token" ] || return 1 + + curl -fsS --max-time 20 -D- -o /dev/null \ + -H "Authorization: Bearer $token" \ + -H "Accept: application/vnd.oci.image.index.v1+json" \ + "https://$REGISTRY/v2/$PFAD/manifests/latest" 2>/dev/null \ + | awk 'BEGIN{IGNORECASE=1} /^docker-content-digest:/ {print $2}' | tr -d '\r' +} + MARKEN=(-t "$BILD:latest") [ -n "$FASSUNG" ] && MARKEN+=(-t "$BILD:$FASSUNG") @@ -61,14 +79,49 @@ MARKEN=(-t "$BILD:latest") docker buildx inspect flaro-bauer >/dev/null 2>&1 \ || docker buildx create --name flaro-bauer --use >/dev/null +# **Den Digest festhalten, bevor gebaut wird.** Nur so lässt sich hinterher +# sagen, ob wirklich etwas Neues angekommen ist. +vorher=$(registry_digest || true) + echo "Baue $BILD für $PLATTFORMEN." -docker buildx build \ +if ! docker buildx build \ --builder flaro-bauer \ --platform "$PLATTFORMEN" \ -f server/Dockerfile \ "${MARKEN[@]}" \ - --push . + --push . ; then + echo + echo "Der Bau oder das Hochladen ist gescheitert. In der Registry liegt weiter:" + echo " ${vorher:-nichts}" + exit 1 +fi + +# **Nachsehen, statt zu glauben.** +# +# `docker buildx build --push` hat bei einem abgebrochenen Upload schon mit +# Rückgabewert 0 beendet, nachdem es „ERROR: failed to build" gedruckt hatte — +# ein TLS-Zeitlimit mitten im Hochladen. Das Skript meldete Erfolg, in der +# Registry lag das alte Image, und auf dem NAS kam eine Fassung an, die +# niemand gebaut hatte. Seitdem wird gefragt, nicht vertraut. +nachher=$(registry_digest || true) + +if [ -z "$nachher" ]; then + echo + echo "Die Registry antwortet nicht auf $BILD:latest — hochgeladen wurde offenbar nichts." + exit 1 +fi + +if [ -n "$vorher" ] && [ "$vorher" = "$nachher" ]; then + echo + echo "In der Registry liegt noch derselbe Stand wie vorher:" + echo " $nachher" + echo "Das Hochladen ist also nicht durchgekommen. Noch einmal versuchen." + exit 1 +fi echo -echo "Fertig. Auf dem NAS:" +echo "Fertig. In der Registry liegt jetzt:" +echo " $nachher" +echo +echo "Auf dem NAS:" echo " image: $BILD:${FASSUNG:-latest}"