V3.3
This commit is contained in:
Executable
+176
@@ -0,0 +1,176 @@
|
||||
#!/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 3.3.1
|
||||
|
||||
Ablauf:
|
||||
1. git add -A
|
||||
2. git commit -m "V<version>"
|
||||
3. git push über origin/SSH
|
||||
4. build-and-push-gitea.sh
|
||||
5. Docker-Image mit Versionstag pushen
|
||||
6. denselben Stand zusätzlich als :latest markieren
|
||||
|
||||
Voraussetzungen:
|
||||
- origin zeigt per SSH auf Gitea, z.B.
|
||||
git@git.d-razz.de:mboehmlaender/fixfin.git
|
||||
- Docker-Registry einmalig für root angemeldet:
|
||||
sudo docker login git.d-razz.de
|
||||
EOF
|
||||
}
|
||||
|
||||
VERSION_RAW="${1:-}"
|
||||
|
||||
if [[ -z "${VERSION_RAW}" ]]; then
|
||||
usage
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# V/v am Anfang entfernen und anschließend einheitlich als Vx.x verwenden.
|
||||
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 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
|
||||
}
|
||||
|
||||
[[ -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
|
||||
|
||||
# Registry-Host und owner/repo automatisch aus einem SSH-Remote ableiten.
|
||||
# Unterstützt:
|
||||
# git@host:owner/repo.git
|
||||
# ssh://git@host/owner/repo.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]}"
|
||||
else
|
||||
echo "FEHLER: origin ist kein unterstützter SSH-Remote:"
|
||||
echo " ${REMOTE}"
|
||||
echo
|
||||
echo "Erwartet z.B.:"
|
||||
echo " git@git.d-razz.de:mboehmlaender/fixfin.git"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
IMAGE_PATH="${IMAGE_PATH%.git}"
|
||||
|
||||
# Sicherheitsprüfung
|
||||
if [[ ! "${IMAGE_PATH}" =~ ^[^/]+/[^/]+$ ]]; then
|
||||
echo "FEHLER: owner/repo konnte aus dem Remote 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 "Tag : ${IMAGE_TAG} + latest"
|
||||
echo
|
||||
|
||||
echo ">>> Prüfe SSH-Zugriff auf origin ..."
|
||||
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 über SSH ..."
|
||||
git push origin "${BRANCH}"
|
||||
|
||||
echo
|
||||
echo ">>> Docker Registry Authentifizierung prüfen ..."
|
||||
# sudo wird hier einmal initialisiert. Docker-Registry-Credentials liegen
|
||||
# danach dauerhaft in der Docker-Konfiguration des root-Benutzers, sofern
|
||||
# zuvor 'sudo docker login <registry>' ausgeführt wurde.
|
||||
sudo -v
|
||||
|
||||
echo
|
||||
echo ">>> Build + Push ${IMAGE_TAG} ..."
|
||||
sudo "${BUILD_SCRIPT}" \
|
||||
"${REGISTRY}" \
|
||||
"${IMAGE_PATH}" \
|
||||
"${IMAGE_TAG}"
|
||||
|
||||
echo
|
||||
echo ">>> Markiere denselben Image-Stand zusätzlich als latest ..."
|
||||
sudo docker buildx imagetools create \
|
||||
--tag "${REGISTRY}/${IMAGE_PATH}:latest" \
|
||||
"${REGISTRY}/${IMAGE_PATH}:${IMAGE_TAG}"
|
||||
|
||||
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"
|
||||
echo
|
||||
Reference in New Issue
Block a user