Files
2026-08-18 09:37:59 +02:00

181 lines
4.1 KiB
Bash
Executable File

#!/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 <version>
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<version>"
3. git push origin <branch>
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"