#!/usr/bin/env bash set -euo pipefail readonly SCRIPT_DIR="$(CDPATH= cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)" readonly PROJECT_DIR="${SCRIPT_DIR}" readonly DEFAULT_REGISTRY_IMAGE="registry.assecutor.org/emulatorstation" readonly REGISTRY_IMAGE="${REGISTRY_IMAGE:-${DEFAULT_REGISTRY_IMAGE}}" usage() { cat <<'EOF' Verwendung: ./docker_push.sh [x.y.z] Beispiele: ./docker_push.sh 0.9.13 ./docker_push.sh Voraussetzungen: - Docker Buildx ist installiert - Login zur Registry wurde bereits ausgeführt: docker login registry.assecutor.org Hinweise: - Ohne Versionsargument wird die Version aus der pom.xml als Docker-Tag verwendet. - Das JAR wird immer mit der aktuellen Projektversion aus der pom.xml gebaut. - Das Ziel-Image kann optional per Umgebungsvariable überschrieben werden: REGISTRY_IMAGE=registry.assecutor.org/mein-image ./docker_push.sh EOF } fail() { echo "Fehler: $*" >&2 exit 1 } require_command() { command -v "$1" >/dev/null 2>&1 || fail "'$1' wurde nicht gefunden." } build_production_jar() { echo "Baue Production-JAR ${JAR_FILE_REL} ..." ( cd "${PROJECT_DIR}" && ./mvnw -Pproduction -DskipTests clean package ) [[ -f "${JAR_FILE_ABS}" ]] || fail "Production-JAR wurde nicht gefunden: ${JAR_FILE_ABS}" } resolve_pom_value() { local expression="$1" [[ -x "${PROJECT_DIR}/mvnw" ]] || fail "'${PROJECT_DIR}/mvnw' wurde nicht gefunden oder ist nicht ausführbar." local value value="$( cd "${PROJECT_DIR}" && ./mvnw -q -DforceStdout help:evaluate -Dexpression="${expression}" \ | awk 'NF { last = $0 } END { print last }' )" [[ -n "${value}" ]] || fail "Wert '${expression}' konnte nicht aus der pom.xml ermittelt werden." echo "${value}" } if [[ "${1:-}" == "-h" || "${1:-}" == "--help" ]]; then usage exit 0 fi readonly PROJECT_VERSION="$(resolve_pom_value project.version)" readonly ARTIFACT_ID="$(resolve_pom_value project.artifactId)" readonly IMAGE_TAG="${1:-${PROJECT_VERSION}}" if [[ ! "${IMAGE_TAG}" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then fail "Versionsnummer muss das Format x.y.z haben." fi require_command docker docker buildx version >/dev/null 2>&1 || fail "Docker Buildx ist nicht verfügbar." readonly JAR_FILE_REL="target/${ARTIFACT_ID}-${PROJECT_VERSION}.jar" readonly JAR_FILE_ABS="${PROJECT_DIR}/${JAR_FILE_REL}" cd "${PROJECT_DIR}" echo "Verwende Build-Version ${PROJECT_VERSION} und Image-Tag ${IMAGE_TAG}." build_production_jar echo "Pushe Image ${REGISTRY_IMAGE}:${IMAGE_TAG} ..." docker buildx build \ --platform linux/amd64 \ -f "${PROJECT_DIR}/Dockerfile" \ -t "${REGISTRY_IMAGE}:${IMAGE_TAG}" \ --push \ "${PROJECT_DIR}" echo "Fertig: ${REGISTRY_IMAGE}:${IMAGE_TAG}"