hugin/scripts/smoke-test-local.sh
2026-10-27 08:33:21 +01:00

124 lines
6.2 KiB
Bash
Executable file

#!/usr/bin/env bash
# Rauchtest ohne echte Werkzeuge: Server starten, Beispielpakete veröffentlichen,
# mit dem CLI in ein Test-Repo abgleichen (→ KONZEPT.md 17).
#
# scripts/smoke-test-local.sh # Arbeitsordner wird danach gelöscht
# KEEP=1 scripts/smoke-test-local.sh # Arbeitsordner bleibt zum Ansehen
set -euo pipefail
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
WORK="$(mktemp -d)"
PORT="${PORT:-8765}"
URL="http://127.0.0.1:$PORT"
export HUGIN_DATABASE_URL="sqlite:///$WORK/hugin.db"
export HUGIN_ADMIN_TOKEN="rauchtest-admin"
export HUGIN_CLI_MIN_VERSION="0.1.0"
export HUGIN_DOWNLOAD_DIR="$WORK/downloads"
mkdir -p "$HUGIN_DOWNLOAD_DIR/0.2.0" && touch "$HUGIN_DOWNLOAD_DIR/0.2.0/hugin-linux-amd64"
ADMIN=(-H "Authorization: Bearer $HUGIN_ADMIN_TOKEN")
cleanup() {
[[ -n "${SERVER:-}" ]] && kill "$SERVER" 2>/dev/null || true
if [[ -z "${KEEP:-}" ]]; then rm -rf "$WORK"; else echo "Arbeitsordner: $WORK"; fi
}
trap cleanup EXIT
api() { curl -fsS -H "Content-Type: application/json" "$@"; }
key() { python3 -c 'import json,sys; print(json.load(sys.stdin)["key"])'; }
echo "== Server"
(cd "$ROOT/server" && uv run -q hugin-server migrate)
(cd "$ROOT/server" && exec uv run -q hugin-server run --host 127.0.0.1 --port "$PORT") >"$WORK/server.log" 2>&1 &
SERVER=$!
for _ in $(seq 50); do curl -fsS "$URL/readyz" >/dev/null 2>&1 && break; sleep 0.2; done
curl -fsS "$URL/readyz"; echo
echo "== Tenants, Projekte, Keys"
api "${ADMIN[@]}" "$URL/api/v1/admin/tenants" -d '{"slug":"plattform","name":"Plattform"}' >/dev/null
api "${ADMIN[@]}" "$URL/api/v1/admin/tenants/plattform/projects" -d '{"slug":"kern","name":"Kern"}' >/dev/null
api "${ADMIN[@]}" "$URL/api/v1/admin/tenants" -d '{"slug":"shop","name":"Shop"}' >/dev/null
api "${ADMIN[@]}" "$URL/api/v1/admin/tenants/shop/projects" -d '{"slug":"web","name":"Web"}' >/dev/null
AUTHOR=$(api "${ADMIN[@]}" "$URL/api/v1/admin/tenants/plattform/keys" -d '{"kind":"project","name":"autor","project":"kern","roles":["pub_author"]}' | key)
REVIEWER=$(api "${ADMIN[@]}" "$URL/api/v1/admin/tenants/plattform/keys" -d '{"kind":"project","name":"pruefer","project":"kern","roles":["pub_reviewer"]}' | key)
READER=$(api "${ADMIN[@]}" "$URL/api/v1/admin/tenants/shop/keys" -d '{"kind":"project","name":"web","project":"web"}' | key)
publish() {
local folder="$ROOT/contract/examples/packages/$1" zip="$WORK/package.zip"
rm -f "$zip"; (cd "$folder" && zip -qr "$zip" .)
curl -fsS -H "Authorization: Bearer $AUTHOR" -H "Content-Type: application/zip" --data-binary "@$zip" "$URL/api/v1/drafts" >/dev/null
local base="$URL/api/v1/packages/${1%/*}/versions/${1#*/}"
api -H "Authorization: Bearer $AUTHOR" -X POST "$base/submit" >/dev/null
api -H "Authorization: Bearer $REVIEWER" "$base/approve" -d '{"comment":"Rauchtest"}' >/dev/null
echo " veröffentlicht: $1"
}
echo "== Pakete"
publish pub-munin-nutzen/1.4.0
publish pub-hausregeln/1.0.0
publish pub-munin-anbindung/1.0.0
curl -fsS "${ADMIN[@]}" -X PUT -H "Content-Type: application/json" "$URL/api/v1/admin/mandatory/pub-munin-anbindung" -d '{"tenant":null}'
echo "== CLI"
(cd "$ROOT/cli" && go build -o "$WORK/hugin" ./cmd/hugin)
REPO="$WORK/repo"; mkdir -p "$REPO"; cd "$REPO"; git init -q
printf '# Web\n\nUnser Projekt.\n' > CLAUDE.md
export HUGIN_KEY="$READER"
"$WORK/hugin" init --server "$URL" --project web >/dev/null
sed -i.alt 's/^packages: \[\]/packages:\n - pub-munin-nutzen\n - pub-hausregeln/' .hugin.yaml && rm -f .hugin.yaml.alt
"$WORK/hugin" sync
"$WORK/hugin" check
echo "== Aktualisierung"
publish pub-munin-nutzen/1.5.0
set +e; "$WORK/hugin" check; RC=$?; set -e
[[ $RC -eq 1 ]] || { echo "check hätte die neue Version melden müssen (rc=$RC)"; exit 1; }
"$WORK/hugin" sync
"$WORK/hugin" status
echo "== Autoren: new, validate, try, upload"
export HUGIN_SERVER="$URL"
cd "$WORK"
HUGIN_KEY="$AUTHOR" "$WORK/hugin" new command pub-rauch-befehl
cat > pub-rauch-befehl/hugin.yaml <<'YAML'
id: pub-rauch-befehl
kind: command
version: 1.0.0
owner: kern
scope: public
description: Rauchtest für Befehle.
arguments: [ziel]
YAML
printf 'Prüfe {{ziel}} und fasse zusammen. $ARGUMENTS\n' > pub-rauch-befehl/COMMAND.md
HUGIN_KEY="$AUTHOR" "$WORK/hugin" validate pub-rauch-befehl
cd "$REPO"
cp hugin.lock "$WORK/lock-vorher"
HUGIN_KEY="$AUTHOR" "$WORK/hugin" try "$WORK/pub-rauch-befehl"
grep -q 'Prüfe $ziel' .claude/commands/pub-rauch-befehl.md
cmp -s hugin.lock "$WORK/lock-vorher" || { echo "try hat hugin.lock verändert"; exit 1; }
"$WORK/hugin" try --remove
[[ ! -e .claude/commands/pub-rauch-befehl.md ]] || { echo "try --remove hat nicht aufgeräumt"; exit 1; }
cd "$WORK"
set +e; printf 'Nimm $1\n' > pub-rauch-befehl/COMMAND.md
HUGIN_KEY="$AUTHOR" "$WORK/hugin" upload pub-rauch-befehl; RC=$?; set -e
[[ $RC -eq 1 ]] || { echo "Linter hätte \$1 ablehnen müssen (rc=$RC)"; exit 1; }
printf 'Prüfe {{ziel}} und fasse zusammen.\n' > pub-rauch-befehl/COMMAND.md
HUGIN_KEY="$AUTHOR" "$WORK/hugin" upload --submit pub-rauch-befehl
api -H "Authorization: Bearer $REVIEWER" "$URL/api/v1/packages/pub-rauch-befehl/versions/1.0.0/approve" -d '{}' >/dev/null
cd "$REPO"
sed -i.alt 's/^ - pub-hausregeln$/ - pub-hausregeln\n - pub-rauch-befehl/' .hugin.yaml && rm -f .hugin.yaml.alt
"$WORK/hugin" sync
grep -q 'Prüfe $ziel' .claude/commands/pub-rauch-befehl.md
echo "== suche und Versionsprüfung des CLI"
"$WORK/hugin" search munin | tee "$WORK/search.txt"
grep -q "pub-munin-nutzen" "$WORK/search.txt" || { echo "search findet pub-munin-nutzen nicht"; exit 1; }
(cd "$ROOT/cli" && go build -ldflags "-X main.Version=0.0.9" -o "$WORK/hugin-alt" ./cmd/hugin)
set +e; "$WORK/hugin-alt" check > "$WORK/check-alt.txt" 2>&1; RC=$?; set -e
[[ $RC -eq 1 ]] && grep -q "älter als die nötige Version 0.1.0" "$WORK/check-alt.txt" || { cat "$WORK/check-alt.txt"; echo "altes CLI nicht gemeldet"; exit 1; }
(cd "$ROOT/cli" && go build -ldflags "-X main.Version=0.1.0" -o "$WORK/hugin-010" ./cmd/hugin)
"$WORK/hugin-010" check > "$WORK/check-010.txt" 2>&1 || true
grep -q "hugin 0.2.0 ist verfügbar" "$WORK/check-010.txt" || { cat "$WORK/check-010.txt"; echo "Hinweis auf neue Version fehlt"; exit 1; }
echo "== Nutzung"
sqlite3 "$WORK/hugin.db" "select repo, package_id, version, tools from hugin_usage order by package_id" 2>/dev/null || true
echo "Rauchtest ok."