fix(2.7.1): Auskuenfte, die stimmen - Fassung, Health, doctor, Ansicht

Der erste Durchlauf der Testinstanz hat neun Bugs zutage gefoerdert, und fast
alle waren dieselbe Sorte Fehler: eine Auskunft, die nicht stimmte.

Am folgenreichsten die Fassung. config/config.php fuehrte app.version als feste
Zeichenkette und stand seit 2.0.0 darauf, waehrend 2.7.0 lief - unbemerkt, weil
die Datei gitignored ist und in keinem Diff auftaucht. Zwei gemeldete Bugs sind
daran fehldiagnostiziert worden ("der Server ist zu alt"). src/bootstrap.php
leitet die Fassung jetzt aus "current" in public/docs/changelog.json ab.

Im Einzelnen:

- #346 Fassung aus dem Changelog statt aus der Konfiguration
- #60  /api/health ueberlebt eine leere Datenbank: eigener Check "schema",
       healthy=false mit Begruendung statt HTTP 500
- #54  dc-testkit doctor prueft Mindestfassung (semantisch) und Rechte, statt
       sie nur anzuzeigen - dafuer neu: GET /api/tokens/v1/whoami
- #53  dc-testkit.sh unter /testkit/ erreichbar (Route fehlte, der
       dokumentierte Bezugsweg hat nie funktioniert) und mit LF ausgeliefert
       (deploy.py/deploy_dev.py entfernen CR bei .sh/.bash beim Upload)
- #288 Filter und Formulare werfen nicht mehr aufs Dashboard zurueck: die
       offene Ansicht wandert bei GET als "view" in den Query-String, und die
       Filter loesen ueber requestSubmit() aus - form.submit() erzeugt kein
       submit-Ereignis, weshalb der zentrale Zuhoerer dort nie lief
- #347 /api/bugtracker/v1/roadmap auch ohne .php erreichbar
- #55  Fassungshinweis in TESTUMGEBUNG.md 4.6 (serverseitig war das mit 2.6.0
       bereits behoben)

