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}..."