Add worktree sandbox and test env workflow

This commit is contained in:
2026-02-03 09:13:03 +01:00
parent 6035bc1715
commit 13efe9406c
11 changed files with 326 additions and 4 deletions

101
scripts/test-env-up.sh Executable file
View File

@@ -0,0 +1,101 @@
#!/usr/bin/env bash
set -euo pipefail
SCRIPT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
REPO_ROOT=$(cd "${SCRIPT_DIR}/.." && pwd)
DEFAULT_SANDBOX="${REPO_ROOT}/../galaxyforge-sandbox"
SANDBOX_PATH="${1:-$DEFAULT_SANDBOX}"
if [[ "$SANDBOX_PATH" != /* ]]; then
SANDBOX_PATH="${REPO_ROOT}/${SANDBOX_PATH}"
fi
SANDBOX_PATH=$(realpath -m "$SANDBOX_PATH")
if [[ ! -d "$SANDBOX_PATH" ]]; then
echo "Sandbox nicht gefunden. Erstelle Worktree..."
"${SCRIPT_DIR}/worktree-init.sh" "$SANDBOX_PATH"
fi
"${SCRIPT_DIR}/worktree-sync.sh" "$SANDBOX_PATH"
if [[ ! -f "$SANDBOX_PATH/.env" ]]; then
cat <<'ENV' > "$SANDBOX_PATH/.env"
APP_ENV=test
DEV_MODE=1
DEV_USER_ID=change-me
DB_HOST=127.0.0.1
DB_PORT=5432
DB_NAME=galaxyforge
DB_TEST_NAME=galaxyforge_test
DB_USER=change-me
DB_PASS=your-strong-password
# Nur Platzhalter. Vor Prod aendern.
ENV
echo "Lokale .env in der Sandbox erzeugt: $SANDBOX_PATH/.env"
fi
if [[ ! -f "$SANDBOX_PATH/docker-compose.yml" ]]; then
echo "Fehler: docker-compose.yml fehlt in der Sandbox: $SANDBOX_PATH" >&2
exit 1
fi
(
cd "$SANDBOX_PATH"
docker compose up -d --build
)
set -a
source "$SANDBOX_PATH/.env"
set +a
DB_USER="${DB_USER:-change-me}"
DB_NAME="${DB_NAME:-galaxyforge}"
DB_TEST_NAME="${DB_TEST_NAME:-galaxyforge_test}"
DB_PASS="${DB_PASS:-your-strong-password}"
READY=0
for _ in {1..30}; do
if (cd "$SANDBOX_PATH" && docker compose exec -T db pg_isready -U "$DB_USER" >/dev/null 2>&1); then
READY=1
break
fi
sleep 1
done
if [[ "$READY" != "1" ]]; then
echo "Fehler: Postgres ist nicht erreichbar." >&2
exit 1
fi
if [[ "$DB_TEST_NAME" != "$DB_NAME" ]]; then
if ! (cd "$SANDBOX_PATH" && docker compose exec -T db env PGPASSWORD="$DB_PASS" psql -U "$DB_USER" -d postgres -tc "SELECT 1 FROM pg_database WHERE datname = '${DB_TEST_NAME}'" | grep -q 1); then
(cd "$SANDBOX_PATH" && docker compose exec -T db env PGPASSWORD="$DB_PASS" psql -U "$DB_USER" -d postgres -c "CREATE DATABASE \"${DB_TEST_NAME}\"")
fi
fi
if [[ ! -f "$SANDBOX_PATH/server/vendor/autoload.php" ]]; then
if ! command -v composer >/dev/null 2>&1; then
echo "Fehler: composer nicht gefunden. Bitte installieren und erneut versuchen." >&2
exit 1
fi
(cd "$SANDBOX_PATH/server" && composer install)
fi
(
cd "$SANDBOX_PATH/server"
php db/migrate.php
php db/seed.php
)
echo "Testumgebung laeuft. Starte PHP-Server (Stop mit CTRL+C)."
echo "- http://localhost:8000/"
echo "- http://localhost:8000/m"
echo "- http://localhost:8000/api/health"
(
cd "$SANDBOX_PATH"
php -S localhost:8000 -t web/desktop/public
)

33
scripts/worktree-destroy.sh Executable file
View File

@@ -0,0 +1,33 @@
#!/usr/bin/env bash
set -euo pipefail
SCRIPT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
REPO_ROOT=$(cd "${SCRIPT_DIR}/.." && pwd)
DEFAULT_SANDBOX="${REPO_ROOT}/../galaxyforge-sandbox"
SANDBOX_PATH="${1:-$DEFAULT_SANDBOX}"
if [[ "$SANDBOX_PATH" != /* ]]; then
SANDBOX_PATH="${REPO_ROOT}/${SANDBOX_PATH}"
fi
SANDBOX_PATH=$(realpath -m "$SANDBOX_PATH")
if [[ ! -d "$SANDBOX_PATH" ]]; then
echo "Fehler: Sandbox nicht gefunden: $SANDBOX_PATH" >&2
exit 1
fi
if git -C "$REPO_ROOT" worktree list --porcelain | grep -Fq "worktree $SANDBOX_PATH"; then
if [[ -f "$SANDBOX_PATH/docker-compose.yml" ]]; then
(
cd "$SANDBOX_PATH"
docker compose down
)
fi
git -C "$REPO_ROOT" worktree remove "$SANDBOX_PATH" --force
echo "Sandbox entfernt: $SANDBOX_PATH"
else
echo "Fehler: Kein Git-Worktree am Pfad: $SANDBOX_PATH" >&2
exit 1
fi

30
scripts/worktree-down.sh Executable file
View File

@@ -0,0 +1,30 @@
#!/usr/bin/env bash
set -euo pipefail
SCRIPT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
REPO_ROOT=$(cd "${SCRIPT_DIR}/.." && pwd)
DEFAULT_SANDBOX="${REPO_ROOT}/../galaxyforge-sandbox"
SANDBOX_PATH="${1:-$DEFAULT_SANDBOX}"
if [[ "$SANDBOX_PATH" != /* ]]; then
SANDBOX_PATH="${REPO_ROOT}/${SANDBOX_PATH}"
fi
SANDBOX_PATH=$(realpath -m "$SANDBOX_PATH")
if [[ ! -d "$SANDBOX_PATH" ]]; then
echo "Fehler: Sandbox nicht gefunden: $SANDBOX_PATH" >&2
exit 1
fi
if [[ ! -f "$SANDBOX_PATH/docker-compose.yml" ]]; then
echo "Fehler: docker-compose.yml fehlt in der Sandbox: $SANDBOX_PATH" >&2
exit 1
fi
(
cd "$SANDBOX_PATH"
docker compose down
)
echo "Docker in der Sandbox gestoppt."

31
scripts/worktree-init.sh Executable file
View File

@@ -0,0 +1,31 @@
#!/usr/bin/env bash
set -euo pipefail
SCRIPT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
REPO_ROOT=$(cd "${SCRIPT_DIR}/.." && pwd)
DEFAULT_SANDBOX="${REPO_ROOT}/../galaxyforge-sandbox"
SANDBOX_PATH="${1:-$DEFAULT_SANDBOX}"
if [[ "$SANDBOX_PATH" != /* ]]; then
SANDBOX_PATH="${REPO_ROOT}/${SANDBOX_PATH}"
fi
SANDBOX_PATH=$(realpath -m "$SANDBOX_PATH")
if ! git -C "$REPO_ROOT" rev-parse --is-inside-work-tree >/dev/null 2>&1; then
echo "Fehler: Repo-Root nicht gefunden: $REPO_ROOT" >&2
exit 1
fi
if [[ -e "$SANDBOX_PATH" ]]; then
echo "Fehler: Zielpfad existiert bereits: $SANDBOX_PATH" >&2
echo "Tipp: Anderen Pfad angeben oder scripts/worktree-destroy.sh verwenden." >&2
exit 1
fi
COMMIT=$(git -C "$REPO_ROOT" rev-parse HEAD)
git -C "$REPO_ROOT" worktree add --detach "$SANDBOX_PATH" "$COMMIT" >/dev/null
echo "Sandbox erstellt (detached HEAD) unter: $SANDBOX_PATH"
echo "Starten: bash \"$REPO_ROOT/scripts/worktree-up.sh\" \"$SANDBOX_PATH\""

50
scripts/worktree-sync.sh Executable file
View File

@@ -0,0 +1,50 @@
#!/usr/bin/env bash
set -euo pipefail
SCRIPT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
REPO_ROOT=$(cd "${SCRIPT_DIR}/.." && pwd)
DEFAULT_SANDBOX="${REPO_ROOT}/../galaxyforge-sandbox"
SANDBOX_PATH="${1:-$DEFAULT_SANDBOX}"
if [[ "$SANDBOX_PATH" != /* ]]; then
SANDBOX_PATH="${REPO_ROOT}/${SANDBOX_PATH}"
fi
SANDBOX_PATH=$(realpath -m "$SANDBOX_PATH")
if ! git -C "$REPO_ROOT" rev-parse --is-inside-work-tree >/dev/null 2>&1; then
echo "Fehler: Repo-Root nicht gefunden: $REPO_ROOT" >&2
exit 1
fi
if [[ ! -d "$SANDBOX_PATH" ]]; then
echo "Fehler: Sandbox nicht gefunden: $SANDBOX_PATH" >&2
echo "Bitte scripts/worktree-init.sh ausfuehren." >&2
exit 1
fi
if ! git -C "$SANDBOX_PATH" rev-parse --is-inside-work-tree >/dev/null 2>&1; then
echo "Fehler: Pfad ist kein Git-Worktree: $SANDBOX_PATH" >&2
exit 1
fi
COMMIT=$(git -C "$REPO_ROOT" rev-parse HEAD)
git -C "$SANDBOX_PATH" checkout --detach -f "$COMMIT" >/dev/null
echo "Sandbox auf Commit $COMMIT synchronisiert."
if ! git -C "$REPO_ROOT" diff --quiet HEAD; then
if ! git -C "$REPO_ROOT" diff --binary HEAD | git -C "$SANDBOX_PATH" apply --whitespace=nowarn; then
echo "Fehler: Patch konnte nicht angewendet werden. Bitte Sandbox bereinigen oder Konflikte pruefen." >&2
exit 1
fi
echo "Uncommitted Aenderungen aus dem Haupt-Worktree wurden angewendet."
else
echo "Keine uncommitted Aenderungen im Haupt-Worktree gefunden."
fi
UNTRACKED=$(git -C "$REPO_ROOT" ls-files --others --exclude-standard)
if [[ -n "$UNTRACKED" ]]; then
echo "Hinweis: Untracked Dateien wurden nicht uebernommen."
fi

30
scripts/worktree-up.sh Executable file
View File

@@ -0,0 +1,30 @@
#!/usr/bin/env bash
set -euo pipefail
SCRIPT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
REPO_ROOT=$(cd "${SCRIPT_DIR}/.." && pwd)
DEFAULT_SANDBOX="${REPO_ROOT}/../galaxyforge-sandbox"
SANDBOX_PATH="${1:-$DEFAULT_SANDBOX}"
if [[ "$SANDBOX_PATH" != /* ]]; then
SANDBOX_PATH="${REPO_ROOT}/${SANDBOX_PATH}"
fi
SANDBOX_PATH=$(realpath -m "$SANDBOX_PATH")
"${SCRIPT_DIR}/worktree-sync.sh" "$SANDBOX_PATH"
if [[ ! -f "$SANDBOX_PATH/docker-compose.yml" ]]; then
echo "Fehler: docker-compose.yml fehlt in der Sandbox: $SANDBOX_PATH" >&2
exit 1
fi
(
cd "$SANDBOX_PATH"
docker compose up -d --build
)
echo "Sandbox laeuft. URLs:"
echo "- http://localhost/"
echo "- http://localhost/m"
echo "- http://localhost/api/health"