Finanzmanager/scripts/update.sh
fds2610-bot 9ae2dfea40 Fix n.n.: update.sh zieht aus dem Fork und läuft auch bei unverändertem Code weiter
Der Pull nennt Remote und Branch ausdrücklich (origin main, HTTP/1.1), damit kein
Tracking-Branch nötig ist. Quelle ist der Fork, solange es nur die Entwicklungsumgebung
gibt; für eine spätere Produktion gibt es UPDATE_REMOTE=upstream. Das Skript bricht bei
unverändertem Code nicht mehr ab, sodass Migrationen eines von Hand gezogenen Stands
nachgeholt werden. Doku (CLAUDE.md, PLAN.md, README.md, Changes.md) angepasst.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-25 15:44:08 +02:00

92 lines
3.7 KiB
Bash
Executable file

#!/usr/bin/env bash
#
# Update-Skript.
#
# Holt den Stand aus dem Fork (Remote „origin“) und spielt alles ein, was dazu
# nötig ist: Backup, Abhängigkeiten, Image-Neubau bei Bedarf, Migrationen.
#
# Es gibt derzeit nur die Entwicklungsumgebung und keinen getrennten Produktions-
# server; deshalb ist der Fork die Quelle. Der Upstream dient als Backup und zur
# Veröffentlichung. Für eine spätere Produktion: UPDATE_REMOTE=upstream setzen.
#
# ./scripts/update.sh [--no-backup] [--no-tests] [--force-rebuild]
set -euo pipefail
cd "$(dirname "${BASH_SOURCE[0]}")/.."
OHNE_BACKUP=false
OHNE_TESTS=false
NEUBAU_ERZWINGEN=false
for arg in "$@"; do
case "$arg" in
--no-backup) OHNE_BACKUP=true ;;
--no-tests) OHNE_TESTS=true ;;
--force-rebuild) NEUBAU_ERZWINGEN=true ;;
--help|-h)
echo "Aufruf: $0 [--no-backup] [--no-tests] [--force-rebuild]"
exit 0
;;
*)
echo "Unbekannte Option: $arg" >&2
exit 1
;;
esac
done
melde() { printf '\n\033[1m▸ %s\033[0m\n' "$1"; }
# ── Backup vor jeder Änderung ───────────────────────────────────────────────
if [[ "$OHNE_BACKUP" == false ]]; then
melde "Backup"
./scripts/backup.sh
fi
# ── Stand aus dem Fork holen ────────────────────────────────────────────────
melde "Code aktualisieren"
QUELLE="${UPDATE_REMOTE:-origin}"
BRANCH="main"
if ! git remote get-url "$QUELLE" >/dev/null 2>&1; then
echo "Remote „$QUELLE“ existiert nicht." >&2
exit 1
fi
VORHER="$(git rev-parse HEAD)"
# Remote und Branch stehen ausdrücklich da, damit kein Tracking nötig ist.
# HTTP/1.1, weil Codeberg bei HTTP/2 mit 504 hängen bleibt.
git -c http.version=HTTP/1.1 pull --ff-only "$QUELLE" "$BRANCH"
NACHHER="$(git rev-parse HEAD)"
# Kein vorzeitiger Abbruch bei unverändertem Code: Er kann schon von Hand gezogen worden
# sein, dann fehlen den Containern noch die Migrationen (idempotent). Ein Image-Neubau
# nach einem von Hand gezogenen Stand muss mit --force-rebuild erzwungen werden.
GEAENDERT="$(git diff --name-only "$VORHER" "$NACHHER" || true)"
# ── Image neu bauen, wenn sich die Grundlage geändert hat ───────────────────
if [[ "$NEUBAU_ERZWINGEN" == true ]] \
|| grep -qE '^(Dockerfile|composer\.(json|lock)|php/|nginx/)' <<<"$GEAENDERT"; then
melde "Container-Image neu bauen"
docker compose build --pull
fi
melde "Container starten"
docker compose up -d
# ── Migrationen ─────────────────────────────────────────────────────────────
# Der Entrypoint spielt sie beim Start bereits ein; der zweite Lauf ist
# idempotent und macht sichtbar, ob etwas fehlgeschlagen ist.
melde "Migrationen"
docker compose exec -T php php scripts/migrate.php
# ── Berechtigungen ──────────────────────────────────────────────────────────
melde "Berechtigungen"
docker compose exec -T php chown -R www-data:www-data /var/www/html/data
# ── Tests ───────────────────────────────────────────────────────────────────
if [[ "$OHNE_TESTS" == false ]]; then
melde "Tests"
docker compose exec -u www-data -T php php tests/run.php
fi
melde "Update abgeschlossen ($(git rev-parse --short HEAD))"