Some checks failed
CI / go-lint (push) Has been skipped
CI / python-lint (push) Has been skipped
CI / nodejs-lint (push) Has been skipped
CI / test-go-school (push) Successful in 25s
CI / test-go-edu-search (push) Successful in 26s
CI / test-python-klausur (push) Failing after 1m55s
CI / test-python-agent-core (push) Successful in 16s
CI / test-nodejs-website (push) Successful in 18s
- Voice-Service von Core nach Lehrer verschoben (bp-lehrer-voice-service) - 4 Jitsi-Services + 2 Synapse-Services in docker-compose.yml aufgenommen - Camunda komplett gelöscht: workflow pages, workflow-config.ts, bpmn-js deps - CAMUNDA_URL aus backend-lehrer environment entfernt - Sidebar: Kategorie "Compliance SDK" + "Katalogverwaltung" entfernt - Sidebar: Neue Kategorie "Kommunikation" mit Video & Chat, Voice Service, Alerts Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
271 lines
7.4 KiB
Bash
Executable File
271 lines
7.4 KiB
Bash
Executable File
#!/bin/bash
|
|
# BQAS Local Runner - Lokale Alternative zu GitHub Actions
|
|
# Fuehrt BQAS Tests aus und benachrichtigt bei Fehlern
|
|
|
|
set -e
|
|
|
|
# Konfiguration
|
|
VOICE_SERVICE_DIR="/Users/benjaminadmin/Projekte/breakpilot-pwa/voice-service"
|
|
VOICE_SERVICE_URL="${BQAS_SERVICE_URL:-http://localhost:8091}"
|
|
LOG_DIR="/var/log/bqas"
|
|
LOG_FILE="${LOG_DIR}/bqas.log"
|
|
REGRESSION_THRESHOLD="${BQAS_REGRESSION_THRESHOLD:-0.1}"
|
|
|
|
# Farben fuer Output
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[0;33m'
|
|
BLUE='\033[0;34m'
|
|
NC='\033[0m' # No Color
|
|
|
|
# Argumente
|
|
QUICK_MODE=false
|
|
GOLDEN_ONLY=false
|
|
RAG_ONLY=false
|
|
SILENT=false
|
|
|
|
usage() {
|
|
echo "Usage: $0 [OPTIONS]"
|
|
echo ""
|
|
echo "Options:"
|
|
echo " --quick Nur schnelle Golden Tests (fuer Git Hooks)"
|
|
echo " --golden Nur Golden Suite"
|
|
echo " --rag Nur RAG Suite"
|
|
echo " --silent Keine Desktop-Benachrichtigungen"
|
|
echo " --help Diese Hilfe anzeigen"
|
|
echo ""
|
|
echo "Umgebungsvariablen:"
|
|
echo " BQAS_SERVICE_URL Voice Service URL (default: http://localhost:8091)"
|
|
echo " BQAS_REGRESSION_THRESHOLD Regression Schwelle (default: 0.1)"
|
|
}
|
|
|
|
while [[ $# -gt 0 ]]; do
|
|
case $1 in
|
|
--quick)
|
|
QUICK_MODE=true
|
|
shift
|
|
;;
|
|
--golden)
|
|
GOLDEN_ONLY=true
|
|
shift
|
|
;;
|
|
--rag)
|
|
RAG_ONLY=true
|
|
shift
|
|
;;
|
|
--silent)
|
|
SILENT=true
|
|
shift
|
|
;;
|
|
--help)
|
|
usage
|
|
exit 0
|
|
;;
|
|
*)
|
|
echo "Unbekannte Option: $1"
|
|
usage
|
|
exit 1
|
|
;;
|
|
esac
|
|
done
|
|
|
|
# Logging-Funktion
|
|
log() {
|
|
local level=$1
|
|
local message=$2
|
|
local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
|
|
|
|
# Log-Verzeichnis erstellen falls nicht vorhanden
|
|
if [ -d "$LOG_DIR" ]; then
|
|
echo "${timestamp} [${level}] ${message}" >> "$LOG_FILE"
|
|
fi
|
|
|
|
# Console Output
|
|
case $level in
|
|
INFO)
|
|
echo -e "${BLUE}[INFO]${NC} ${message}"
|
|
;;
|
|
SUCCESS)
|
|
echo -e "${GREEN}[SUCCESS]${NC} ${message}"
|
|
;;
|
|
WARNING)
|
|
echo -e "${YELLOW}[WARNING]${NC} ${message}"
|
|
;;
|
|
ERROR)
|
|
echo -e "${RED}[ERROR]${NC} ${message}"
|
|
;;
|
|
esac
|
|
}
|
|
|
|
# Benachrichtigung senden
|
|
notify() {
|
|
local title=$1
|
|
local message=$2
|
|
local is_error=${3:-false}
|
|
|
|
if [ "$SILENT" = true ]; then
|
|
return
|
|
fi
|
|
|
|
# macOS Desktop-Benachrichtigung
|
|
if [ "$is_error" = true ]; then
|
|
osascript -e "display notification \"${message}\" with title \"${title}\" sound name \"Basso\"" 2>/dev/null || true
|
|
else
|
|
osascript -e "display notification \"${message}\" with title \"${title}\"" 2>/dev/null || true
|
|
fi
|
|
}
|
|
|
|
# Python-Notifier aufrufen (falls vorhanden)
|
|
notify_python() {
|
|
local status=$1
|
|
local message=$2
|
|
local details=$3
|
|
|
|
if [ -f "${VOICE_SERVICE_DIR}/bqas/notifier.py" ]; then
|
|
python3 "${VOICE_SERVICE_DIR}/bqas/notifier.py" \
|
|
--status "$status" \
|
|
--message "$message" \
|
|
--details "$details" 2>/dev/null || true
|
|
fi
|
|
}
|
|
|
|
# Pruefen ob Service laeuft
|
|
check_service() {
|
|
log "INFO" "Pruefe Voice Service Verfuegbarkeit..."
|
|
|
|
local health_url="${VOICE_SERVICE_URL}/health"
|
|
local response
|
|
|
|
response=$(curl -s -o /dev/null -w "%{http_code}" "$health_url" 2>/dev/null) || response="000"
|
|
|
|
if [ "$response" = "200" ]; then
|
|
log "SUCCESS" "Voice Service erreichbar"
|
|
return 0
|
|
else
|
|
log "WARNING" "Voice Service nicht erreichbar (HTTP $response)"
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
# Regression Check durchfuehren
|
|
check_regression() {
|
|
log "INFO" "Pruefe auf Score-Regression..."
|
|
|
|
local regression_url="${VOICE_SERVICE_URL}/api/v1/bqas/regression-check?threshold=${REGRESSION_THRESHOLD}"
|
|
local response
|
|
|
|
response=$(curl -s "$regression_url" 2>/dev/null) || {
|
|
log "WARNING" "Regression-Check fehlgeschlagen"
|
|
return 1
|
|
}
|
|
|
|
local is_regression
|
|
is_regression=$(echo "$response" | python3 -c "import sys,json; print(json.load(sys.stdin).get('is_regression', False))" 2>/dev/null) || is_regression="False"
|
|
|
|
if [ "$is_regression" = "True" ]; then
|
|
local delta
|
|
delta=$(echo "$response" | python3 -c "import sys,json; print(json.load(sys.stdin).get('delta', 0))" 2>/dev/null) || delta="unknown"
|
|
log "ERROR" "Regression erkannt! Score-Abfall: ${delta}"
|
|
return 1
|
|
else
|
|
log "SUCCESS" "Keine Regression erkannt"
|
|
return 0
|
|
fi
|
|
}
|
|
|
|
# Tests ausfuehren
|
|
run_tests() {
|
|
local test_type=$1
|
|
local test_path=$2
|
|
local exit_code=0
|
|
|
|
log "INFO" "Starte ${test_type} Tests..."
|
|
|
|
cd "$VOICE_SERVICE_DIR"
|
|
|
|
# Aktiviere venv falls vorhanden
|
|
if [ -f "venv/bin/activate" ]; then
|
|
source venv/bin/activate
|
|
fi
|
|
|
|
# pytest ausfuehren
|
|
if python3 -m pytest "$test_path" -v --tb=short 2>&1 | tee -a "$LOG_FILE"; then
|
|
log "SUCCESS" "${test_type} Tests bestanden"
|
|
exit_code=0
|
|
else
|
|
log "ERROR" "${test_type} Tests fehlgeschlagen"
|
|
exit_code=1
|
|
fi
|
|
|
|
return $exit_code
|
|
}
|
|
|
|
# Hauptlogik
|
|
main() {
|
|
local start_time=$(date +%s)
|
|
local golden_exit=0
|
|
local rag_exit=0
|
|
local regression_exit=0
|
|
local service_available=false
|
|
|
|
log "INFO" "=========================================="
|
|
log "INFO" "BQAS Local Runner gestartet"
|
|
log "INFO" "=========================================="
|
|
|
|
# Service-Check (optional, Tests koennen auch offline laufen)
|
|
if check_service; then
|
|
service_available=true
|
|
fi
|
|
|
|
# Quick Mode: Nur schnelle Tests
|
|
if [ "$QUICK_MODE" = true ]; then
|
|
log "INFO" "Quick Mode - nur schnelle Golden Tests"
|
|
run_tests "Golden (Quick)" "tests/bqas/test_golden.py -k 'not slow'" || golden_exit=1
|
|
else
|
|
# Vollstaendige Test-Ausfuehrung
|
|
if [ "$RAG_ONLY" = false ]; then
|
|
run_tests "Golden" "tests/bqas/test_golden.py" || golden_exit=1
|
|
fi
|
|
|
|
if [ "$GOLDEN_ONLY" = false ]; then
|
|
run_tests "RAG" "tests/bqas/test_rag.py" || rag_exit=1
|
|
fi
|
|
|
|
# Regression-Check nur wenn Service verfuegbar
|
|
if [ "$service_available" = true ]; then
|
|
check_regression || regression_exit=1
|
|
fi
|
|
fi
|
|
|
|
# Zusammenfassung
|
|
local end_time=$(date +%s)
|
|
local duration=$((end_time - start_time))
|
|
|
|
log "INFO" "=========================================="
|
|
log "INFO" "BQAS Run abgeschlossen (${duration}s)"
|
|
log "INFO" "=========================================="
|
|
|
|
# Ergebnis ermitteln
|
|
local total_failures=$((golden_exit + rag_exit + regression_exit))
|
|
|
|
if [ $total_failures -eq 0 ]; then
|
|
log "SUCCESS" "Alle Tests bestanden!"
|
|
notify "BQAS" "Alle Tests bestanden" false
|
|
notify_python "success" "Alle Tests bestanden" "Dauer: ${duration}s"
|
|
return 0
|
|
else
|
|
local failure_details=""
|
|
[ $golden_exit -ne 0 ] && failure_details="${failure_details}Golden Tests fehlgeschlagen. "
|
|
[ $rag_exit -ne 0 ] && failure_details="${failure_details}RAG Tests fehlgeschlagen. "
|
|
[ $regression_exit -ne 0 ] && failure_details="${failure_details}Regression erkannt. "
|
|
|
|
log "ERROR" "Tests fehlgeschlagen: ${failure_details}"
|
|
notify "BQAS Alert" "$failure_details" true
|
|
notify_python "failure" "Tests fehlgeschlagen" "$failure_details"
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
# Script ausfuehren
|
|
main
|