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/