Nicht geprueft: php -l. Auf dem Arbeitsplatz ist kein PHP installiert; die
Abnahme laeuft ueber die Testinstanz.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Deploymentcenter Bot
2026-08-30 21:06:33 +02:00
co-authored by Claude Opus 5
parent afcbb3c091
commit 3b56839a1e
13 changed files with 566 additions and 50 deletions
+124 -4
View File
@@ -46,6 +46,13 @@ DC_PROJECT="${DC_PROJECT:-}"
DC_TOKEN="${DC_TOKEN:-}"
DC_CHANNEL="${DC_CHANNEL:-prod}"
# Aelteste Fassung des Deploymentcenters, mit der dieses Testkit vollstaendig
# arbeiten kann. Darunter fehlen /api/license/v1/dev-key (dc-testkit license),
# der Bezug ueber /testkit/ und /api/tokens/v1/whoami (Rechtepruefung in
# doctor). Die Zahl stand vorher nur in einer Fehlermeldung mitten im Ablauf -
# doctor kannte sie nicht und meldete "Bereit" auf einem zu alten Server.
DC_MIN_SERVER="${DC_MIN_SERVER:-2.6.1}"
# Die Maschinenkennung entscheidet, welchen DEV-Schluessel der Server
# heraussucht. Sie muss ueber Laeufe hinweg gleich bleiben - sonst sammelt sich
# je Lauf ein weiterer Schluessel an, bis die Grenze je Projekt greift.
@@ -241,6 +248,52 @@ ensure_state() {
chmod 700 "$dir" 2>/dev/null || true
}
# ---------------------------------------------------------------------------
# Fassungen und Rechte
# ---------------------------------------------------------------------------
# Ist $1 aelter als $2? 0 = ja, 1 = nein, 2 = nicht vergleichbar.
#
# Nicht "sort -V": das fehlt auf BusyBox-Systemen, und die Antwort waere dort
# still falsch statt laut fehlend. Ein Vorabkennzeichen (1.2.3-rc1) wird
# abgeschnitten - fuer die Frage "reicht der Server aus" genuegt das.
version_lt() {
local a="${1%%-*}" b="${2%%-*}" i av bv
for i in 1 2 3; do
av=$(printf '%s' "$a" | cut -d. -f$i)
bv=$(printf '%s' "$b" | cut -d. -f$i)
av="${av:-0}"; bv="${bv:-0}"
case "$av$bv" in
''|*[!0-9]*) return 2 ;;
esac
[ "$av" -lt "$bv" ] && return 0
[ "$av" -gt "$bv" ] && return 1
done
return 1
}
# Deckt die Rechteliste $1 (JSON-Array aus whoami) das Recht $2 ab?
#
# Die Wildcards muessen mitgedacht werden: "*" deckt alles ab, "bugtracker:*"
# alles darunter. Sonst meldete das Werkzeug ein Recht als fehlend, das der
# Server anerkennt - und schickte jemanden ein Token neu bauen, das passt.
has_scope() {
local list="$1" want="$2" prefix
prefix="${2%%:*}"
case "$list" in
*'"*"'*) return 0 ;;
*"\"$want\""*) return 0 ;;
*"\"$prefix:*\""*) return 0 ;;
esac
return 1
}
# ---------------------------------------------------------------------------
# doctor - laeuft hier ueberhaupt etwas?
#
@@ -263,9 +316,34 @@ cmd_doctor() {
step "Deploymentcenter unter $DC_URL"
if api GET /api/health; then
local healthy
local healthy server_version
healthy=$(printf '%s' "$API_BODY" | json_get '.healthy' || echo '?')
ok "erreichbar, healthy=$healthy, Fassung $(printf '%s' "$API_BODY" | json_get '.version' || echo '?')"
server_version=$(printf '%s' "$API_BODY" | json_get '.version' || echo '')
ok "erreichbar, healthy=$healthy, Fassung ${server_version:-?}"
# Die Fassung stand doctor immer schon vor Augen - verglichen wurde sie
# nur nie. Deshalb meldete er "Bereit" und der erste Schritt, der den
# Server wirklich braucht, scheiterte danach mit "kennt
# /api/license/v1/dev-key noch nicht".
if [ -z "$server_version" ]; then
warn "der Server nennt keine Fassung - $DC_MIN_SERVER nicht pruefbar"
else
version_lt "$server_version" "$DC_MIN_SERVER"
case $? in
0)
warn "zu alt: $server_version - gebraucht wird mindestens $DC_MIN_SERVER"
warn " Es fehlen: dc-testkit license (dev-key), der Bezug ueber /testkit/"
warn " und die Rechtepruefung. Der Server muss deployt werden."
failed=1
;;
2)
warn "Fassung \"$server_version\" ist nicht auswertbar - $DC_MIN_SERVER ungeprueft"
;;
*)
ok "erfuellt die Mindestfassung $DC_MIN_SERVER"
;;
esac
fi
else
warn "nicht erreichbar: $(api_error)"
failed=1
@@ -275,8 +353,50 @@ cmd_doctor() {
if [ -z "$DC_TOKEN" ]; then
warn "kein Token gesetzt (DC_TOKEN)"
failed=1
elif api GET /api/bugtracker/v1/projects; then
ok "gueltig - der Bugtracker antwortet"
elif api GET /api/tokens/v1/whoami; then
# Fruehere Fassungen meldeten hier nur "gueltig - der Bugtracker
# antwortet". Das lief auch mit einem Laufzeit-Token durch, dem
# bugtracker:manage und license:dev fehlten - der Lauf scheiterte dann
# erst dort, wo die Rechte wirklich gebraucht wurden.
local tok_name tok_owner tok_project tok_scopes tok_workbench want
tok_name=$(printf '%s' "$API_BODY" | json_get '.name' || echo '?')
tok_owner=$(printf '%s' "$API_BODY" | json_get '.owner_type' || echo '?')
tok_project=$(printf '%s' "$API_BODY" | json_get '.project_slug' || echo '')
tok_scopes=$(printf '%s' "$API_BODY" | json_get '.scopes' || echo '[]')
tok_workbench=$(printf '%s' "$API_BODY" | json_get '.is_workbench' || echo 'false')
ok "gueltig - \"$tok_name\", Besitzerart $tok_owner, Projekt ${tok_project:-keins}"
dim " Rechte: $tok_scopes"
if [ "$tok_workbench" != 'true' ]; then
warn "kein Werkbank-Token: Besitzerart ist $tok_owner, gebraucht wird dev_agent"
warn " Ein Laufzeit-Token darf nicht in fremde Projekte melden (TESTUMGEBUNG.md 4.2)."
failed=1
fi
for want in bugtracker:manage license:dev updateservice:read; do
if ! has_scope "$tok_scopes" "$want"; then
warn "Recht fehlt: $want"
failed=1
fi
done
if [ -n "$tok_project" ] && [ -n "$DC_PROJECT" ] && [ "$tok_project" != "$DC_PROJECT" ]; then
warn "Token gehoert zu $tok_project, gearbeitet wird an $DC_PROJECT"
warn " Je Projekt ein eigenes Token - sonst ist die Herkunft einer Meldung nicht mehr ablesbar."
failed=1
fi
elif [ "$API_STATUS" = '404' ]; then
# Server ohne whoami. Dann bleibt nur die alte, grobe Pruefung - und
# der ausdrueckliche Hinweis, dass die Rechte ungeprueft sind. Still
# "gueltig" zu melden waere genau der Fehler, der hier behoben wird.
if api GET /api/bugtracker/v1/projects; then
warn "gueltig, aber die Rechte sind ungeprueft"
warn " /api/tokens/v1/whoami gibt es erst ab $DC_MIN_SERVER."
else
warn "Token wird nicht angenommen: $(api_error)"
failed=1
fi
else
warn "Token wird nicht angenommen: $(api_error)"
failed=1