Aller au contenu

Scripts UI — Éditeur et lanceur de scripts

Rôle dans la stack

Scripts UI est une interface web intégrée à PerfShop qui permet aux étudiants d'éditer, gérer et lancer leurs scripts de test directement depuis le navigateur — sans ligne de commande, sans accès SSH, sans IDE local.

perfshop-scripts-ui   ← Node.js :3008
  ├── Éditeur CodeMirror (.robot et .py) — dépendances 100% locales
  ├── Arborescence fichiers avec drag & drop upload et déplacement
  ├── Lancement robot / pytest directement depuis l'UI
  ├── Résultats en temps réel (polling 1.5s)
  ├── Onglet Runs — historique persistant des exécutions
  ├── Publication vers Forgejo
  └── Pull depuis Forgejo (git pull → /scripts)

Accès

Environnement URL Login
NAS prod https://perfshop-scripts.perfshop.io admin@perfshop.fr / perfshop
Docker Desktop / build local http://localhost:3008 admin@perfshop.fr / perfshop

Fonctionnalités

Fonctionnalité Description
Arborescence Navigation dans les dossiers de scripts avec expand/collapse
Drag & drop arborescence Déplacer un fichier vers un dossier par glisser-déposer
Éditeur CodeMirror Coloration syntaxique Robot Framework et Python — dépendances locales
Nouveau fichier Création avec template .robot ou .py
Nouveau dossier Création de sous-dossiers (.gitkeep automatique)
Upload Drag & drop ou clic — choix du dossier cible
Télécharger Export d'un script en local
Déplacer / Renommer Déplacement via modal ou drag & drop arborescence
Supprimer Suppression fichier ou dossier (récursif)
Lancer Exécution .robot via robot ou .py via pytest — bouton grisé sur les autres extensions
Résultats live Polling toutes les 1.5s pendant l'exécution
Onglet Runs Historique des exécutions persisté sur disque — clic → détail dans l'onglet Résultat
Publier Push du script courant vers Forgejo (avec SHA)
⬇️ Pull Forgejo git pull depuis Forgejo vers /scripts
Historique Affichage des derniers commits Forgejo

Architecture technique

perfshop-scripts-ui:
  image: node:20-alpine           ← NAS : pas de build, code monté en volume
  command: npm install && node src/server.js
  volumes:
    - ./scripts-ui:/app                           ← code source
    - /var/run/docker.sock:/var/run/docker.sock   ← docker exec test-runner
    - forgejo-token-data:/token:ro                ← token API Forgejo (read-only)
    - scripts-ui-modules:/app/node_modules
    - ./test-runner/logs:/rf-logs                 ← persistance des runs
  environment:
    - FORGEJO_INTERNAL_URL=http://perfshop-forgejo:3000
    - FORGEJO_CI_USER=perfshop-ci
    - FORGEJO_REPO=perfshop-tests
    - FORGEJO_TOKEN_FILE=/token/forgejo_token
    - TEST_RUNNER_CONTAINER=perfshop-test-runner
    - SESSION_SECRET=${SESSION_SECRET:-perfshop-dev-secret}
    - RUNS_DIR=/rf-logs/runs          ← dossier de persistance (optionnel, valeur par défaut)

Flux d'exécution d'un script

Étudiant clique "▶ Lancer"
scripts-ui vérifie l'extension (.robot / .py uniquement)
scripts-ui vérifie que perfshop-test-runner est UP (docker inspect)
docker exec perfshop-test-runner robot /scripts/mon-script.robot
    (ou pytest /scripts/mon-script.py --junit-xml=...)
Polling toutes les 1.5s → affichage stdout en temps réel
Résultat PASS / FAIL dans le panneau bas
Persistance : /rf-logs/runs/<runId>/meta.json + output.txt + result.xml

Limite de concurrence

3 scripts maximum peuvent tourner simultanément (MAX_CONCURRENT_RUNS = 3). Au-delà, l'UI renvoie une erreur 429.


Onglet Runs — persistance des exécutions

Chaque run terminé (PASS, FAIL ou erreur) est persisté sur disque dans /rf-logs/runs/ :

/rf-logs/runs/
  run-1-1773912837160/
    ├── meta.json      ← script, startedAt, endedAt, status, rc
    ├── output.txt     ← sortie complète du run
    └── result.xml     ← copie du XML JUnit (si présent)

L'onglet 🏃 Runs liste les 50 derniers runs triés par date décroissante. Un clic sur une ligne bascule vers l'onglet 📋 Résultat avec le détail complet.

Volume requis

Le volume ./test-runner/logs:/rf-logs doit être monté sur perfshop-scripts-ui sans :ro. Un docker compose stop + up est nécessaire (pas un simple restart) pour que Docker prenne en compte ce nouveau montage.


Flux publication vers Forgejo

Étudiant clique "Publier"
scripts-ui lit le token depuis /token/forgejo_token
GET /api/v1/repos/perfshop-ci/perfshop-tests/contents/{fichier}
  → récupère le SHA si le fichier existe déjà
PUT (mise à jour) ou POST (création) avec le contenu base64
Forgejo commit sur main : "feat: mise à jour {fichier}"

Routes API serveur

Méthode Route Description
GET /api/tree Arborescence Forgejo (.robot / .py)
GET /api/file?path= Contenu d'un fichier
GET /api/download?path= Téléchargement raw
PUT /api/file Publier (créer / mettre à jour)
DELETE /api/file Supprimer un fichier
POST /api/upload Upload depuis le navigateur
POST /api/mkdir Créer un dossier (.gitkeep)
POST /api/move Déplacer / renommer
GET /api/commits 15 derniers commits
POST /api/sync git pull Forgejo → /scripts
POST /api/run Lancer un test
GET /api/run/:id Statut d'une exécution (polling live)
GET /api/runs Liste des 50 derniers runs persistés
GET /api/runs/:id Détail d'un run persisté (meta + output)
GET /api/runner-status État du container test-runner

Sécurité

Mesure Détail
Authentification Session Express cookie (login PerfShop)
Token Forgejo Injecté via volume, jamais dans l'URL
XSS Arborescence et tableau construits 100% en DOM API — zéro innerHTML avec données
Délégation d'événements Email des comptes admin lu depuis un Map JS — jamais depuis un attribut HTML
Validation fichiers [\w\-.] uniquement + extension .robot / .py obligatoire
Validation id runs Regex [\w\-]+ — protection path traversal
Profondeur arbre Max 4 niveaux de dossiers
Nettoyage mémoire Runs en mémoire purgés après 1h (toutes les 15 min)
Concurrence Max 3 runs simultanés — HTTP 429 au-delà

Dépendances inter-services

perfshop-scripts-ui
  ├── depends_on: perfshop-app (auth session)
  ├── depends_on: perfshop-forgejo (healthcheck) ← Sync Git + Publier
  └── depends_on: perfshop-test-runner (Lancer scripts)

Commandes utiles

# Logs en temps réel
docker compose logs -f perfshop-scripts-ui

# Redémarrage après modification du code
# (si ajout d'un nouveau volume → down/up obligatoire)
docker compose stop perfshop-scripts-ui
docker compose up -d perfshop-scripts-ui

# Vérifier que le token Forgejo est bien présent
docker exec perfshop-scripts-ui cat /token/forgejo_token

# Vérifier la persistance des runs
ls -la /volume4/docker-speed/perfshop/test-runner/logs/runs/