monitor/update.sh
fds2610-bot 6d199f8530 Codeberg-Sync als Dauerlaeufer statt manuellem Aufruf
Auf der Produktion blieb das Kanban-Board leer, obwohl die API lief und der
registrierte Agent angezeigt wurde: Tickets entstehen nur aus Agenten-Meldungen
oder aus bin/sync-codeberg.php, und das Skript war zwar als "per Cron oder
manuell" dokumentiert, wurde aber nirgends automatisch ausgefuehrt.

Neuer Compose-Service "sync": nutzt Image, Volume und SQLite-Datei des
api-Service, macht sofort beim Start einen Lauf und wiederholt ihn alle
MONITOR_SYNC_INTERVAL Sekunden (Default 600). Ein fehlgeschlagener Lauf bricht
die Schleife nicht ab, damit ein Codeberg-Ausfall keinen Restart-Loop ausloest.
Der Service verbindet sich ausschliesslich ausgehend nach codeberg.org und
braucht daher kein Port-Mapping - in Produktion sind weder Proxy- noch
Firewall-Freigaben noetig.

update.sh startet den Dienst mit, die Doku beschreibt den Service statt des
Cron-Hinweises; der manuelle Aufruf bleibt als Debug-Weg dokumentiert, weil dort
die Klartext-Fehler des Codeberg-Clients sichtbar werden.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-28 23:29:40 +02:00

74 lines
2.9 KiB
Bash

#!/bin/bash
#
# Holt die neueste Version aus dem konfigurierten Git-Repo und fuehrt die noetigen Updates
# fuer die Docker-Compose-Entwicklungs-/Laufzeitumgebung durch (siehe README.md/Visualization.md
# Abschnitt "Entwicklung nur mit Docker"): PHP-Abhaengigkeiten aktualisieren, Images neu bauen,
# Dienste neu starten, Testsuiten laufen lassen. SQLite-Migrationen brauchen keinen eigenen
# Schritt - api/src/Db/Database::migrate() wendet sie bei jedem API-Start automatisch an.
#
# Konfiguration ueber Umgebungsvariablen (Defaults passen fuer den ueblichen Fall):
# 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)
set -euo pipefail
REPO_DIR="$(cd "$(dirname "$(readlink -f "$0")")" && pwd)"
cd "$REPO_DIR"
log() {
printf '[update.sh] %s\n' "$1"
}
fail() {
printf '[update.sh] Fehler: %s\n' "$1" >&2
exit 1
}
command -v git >/dev/null 2>&1 || fail "git ist nicht installiert."
command -v docker >/dev/null 2>&1 || fail "docker ist nicht installiert."
git -C "$REPO_DIR" rev-parse --is-inside-work-tree >/dev/null 2>&1 \
|| fail "$REPO_DIR ist kein Git-Repository."
UPDATE_REMOTE="${UPDATE_REMOTE:-origin}"
UPDATE_BRANCH="${UPDATE_BRANCH:-$(git rev-parse --abbrev-ref HEAD)}"
UPDATE_RUN_TESTS="${UPDATE_RUN_TESTS:-1}"
if [ -n "$(git status --porcelain)" ]; then
fail "Lokale Aenderungen/unversionierte Dateien vorhanden - bitte erst committen/stashen. Breche ab, um nichts zu ueberschreiben."
fi
log "Hole Aenderungen von ${UPDATE_REMOTE}/${UPDATE_BRANCH}..."
git fetch "$UPDATE_REMOTE" "$UPDATE_BRANCH"
# --ff-only statt reset --hard: bricht kontrolliert ab, falls der lokale Branch abweicht
# (z. B. eigene, noch nicht gepushte Commits), statt Historie zu ueberschreiben.
git checkout "$UPDATE_BRANCH"
git pull --ff-only "$UPDATE_REMOTE" "$UPDATE_BRANCH"
DOCKER_COMPOSE="docker compose"
if ! docker compose version >/dev/null 2>&1; then
command -v docker-compose >/dev/null 2>&1 || fail "Weder 'docker compose' noch 'docker-compose' verfuegbar."
DOCKER_COMPOSE="docker-compose"
fi
log "Aktualisiere PHP-Abhaengigkeiten (composer install)..."
$DOCKER_COMPOSE run --rm api composer install --no-interaction --no-progress
log "Baue Docker-Images neu (falls Dockerfile/Abhaengigkeiten sich geaendert haben)..."
$DOCKER_COMPOSE build
log "Starte Dienste neu (api, web, sync)..."
$DOCKER_COMPOSE up -d api web sync
if [ "$UPDATE_RUN_TESTS" = "1" ]; then
log "Fuehre PHPUnit-Tests (API) aus..."
$DOCKER_COMPOSE run --rm api composer test
log "Fuehre Frontend-Tests aus..."
$DOCKER_COMPOSE run --rm frontend
else
log "UPDATE_RUN_TESTS=0 gesetzt - ueberspringe Testsuiten."
fi
log "Update abgeschlossen (${UPDATE_BRANCH} @ $(git rev-parse --short HEAD))."