From 7a0cf0abb4c3e74e71b12943149baab7d9a32627 Mon Sep 17 00:00:00 2001 From: dschlueter Date: Thu, 25 Jun 2026 00:58:09 +0200 Subject: [PATCH] =?UTF-8?q?ci:=20pre-push-Hook=20+=20Installer=20f=C3=BCr?= =?UTF-8?q?=20lokalen=20Test-Gate?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit scripts/git-hooks/pre-push lässt pytest vor jedem Push laufen und bricht bei roten Tests ab — automatischer Regressionsschutz ohne Forgejo-Runner. scripts/install-hooks.sh installiert die versionierten Hooks nach .git/hooks (das selbst nicht versioniert ist). In DEPLOYMENT.md Teil 4.0 dokumentiert. Co-Authored-By: Claude Sonnet 4.6 --- DEPLOYMENT.md | 13 +++++++++++++ scripts/git-hooks/pre-push | 23 +++++++++++++++++++++++ scripts/install-hooks.sh | 17 +++++++++++++++++ 3 files changed, 53 insertions(+) create mode 100644 scripts/git-hooks/pre-push create mode 100755 scripts/install-hooks.sh diff --git a/DEPLOYMENT.md b/DEPLOYMENT.md index f8e1c6b..b5ac8ab 100644 --- a/DEPLOYMENT.md +++ b/DEPLOYMENT.md @@ -1058,6 +1058,19 @@ sudo -u voice .venv/bin/python -m pytest -q # Erwartet: "213 passed" ``` +**Automatischer Schutz vor jedem Push (empfohlen):** Ein versionierter +`pre-push`-Hook lässt die Suite vor jedem `git push` laufen und bricht bei roten +Tests ab. Nach einem frischen Clone einmalig installieren: + +```bash +cd /opt/voice-assistant +sudo -u voice bash scripts/install-hooks.sh +``` + +Der Hook liegt unter `scripts/git-hooks/pre-push` (versioniert); `.git/hooks/` +selbst wird von Git nicht versioniert, daher der Installer. Im Notfall umgehen: +`git push --no-verify`. + Abdeckung u. a.: Stimm-/Geschlechts-Routing (`voice_for_route`), Piper Multi-Speaker (`#speaker_id`) und Gender-Code-Auflösung, Cartesia Voice-Map + nicht unterstützte Sprachen, Cartesia→Piper-Fallback. Die Fixture in `tests/conftest.py` neutralisiert diff --git a/scripts/git-hooks/pre-push b/scripts/git-hooks/pre-push new file mode 100644 index 0000000..dc859da --- /dev/null +++ b/scripts/git-hooks/pre-push @@ -0,0 +1,23 @@ +#!/usr/bin/env bash +# pre-push: Die Test-Suite muss gruen sein, sonst wird der Push abgebrochen. +# Installation: scripts/install-hooks.sh | Im Notfall umgehen: git push --no-verify +set -uo pipefail + +REPO="/opt/voice-assistant" +PYTHON="$REPO/.venv/bin/python" + +echo "▶ pre-push: pytest laeuft (ca. 35 s) ..." +if [ ! -x "$PYTHON" ]; then + echo "✗ pre-push: $PYTHON nicht gefunden — Push abgebrochen." + exit 1 +fi + +cd "$REPO" || exit 1 +if ! "$PYTHON" -m pytest -q; then + echo + echo "✗ pre-push: Tests fehlgeschlagen — Push abgebrochen." + echo " (Im Notfall umgehen mit: git push --no-verify)" + exit 1 +fi +echo "✓ pre-push: alle Tests gruen — Push wird fortgesetzt." +exit 0 diff --git a/scripts/install-hooks.sh b/scripts/install-hooks.sh new file mode 100755 index 0000000..3125372 --- /dev/null +++ b/scripts/install-hooks.sh @@ -0,0 +1,17 @@ +#!/usr/bin/env bash +# Installiert die versionierten Git-Hooks aus scripts/git-hooks/ nach .git/hooks/. +# Nach jedem frischen Clone einmal ausfuehren: bash scripts/install-hooks.sh +set -euo pipefail + +ROOT="$(cd "$(dirname "$0")/.." && pwd)" +SRC="$ROOT/scripts/git-hooks" +DST="$ROOT/.git/hooks" + +mkdir -p "$DST" +for hook in "$SRC"/*; do + name="$(basename "$hook")" + cp "$hook" "$DST/$name" + chmod +x "$DST/$name" + echo "✓ installiert: $name" +done +echo "Fertig. Hooks aktiv unter $DST"