Merge pull request 'Fix: update.sh vor Selbstmodifikation während der Ausführung schützen' (#5) from fds2610-bot/FSCash:main into main

Reviewed-on: https://codeberg.org/fds2610/FSCash/pulls/5
This commit is contained in:
fds2610 2026-07-23 19:18:06 +02:00
commit 5830fd85cb

View file

@ -12,36 +12,41 @@
set -euo pipefail set -euo pipefail
PROJECT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # Die gesamte Logik steckt bewusst in einer Funktion, die erst ganz am Ende
WEBROOT="${WEBROOT:-/var/www/html}" # der Datei aufgerufen wird: Bash liest eine Funktionsdefinition komplett ein,
CONFIG_FILE="${CONFIG_FILE:-$WEBROOT/config.php}" # bevor sie ausgeführt wird. Würde der Skriptkörper stattdessen direkt (ohne
# Funktion) ausgeführt, könnte der "git pull" in Schritt 2 die Datei auf der
# Festplatte mitten in der Ausführung verändern - Bash liest dann ab diesem
# Punkt inkonsistente/veraltete Zeilen nach und das Skript verhält sich
# unvorhersehbar (genau das ist ohne dieses main()-Pattern schon passiert).
main() {
PROJECT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
WEBROOT="${WEBROOT:-/var/www/html}"
CONFIG_FILE="${CONFIG_FILE:-$WEBROOT/config.php}"
log() { echo "==> $*"; } cd "$PROJECT_DIR"
fail() { echo "FEHLER: $*" >&2; exit 1; }
cd "$PROJECT_DIR" command -v php >/dev/null 2>&1 || fail "php ist nicht installiert bzw. nicht im PATH."
[ -d "$WEBROOT" ] || fail "Webroot $WEBROOT existiert nicht."
[ -w "$WEBROOT" ] || fail "Keine Schreibrechte auf $WEBROOT."
command -v php >/dev/null 2>&1 || fail "php ist nicht installiert bzw. nicht im PATH." # --- 1. Sicherstellen, dass das Projektverzeichnis sauber ist ---
[ -d "$WEBROOT" ] || fail "Webroot $WEBROOT existiert nicht." if ! git diff --quiet || ! git diff --cached --quiet; then
[ -w "$WEBROOT" ] || fail "Keine Schreibrechte auf $WEBROOT."
# --- 1. Sicherstellen, dass das Projektverzeichnis sauber ist ---
if ! git diff --quiet || ! git diff --cached --quiet; then
fail "Lokale Änderungen im Projektverzeichnis vorhanden - bitte erst committen oder stashen." fail "Lokale Änderungen im Projektverzeichnis vorhanden - bitte erst committen oder stashen."
fi fi
# --- 2. Neuesten Stand holen --- # --- 2. Neuesten Stand holen ---
log "git pull..." log "git pull..."
git pull --ff-only git pull --ff-only
# --- 3. PHP-Syntaxcheck als Sicherheitsnetz vor dem Kopieren --- # --- 3. PHP-Syntaxcheck als Sicherheitsnetz vor dem Kopieren ---
log "Prüfe PHP-Syntax..." log "Prüfe PHP-Syntax..."
while IFS= read -r -d '' file; do while IFS= read -r -d '' file; do
php -l "$file" >/dev/null || fail "Syntaxfehler in $file - es wird nichts kopiert." php -l "$file" >/dev/null || fail "Syntaxfehler in $file - es wird nichts kopiert."
done < <(find html -name '*.php' -print0) done < <(find html -name '*.php' -print0)
# --- 4. Unit-Tests: müssen grün sein, bevor irgendetwas deployt wird --- # --- 4. Unit-Tests: müssen grün sein, bevor irgendetwas deployt wird ---
if [ -f tests/run.sh ]; then if [ -f tests/run.sh ]; then
if [ ! -x vendor/bin/phpunit ]; then if [ ! -x vendor/bin/phpunit ]; then
command -v composer >/dev/null 2>&1 || fail "composer ist nicht installiert - wird für die Tests benötigt." command -v composer >/dev/null 2>&1 || fail "composer ist nicht installiert - wird für die Tests benötigt."
log "Installiere Test-Abhängigkeiten (composer install)..." log "Installiere Test-Abhängigkeiten (composer install)..."
@ -49,29 +54,35 @@ if [ -f tests/run.sh ]; then
fi fi
log "Führe Tests aus..." log "Führe Tests aus..."
bash tests/run.sh || fail "Tests fehlgeschlagen - es wird nichts deployt. Siehe Ausgabe oben." bash tests/run.sh || fail "Tests fehlgeschlagen - es wird nichts deployt. Siehe Ausgabe oben."
else else
log "Noch keine Tests vorhanden - werden später ergänzt." log "Noch keine Tests vorhanden - werden später ergänzt."
fi fi
# --- 5. Dateien kopieren, config.php bleibt unangetastet --- # --- 5. Dateien kopieren, config.php bleibt unangetastet ---
log "Kopiere Dateien nach $WEBROOT..." log "Kopiere Dateien nach $WEBROOT..."
config_backup="" config_backup=""
if [ -f "$CONFIG_FILE" ]; then if [ -f "$CONFIG_FILE" ]; then
config_backup="$(mktemp)" config_backup="$(mktemp)"
cp "$CONFIG_FILE" "$config_backup" cp "$CONFIG_FILE" "$config_backup"
fi fi
cp -r html/. "$WEBROOT/" cp -r html/. "$WEBROOT/"
if [ -n "$config_backup" ]; then if [ -n "$config_backup" ]; then
cp "$config_backup" "$CONFIG_FILE" cp "$config_backup" "$CONFIG_FILE"
rm -f "$config_backup" rm -f "$config_backup"
fi fi
# --- 6. Datenbank-Migrationen --- # --- 6. Datenbank-Migrationen ---
if [ -d migrations ] && [ -f migrations/run_migrations.php ]; then if [ -d migrations ] && [ -f migrations/run_migrations.php ]; then
log "Wende Datenbank-Migrationen an..." log "Wende Datenbank-Migrationen an..."
php migrations/run_migrations.php "$CONFIG_FILE" php migrations/run_migrations.php "$CONFIG_FILE"
fi fi
log "Update abgeschlossen." log "Update abgeschlossen."
}
log() { echo "==> $*"; }
fail() { echo "FEHLER: $*" >&2; exit 1; }
main "$@"