From 25f8acacc6220c739f42c358a3cee7683d84ed87 Mon Sep 17 00:00:00 2001 From: fds2610-bot Date: Tue, 1 Sep 2026 17:45:42 +0200 Subject: [PATCH] Update bricht nicht mehr an unversionierten Laufzeitdateien ab Auf dem Produktionsserver scheiterte "update.sh" an der untracked hosts.conf: seit Issue #70 schreibt check_fds.sh diese Datei bei jedem Lauf neu, versioniert ist nur hosts-sample.conf - in .gitignore stand sie aber (anders als monitor-api.conf und credentials.conf) nicht. - hosts.conf in .gitignore aufgenommen - update.sh blockiert nur noch bei Aenderungen an versionierten Dateien und listet sie auf; unversionierte Dateien werden nur als Hinweis geloggt, denn der ff-only-Pull laesst sie unangetastet bzw. bricht selbst kontrolliert ab - neuer Notausgang UPDATE_ALLOW_DIRTY=1 fuer den Fall, dass doch einmal an einer versionierten Datei gedreht wurde Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01HBVdYcfaXNq49bMdQQcZue --- .gitignore | 3 +++ README_UPDATE.md | 8 +++++--- update.sh | 24 ++++++++++++++++++++++-- 3 files changed, 30 insertions(+), 5 deletions(-) diff --git a/.gitignore b/.gitignore index 2f136e5..9f975ee 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,6 @@ deploy-webhook.log .phpunit.result.cache monitor-api.conf credentials.conf +# Wird von check_fds.sh bei jedem Lauf aus der API neu geschrieben (Issue #70), +# versioniert ist nur hosts-sample.conf. +hosts.conf diff --git a/README_UPDATE.md b/README_UPDATE.md index 7d6f628..44e193f 100644 --- a/README_UPDATE.md +++ b/README_UPDATE.md @@ -31,9 +31,11 @@ daher hier nur als Checkliste: 1. **Repo auskecken.** `git clone https://codeberg.org/fds2610/monitor.git` (oder per SSH, falls Push-Zugangsdaten fuer `git pull` als Deploy-Key/SSH-Key eingerichtet werden) nach - z.B. `/opt/monitor`, Branch `main` ausgecheckt. Der Arbeitsbaum muss beim Update sauber - sein - `update.sh` bricht kontrolliert ab, wenn lokale Aenderungen vorhanden sind, statt sie - zu ueberschreiben. + z.B. `/opt/monitor`, Branch `main` ausgecheckt. Versionierte Dateien duerfen dort nicht + lokal veraendert werden - `update.sh` bricht kontrolliert ab, statt die Aenderungen zu + ueberschreiben (Notausgang: `UPDATE_ALLOW_DIRTY=1`). Unversionierte Dateien neben dem Repo + (`.env`, `hosts.conf`, `monitor-api.conf`, `credentials.conf`) stoeren dagegen nicht, sie + bleiben beim Update unangetastet. 2. **Docker + Docker Compose** installieren (`docker compose version` muss funktionieren). Der Benutzer, unter dem `deploy-webhook.py` laeuft, braucht Mitgliedschaft in der `docker`-Gruppe (oder aequivalente Rechte), um `docker compose` ohne `sudo` aufzurufen. diff --git a/update.sh b/update.sh index b4700c9..d066910 100644 --- a/update.sh +++ b/update.sh @@ -10,6 +10,8 @@ # UPDATE_REMOTE - Git-Remote, aus dem geholt wird (Default: origin) # UPDATE_BRANCH - Branch, der aktualisiert wird (Default: aktuell ausgecheckter Branch) # UPDATE_RUN_TESTS - "0" setzen, um die Testsuiten nach dem Update zu ueberspringen (Default: 1) +# UPDATE_ALLOW_DIRTY - "1" setzen, um auch bei lokalen Aenderungen an versionierten Dateien +# weiterzumachen (Default: 0, d.h. kontrollierter Abbruch) set -euo pipefail @@ -33,9 +35,27 @@ git -C "$REPO_DIR" rev-parse --is-inside-work-tree >/dev/null 2>&1 \ UPDATE_REMOTE="${UPDATE_REMOTE:-origin}" UPDATE_BRANCH="${UPDATE_BRANCH:-$(git rev-parse --abbrev-ref HEAD)}" UPDATE_RUN_TESTS="${UPDATE_RUN_TESTS:-1}" +UPDATE_ALLOW_DIRTY="${UPDATE_ALLOW_DIRTY:-0}" -if [ -n "$(git status --porcelain)" ]; then - fail "Lokale Aenderungen/unversionierte Dateien vorhanden - bitte erst committen/stashen. Breche ab, um nichts zu ueberschreiben." +# Unversionierte Dateien blockieren das Update bewusst NICHT: neben dem Repo liegen auf einem +# Produktionsserver Laufzeit-/Konfigurationsdateien (hosts.conf, monitor-api.conf, ...), die +# beim ff-only-Pull ohnehin unangetastet bleiben - stuende eine davon einem neuen Commit im +# Weg, bricht git selbst kontrolliert ab. Blockierend sind nur Aenderungen an versionierten +# Dateien, weil der Pull die verlieren koennte. +DIRTY_TRACKED="$(git status --porcelain --untracked-files=no)" +if [ -n "$DIRTY_TRACKED" ]; then + printf '%s\n' "$DIRTY_TRACKED" >&2 + if [ "$UPDATE_ALLOW_DIRTY" = "1" ]; then + log "Warnung: lokale Aenderungen an versionierten Dateien (siehe oben), UPDATE_ALLOW_DIRTY=1 - fahre trotzdem fort." + else + fail "Lokale Aenderungen an versionierten Dateien (siehe oben) - bitte erst committen/stashen (oder UPDATE_ALLOW_DIRTY=1 setzen). Breche ab, um nichts zu ueberschreiben." + fi +fi + +UNTRACKED="$(git ls-files --others --exclude-standard)" +if [ -n "$UNTRACKED" ]; then + log "Hinweis: unversionierte Dateien im Arbeitsbaum, sie bleiben unveraendert:" + printf '%s\n' "$UNTRACKED" | sed 's/^/ /' fi log "Hole Aenderungen von ${UPDATE_REMOTE}/${UPDATE_BRANCH}..."