#!/usr/bin/env bash set -euo pipefail readonly SCRIPT_DIR="$(CDPATH= cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)" readonly REGISTRY_IMAGE="${REGISTRY_IMAGE:-registry.assecutor.org/votianng}" readonly BACKEND_DIR="${SCRIPT_DIR}/backend" usage() { cat <<'EOF' Verwendung: ./docker_push.sh [tag] Beispiel: ./docker_push.sh 0.1 ./docker_push.sh Voraussetzungen: - Java 21 sowie Node.js 22.12 oder neuer mit npm - Docker läuft und Docker Buildx ist installiert - Login zur Registry wurde bereits ausgeführt: docker login registry.assecutor.org Ohne Tag wird die Version aus backend/pom.xml verwendet (auch SNAPSHOT-Versionen). Ein expliziter Tag ändert nur den Image-Tag, nicht die Maven-Projektversion. REGISTRY_IMAGE überschreibt das Standardziel registry.assecutor.org/votianng. Gebaut werden React und das Backend einschließlich Tests für linux/amd64. EOF } fail() { echo "Fehler: $*" >&2 exit 1 } require_command() { command -v "$1" >/dev/null 2>&1 || fail "'$1' wurde nicht gefunden." } resolve_pom_value() { local value value="$( cd "${BACKEND_DIR}" && ./mvnw -q -Dstyle.color=never -DforceStdout help:evaluate -Dexpression="$1" \ | sed $'s/\033\\[[0-9;]*m//g' \ | awk 'NF { last = $0 } END { print last }' )" || fail "Maven-Wert '$1' konnte nicht ermittelt werden." [[ -n "${value}" && "${value}" != *"null object or invalid expression"* ]] \ || fail "Maven-Wert '$1' ist leer oder ungültig." printf '%s\n' "${value}" } [[ $# -le 1 ]] || fail "Erwartet wird höchstens ein Image-Tag. Siehe --help." if [[ "${1:-}" == "-h" || "${1:-}" == "--help" ]]; then usage exit 0 fi require_command java require_command npm require_command docker [[ -x "${BACKEND_DIR}/mvnw" ]] || fail "'${BACKEND_DIR}/mvnw' wurde nicht gefunden oder ist nicht ausführbar." [[ -x "${SCRIPT_DIR}/build.sh" ]] || fail "'${SCRIPT_DIR}/build.sh' wurde nicht gefunden oder ist nicht ausführbar." [[ -f "${SCRIPT_DIR}/Dockerfile" ]] || fail "'${SCRIPT_DIR}/Dockerfile' wurde nicht gefunden." VERSION="${1-$(resolve_pom_value project.version)}" if [[ ! "${VERSION}" =~ ^[a-zA-Z0-9_][a-zA-Z0-9_.-]{0,127}$ ]]; then fail "Ungültiger Image-Tag: erlaubt sind maximal 128 Zeichen aus Buchstaben, Ziffern, _, . und -; am Anfang weder . noch -." fi docker buildx version >/dev/null 2>&1 || fail "Docker Buildx ist nicht verfügbar." docker info >/dev/null 2>&1 || fail "Docker-Daemon ist nicht erreichbar. Bitte Docker starten." JAR_FILE_REL="backend/target/$(resolve_pom_value project.build.finalName).jar" JAR_FILE_ABS="${SCRIPT_DIR}/${JAR_FILE_REL}" echo "Verwende Image-Tag ${VERSION}." echo "Baue React-Frontend und Spring-Boot-Backend einschließlich Tests ..." "${SCRIPT_DIR}/build.sh" [[ -f "${JAR_FILE_ABS}" ]] || fail "Backend-JAR wurde nicht gefunden: ${JAR_FILE_ABS}" echo "Pushe Image ${REGISTRY_IMAGE}:${VERSION} ..." docker buildx build \ --platform linux/amd64 \ -f "${SCRIPT_DIR}/Dockerfile" \ --build-arg "JAR_FILE=${JAR_FILE_REL}" \ -t "${REGISTRY_IMAGE}:${VERSION}" \ --push \ "${SCRIPT_DIR}" echo "Fertig: ${REGISTRY_IMAGE}:${VERSION}"