Aller au contenu

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 :

  1. perfshop-testmgmt: service_healthy — Squash TM doit répondre sur /squash/isSquashAlive
  2. perfshop-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 :

  1. Authentification en tant qu'admin Squash TM
  2. Création du projet PerfShop QA s'il n'existe pas déjà (idempotent)
  3. Lecture du token Forgejo depuis le volume nommé forgejo-token-data (monté en RO)
  4. Création du serveur SCM Git pointant vers perfshop-forgejo:3000 avec le token d'authentification
  5. Création du repository SCM perfshop-tests dans 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