#!/usr/bin/env bash set -Eeuo pipefail ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" BUILD_SCRIPT="${ROOT}/build-and-push-gitea.sh" usage() { cat <<'EOF' Verwendung: ./release.sh Beispiele: ./release.sh 3.3 ./release.sh v3.3 ./release.sh V3.3 ./release.sh 3.3.1 Ablauf: 1. git add -A 2. git commit -m "V" 3. git push origin 4. Docker-Build + Push nach Gitea 5. Versionstag + latest Voraussetzungen: - Git-Push funktioniert über deinen konfigurierten origin-Remote. - Docker kann als aktueller Benutzer ausgeführt werden: docker ps - Einmalig bei der Gitea Registry anmelden: docker login git.d-razz.de -u michael EOF } VERSION_RAW="${1:-}" if [[ -z "${VERSION_RAW}" ]]; then usage exit 1 fi VERSION="${VERSION_RAW#V}" VERSION="${VERSION#v}" if [[ ! "${VERSION}" =~ ^[0-9]+\.[0-9]+(\.[0-9]+)?$ ]]; then echo "FEHLER: Ungültige Version '${VERSION_RAW}'." echo "Erwartet z.B. 3.3, v3.3, V3.3 oder 3.3.1" exit 1 fi COMMIT_MESSAGE="V${VERSION}" IMAGE_TAG="V${VERSION}" command -v git >/dev/null 2>&1 || { echo "FEHLER: git wurde nicht gefunden." exit 1 } command -v docker >/dev/null 2>&1 || { echo "FEHLER: docker wurde nicht gefunden." exit 1 } docker info >/dev/null 2>&1 || { echo "FEHLER: Docker ist für den aktuellen Benutzer nicht erreichbar." echo echo "Teste:" echo " docker ps" echo echo "Falls Permission denied:" echo " sudo usermod -aG docker $USER" echo " newgrp docker" exit 1 } [[ -x "${BUILD_SCRIPT}" ]] || { echo "FEHLER: ${BUILD_SCRIPT} fehlt oder ist nicht ausführbar." echo "Fix:" echo " chmod +x ${BUILD_SCRIPT}" exit 1 } cd "${ROOT}" git rev-parse --is-inside-work-tree >/dev/null 2>&1 || { echo "FEHLER: ${ROOT} ist kein Git-Repository." exit 1 } REMOTE="$(git remote get-url origin 2>/dev/null || true)" if [[ -z "${REMOTE}" ]]; then echo "FEHLER: Git-Remote 'origin' fehlt." exit 1 fi # owner/repo + Registry aus SSH- oder HTTPS-Remote ableiten. # Unterstützt z.B.: # git@git.d-razz.de:michael/fixfin.git # ssh://git@git.d-razz.de/michael/fixfin.git # https://git.d-razz.de/michael/fixfin.git if [[ "${REMOTE}" =~ ^git@([^:]+):(.+)$ ]]; then REGISTRY="${BASH_REMATCH[1]}" IMAGE_PATH="${BASH_REMATCH[2]}" elif [[ "${REMOTE}" =~ ^ssh://git@([^/]+)/(.+)$ ]]; then REGISTRY="${BASH_REMATCH[1]}" IMAGE_PATH="${BASH_REMATCH[2]}" elif [[ "${REMOTE}" =~ ^https?://([^/]+)/(.+)$ ]]; then REGISTRY="${BASH_REMATCH[1]}" IMAGE_PATH="${BASH_REMATCH[2]}" else echo "FEHLER: origin konnte nicht ausgewertet werden:" echo " ${REMOTE}" exit 1 fi IMAGE_PATH="${IMAGE_PATH%.git}" if [[ ! "${IMAGE_PATH}" =~ ^[^/]+/[^/]+$ ]]; then echo "FEHLER: owner/repo konnte nicht sicher ermittelt werden:" echo " ${IMAGE_PATH}" exit 1 fi BRANCH="$(git symbolic-ref --quiet --short HEAD || true)" if [[ -z "${BRANCH}" ]]; then echo "FEHLER: Detached HEAD. Bitte zuerst einen Branch auschecken." exit 1 fi echo echo "============================================================" echo " FixFin Release ${COMMIT_MESSAGE}" echo "============================================================" echo echo "Repository : ${REMOTE}" echo "Branch : ${BRANCH}" echo "Registry : ${REGISTRY}" echo "Image : ${REGISTRY}/${IMAGE_PATH}" echo "Tags : ${IMAGE_TAG}, latest" echo echo ">>> Prüfe Git-Remote ..." git ls-remote origin HEAD >/dev/null echo ">>> Stage Änderungen ..." git add -A if git diff --cached --quiet; then echo echo "FEHLER: Keine Änderungen zum Committen vorhanden." echo "Es wurde nichts gepusht oder gebaut." exit 2 fi echo ">>> Commit ${COMMIT_MESSAGE} ..." git commit -m "${COMMIT_MESSAGE}" echo ">>> Git Push ..." git push origin "${BRANCH}" echo echo ">>> Docker Build + Push ..." "${BUILD_SCRIPT}" \ "${REGISTRY}" \ "${IMAGE_PATH}" \ "${IMAGE_TAG}" \ "latest" echo echo "============================================================" echo " Release fertig" echo "============================================================" echo echo "Git:" echo " ${COMMIT_MESSAGE}" echo echo "Docker:" echo " ${REGISTRY}/${IMAGE_PATH}:${IMAGE_TAG}" echo " ${REGISTRY}/${IMAGE_PATH}:latest"