Squash TM¶
Squash TM (Test Management) est l'ALM open source utilisé par PerfShop pour la gestion des exigences, des cas de test, des campagnes et des exécutions. Il est livré par l'éditeur Squashtest et maintenu activement.
Source de vérité
Cette page est tirée des blocs perfshop-squash-db, perfshop-testmgmt et perfshop-squash-seed des fichiers compose, des bind mounts de configuration (squash-seed/start-plugins.cfg, squash-seed/squash.tm.cfg.properties), et du script squash-seed/seed.py.
Base de données PostgreSQL dédiée¶
Squash TM est volontairement couplé à PostgreSQL 16 — pas à MySQL, pas à la base perfshop-db. C'est le choix de la stack officielle Squashtest pour obtenir le support le plus stable, et PerfShop le respecte :
perfshop-squash-db:
image: postgres:16
container_name: perfshop-squash-db
environment:
- POSTGRES_DB=squashtm
- POSTGRES_USER=squashtm
- POSTGRES_PASSWORD=${SQUASH_DB_PASSWORD:-squashtm}
volumes:
- squash-db-data:/var/lib/postgresql/data
ports:
- "${SQUASH_DB_PORT:-5433}:5432"
healthcheck:
test: ["CMD-SHELL", "pg_isready -U squashtm -d squashtm"]
interval: 10s
timeout: 5s
retries: 5
| Aspect | Valeur |
|---|---|
| Image | postgres:16 |
| Base | squashtm |
| Utilisateur | squashtm (défaut, surchargeable via SQUASH_DB_PASSWORD) |
| Volume nommé | squash-db-data → /var/lib/postgresql/data |
| Port hôte par défaut | 5433 (pour éviter le conflit avec un PostgreSQL local éventuel) |
| Healthcheck | pg_isready |
La coexistence de MySQL 8 (pour perfshop-app) et de PostgreSQL 16 (pour Squash TM) dans la même stack est pédagogiquement utile : l'étudiant voit deux SGBD simultanément, avec leurs images officielles et leurs healthchecks respectifs.
Le service Squash TM¶
perfshop-testmgmt:
image: squashtest/squash-tm:latest
container_name: perfshop-testmgmt
depends_on:
perfshop-squash-db:
condition: service_healthy
environment:
- DATABASE_URL=jdbc:postgresql://perfshop-squash-db:5432/squashtm
- DATABASE_USER=squashtm
- DATABASE_PASSWORD=${SQUASH_DB_PASSWORD:-squashtm}
- SQUASH_JWT_SECRET=${SQUASH_JWT_SECRET}
- SQUASH_ADMIN_LOGIN=${SQUASH_ADMIN_LOGIN:-admin}
- SQUASH_ADMIN_PASSWORD=${SQUASH_ADMIN_PASSWORD:-Squash2026*}
ports:
- "${SQUASH_HTTP_PORT:-8088}:8080"
volumes:
- ./squash-seed/start-plugins.cfg:/opt/squash-tm/conf/start-plugins.cfg:ro
- ./squash-seed/squash.tm.cfg.properties:/opt/squash-tm/conf/squash.tm.cfg.properties:ro
- ./squash-seed/trusted_key.pub:/opt/squash-tm/conf/trusted_key.pub:ro
healthcheck:
test: ["CMD-SHELL", "curl -sf http://localhost:8080/squash/isSquashAlive || exit 1"]
interval: 15s
timeout: 10s
retries: 20
start_period: 120s
Points-clés¶
| Aspect | Valeur |
|---|---|
| Image | squashtest/squash-tm:latest (image officielle de l'éditeur) |
| JDBC URL | jdbc:postgresql://perfshop-squash-db:5432/squashtm |
| Port interne | 8080 |
| Port hôte par défaut | 8088 |
| Healthcheck endpoint | http://localhost:8080/squash/isSquashAlive (endpoint public Squash TM, pas besoin d'auth) |
start_period |
120 secondes — Squash TM démarre lentement (Spring Boot + init PostgreSQL + plugins) |
Variables critiques¶
| Variable | Rôle |
|---|---|
SQUASH_JWT_SECRET |
Secret base64 utilisé pour signer les tokens JWT que Squash TM envoie à Squash Orchestrator. C'est cette clé qui authentifie les jobs d'exécution soumis à l'orchestrateur. Doit être aléatoire et stable. |
SQUASH_ADMIN_LOGIN / _PASSWORD |
Compte superadmin Squash TM (défaut admin / Squash2026*) |
DATABASE_URL |
Toujours jdbc:postgresql://perfshop-squash-db:5432/squashtm |
Le JWT secret est partagé avec l'orchestrateur
La même variable SQUASH_JWT_SECRET est utilisée par perfshop-testmgmt (pour signer) et par perfshop-orchestrator (pour vérifier). Si on la change sans redémarrer les deux, les jobs seront rejetés par l'orchestrateur avec une erreur JWT. Voir squash-orchestrator.md.
Configuration par bind mount¶
Trois fichiers sont montés en lecture seule dans le container Squash TM :
start-plugins.cfg¶
Contrôle quels plugins Squash TM sont chargés au démarrage. PerfShop active au minimum :
- Le connecteur SCM Git (
squash-tm-scm-git) — pour poll le dépôt Forgejo et découvrir les scripts - Le connecteur Squash Orchestrator — pour soumettre des jobs d'exécution à l'orchestrateur
squash.tm.cfg.properties¶
Fichier de propriétés Spring qui surcharge les valeurs par défaut de Squash TM :
- URL publique (
squash.tm.url) - Configuration du pool de connexions JDBC
- Options d'intégration SCM (polling interval, timeout)
- Secret JWT utilisé en cohérence avec la variable d'environnement
trusted_key.pub¶
Clé publique RSA qui certifie Squash TM auprès de Squash Orchestrator. Le pendant privé (trusted_key.pem) est stocké côté orchestrateur. Ce couple de clés permet à l'orchestrateur de vérifier que les jobs soumis proviennent bien d'un Squash TM légitime, indépendamment du JWT secret.
Le seed squash-seed¶
Le service perfshop-squash-seed est un container Python one-shot :
perfshop-squash-seed:
image: python:3.11-slim
depends_on:
perfshop-testmgmt:
condition: service_healthy
perfshop-forgejo-seed:
condition: service_completed_successfully
volumes:
- ./squash-seed/seed.py:/app/seed.py:ro
- forgejo-token-data:/token:ro
command: >
sh -c "pip install --no-cache-dir requests==2.31.0 &&
python /app/seed.py"
restart: "no"
Dépendance double¶
Le seed Squash TM dépend de deux conditions :
perfshop-testmgmt: service_healthy— Squash TM doit répondre sur/squash/isSquashAliveperfshop-forgejo-seed: service_completed_successfully— le seed Forgejo doit avoir terminé avec succès, c'est-à-dire que le compte CI Forgejo est créé et que le token API pour Squash TM est stocké dans le volume nomméforgejo-token-data
Cette double dépendance est l'une des chaînes de démarrage les plus contraintes de toute la stack PerfShop.
Ce que fait le seed¶
sequenceDiagram
autonumber
participant S as squash-seed
participant STM as perfshop-testmgmt
participant FG as perfshop-forgejo
S->>STM: POST /squash/login<br/>(admin / Squash2026*)
STM-->>S: Session cookie
S->>STM: GET /squash/api/rest/projects<br/>(cherche "PerfShop QA")
alt Projet inexistant
S->>STM: POST /squash/api/rest/projects<br/>{name:"PerfShop QA", ...}
STM-->>S: 201 Created
else Projet existant
STM-->>S: 200 (déjà là)
end
S->>S: Lit /token/forgejo_token (volume)
S->>STM: POST /squash/api/rest/scm-servers<br/>{kind:"git", url:"http://perfshop-forgejo:3000", token:...}
STM-->>S: 201 (ou mise à jour)
S->>STM: POST /squash/api/rest/scm-repositories<br/>{server:..., name:"perfshop-tests", ...}
STM-->>S: 201
Note over S,STM: Sortie code 0
Les étapes principales :
- Authentification en tant qu'admin Squash TM
- Création du projet
PerfShop QAs'il n'existe pas déjà (idempotent) - Lecture du token Forgejo depuis le volume nommé
forgejo-token-data(monté en RO) - Création du serveur SCM Git pointant vers
perfshop-forgejo:3000avec le token d'authentification - Création du repository SCM
perfshop-testsdans le projet
Seed minimaliste
Le seed Squash TM est intentionnellement minimaliste : il ne crée pas de cas de test, pas de campagnes, pas d'exigences. C'est volontaire — on laisse l'étudiant découvrir la création de ces artefacts dans l'UI web, qui est l'un des objectifs pédagogiques. Seul ce qui est nécessaire pour que le polling SCM fonctionne est bootstrapped.
Healthcheck et endpoint public¶
L'endpoint http://perfshop-testmgmt:8080/squash/isSquashAlive est public (pas d'auth) et retourne 200 OK avec un body simple quand Squash TM est prêt à servir. C'est la cible du healthcheck Docker (start_period: 120s) et du polling du seed.
Une fois healthy, Squash TM expose son UI complète sur http://localhost:8088/squash/ (port hôte par défaut).
Communication avec les autres services¶
flowchart LR
STM["perfshop-testmgmt"]
STM -->|"JDBC :5432"| SQDB[("perfshop-squash-db<br/>PostgreSQL 16")]
STM -->|"Git clone/pull :3000<br/>(token CI)"| FG[("perfshop-forgejo")]
STM -->|"POST /jobs (JWT RS512)"| ORCH["perfshop-orchestrator"]
ORCH -.->|"résultats"| STM
USER["Formateur<br/>(navigateur)"] -->|"HTTP :8088/squash/"| STM
Trois canaux sortants :
- Vers PostgreSQL : toutes les données métier (projets, tests, campagnes, exécutions)
- Vers Forgejo : polling SCM régulier pour découvrir les scripts Robot Framework
- Vers l'orchestrateur : soumission de jobs d'exécution signés JWT
Volumes¶
| Volume | Montage | Contenu |
|---|---|---|
squash-db-data (nommé) |
/var/lib/postgresql/data |
Données PostgreSQL |
./squash-seed/start-plugins.cfg (bind RO) |
/opt/squash-tm/conf/start-plugins.cfg |
Liste des plugins activés |
./squash-seed/squash.tm.cfg.properties (bind RO) |
/opt/squash-tm/conf/squash.tm.cfg.properties |
Propriétés Spring Squash TM |
./squash-seed/trusted_key.pub (bind RO) |
/opt/squash-tm/conf/trusted_key.pub |
Clé publique RSA pour l'orchestrateur |
forgejo-token-data (nommé, RO) |
/token:ro (pour le seed) |
Token Forgejo CI lu par le seed |
Ports¶
| Service | Port hôte | Port container | Variable d'env |
|---|---|---|---|
perfshop-squash-db |
5433 | 5432 | SQUASH_DB_PORT |
perfshop-testmgmt |
8088 | 8080 | SQUASH_HTTP_PORT |
Pour aller plus loin¶
- Stack QA — Vue d'ensemble — workflow complet bout en bout
- Squash Orchestrator — le destinataire des jobs JWT
- Forgejo — le SCM pollé par Squash TM
- Test Runner — la cible finale des jobs d'exécution