#!/usr/bin/env bash set -euo pipefail readonly SCRIPT_DIR="$(CDPATH= cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)" # Paket-Registry des Gitea auf gitea.appcreation.de; der Pfad ist dort # //. readonly REGISTRY_IMAGE="gitea.appcreation.de/appcreation/swyxweb" readonly BACKEND_DIR="${SCRIPT_DIR}/backend" readonly PLATFORM="linux/amd64" usage() { cat <<'EOF' Verwendung: ./docker_push.sh [x.y.z] [--dry-run] Beispiel: ./docker_push.sh 0.9.13 ./docker_push.sh ./docker_push.sh 0.9.13 --dry-run # nur bauen, nicht pushen Voraussetzungen: - Docker Buildx ist installiert - Login zur Registry wurde bereits ausgeführt: docker login gitea.appcreation.de Ohne Versionsargument wird die Version aus backend/pom.xml verwendet. Gebaut wird das Dockerfile im Wurzelverzeichnis: Es übersetzt Frontend *und* Backend selbst, ein vorheriger lokaler Maven- oder npm-Lauf ist also nicht nötig. Der SwyxTray-Mock ist im Image nicht enthalten (Profil "mock"). EOF } fail() { echo "Fehler: $*" >&2 exit 1 } require_command() { command -v "$1" >/dev/null 2>&1 || fail "'$1' wurde nicht gefunden." } # Die Version steht in backend/pom.xml; ausgelesen wird sie mit dem Maven- # Wrapper des Backends (backend/mvnw), nicht mit einem global installierten Maven. resolve_pom_version() { [[ -x "${BACKEND_DIR}/mvnw" ]] || fail "'${BACKEND_DIR}/mvnw' wurde nicht gefunden oder ist nicht ausführbar." local version version="$( cd "${BACKEND_DIR}" && ./mvnw -q -DforceStdout help:evaluate -Dexpression=project.version \ | awk 'NF { last = $0 } END { print last }' )" [[ -n "${version}" ]] || fail "Version konnte nicht aus der pom.xml ermittelt werden." echo "${version}" } VERSION="" DRY_RUN=false for arg in "$@"; do case "${arg}" in -h|--help) usage exit 0 ;; --dry-run) DRY_RUN=true ;; -*) fail "Unbekannte Option '${arg}'." ;; *) [[ -z "${VERSION}" ]] || fail "Es ist nur eine Versionsnummer erlaubt." VERSION="${arg}" ;; esac done [[ -n "${VERSION}" ]] || VERSION="$(resolve_pom_version)" # -SNAPSHOT ist zugelassen, weil die pom.xml zurzeit 0.0.1-SNAPSHOT trägt. if [[ ! "${VERSION}" =~ ^[0-9]+\.[0-9]+\.[0-9]+(-SNAPSHOT)?$ ]]; then fail "Versionsnummer muss das Format x.y.z oder x.y.z-SNAPSHOT haben (war: '${VERSION}')." fi require_command docker docker buildx version >/dev/null 2>&1 || fail "Docker Buildx ist nicht verfügbar." cd "${SCRIPT_DIR}" if [[ "${DRY_RUN}" == true ]]; then echo "Baue Image ${REGISTRY_IMAGE}:${VERSION} für ${PLATFORM} (dry run, kein Push) ..." docker buildx build \ --platform "${PLATFORM}" \ -f "${SCRIPT_DIR}/Dockerfile" \ -t "${REGISTRY_IMAGE}:${VERSION}" \ "${SCRIPT_DIR}" echo "Fertig gebaut, nicht gepusht: ${REGISTRY_IMAGE}:${VERSION}" exit 0 fi echo "Baue und pushe Image ${REGISTRY_IMAGE}:${VERSION} für ${PLATFORM} ..." docker buildx build \ --platform "${PLATFORM}" \ -f "${SCRIPT_DIR}/Dockerfile" \ -t "${REGISTRY_IMAGE}:${VERSION}" \ --push \ "${SCRIPT_DIR}" echo "Fertig: ${REGISTRY_IMAGE}:${VERSION}"