Session 23 — Debug pipeline SSH → Robot Framework PASS¶
Durée : ~8h
Objectif : Résoudre tous les blocages de la session 21 et obtenir le premier PASS complet CT-001
Résumé exécutif¶
Session de debug intensif. Après ~8h d'investigations, le premier test automatisé CT-001 s'est exécuté avec succès via le pipeline complet :
CT-002 (Selenium) lancé et validé en fin de session.
Problèmes résolus¶
1 — SSH_CHANNEL_* variables écrasaient sshee.yaml¶
Les variables SSH_CHANNEL_HOST/USER/PASSWORD/TAGS dans le compose forçaient
targets=['agents'] dans le code Python du sshee, ignorant silencieusement sshee.yaml.
Fix : Suppression de toutes les variables SSH_CHANNEL_* du compose orchestrateur.
2 — Namespace "default" non trouvé¶
Le sshee.yaml n'avait pas namespaces: default dans l'entrée du pool,
et targets: [default] manquait dans le contexte allinone.
Fix : sshee.yaml avec targets: [default] et namespaces: default dans le pool.
3 — agentchannel Java annulait avant sshee Python¶
L'agentchannel Java (port 24368) répondait "not found" immédiatement,
annulant le workflow avant que le sshchannel Python soit consulté.
Fix : agentchannel ajouté dans la liste disabled du squashtf.yaml.
4 — pending_timeout_minutes à 0¶
L'arranger annulait le workflow instantanément faute de timeout.
Fix : arranger.yaml avec pending_timeout_minutes: 5 pour le contexte allinone.
5 — squash.rest-api.jwt.secret commenté¶
L'orchestrateur recevait un 401 throwNotExistOrSetLastUsage sur toutes ses requêtes.
Fix : Propriété décommentée dans squash.tm.cfg.properties + montée en volume.
6 — Token JWT RSA invalide¶
Le token dans Squash TM ne correspondait pas à la clé publique montée dans l'orchestrateur.
Fix : Nouvelle paire RSA 4096 générée avec opentf-ctl, trusted_key.pub montée dans /etc/squashtf/.
7 — SCM non configuré¶
Le tm-community-generator ne pouvait pas générer de workflow sans serveur SCM.
Fix : Serveur PerfShop GitLab associé au projet + dépôt perfshop-tests (main) cloné.
8 — SQUASH_REST_API_JWT_SECRET dans l'orchestrateur¶
Variable non documentée qui causait throwNotExistOrSetLastUsage.
Fix : Suppression de SQUASH_REST_API_JWT_SECRET du compose orchestrateur.
9 — git absent du test-runner¶
Le script bash généré par l'orchestrateur fait un git clone avant d'exécuter les tests.
Sans git dans le container, le script crashait silencieusement.
Fix : git ajouté dans le Dockerfile du test-runner + rebuild de l'image.
10 — Référence script avec espaces¶
Fix : Correction en perfshop-tests/smoke-test.robot dans Squash TM.
11 — Import squash_tf incorrect¶
squash_tf.TFParamService n'existe pas comme module Robot Framework.
Fix : Correction en squash_tf.squashTfRobotframeworkRunnerParameter dans tous les scripts.
Découvertes techniques¶
| Découverte | Impact |
|---|---|
SSH_CHANNEL_* env vars forcent targets=['agents'] dans le code sshee |
Root cause du namespace issue |
agentchannel Java répond "not found" avant sshee Python |
Annule workflow immédiatement |
SQUASH_REST_API_JWT_SECRET dans l'orchestrateur = variable non documentée |
Cause throwNotExistOrSetLastUsage |
SCM obligatoire pour que tm-community-generator génère un workflow |
Workflow fail sans SCM |
git requis dans le test-runner (clone SCM avant exécution) |
Crash silencieux sans git |
resultpublisher endpoints = Community limitation (404) |
Non bloquant |
Format référence script : repo/fichier.robot sans espaces |
Parsing strict |
Module squash_tf RF : squashTfRobotframeworkRunnerParameter |
Import Robot Framework |
Fichiers modifiés¶
| Fichier | Modification |
|---|---|
docker-compose.yml |
Suppression SSH_CHANNEL_*, SQUASH_REST_API_JWT_SECRET, debug désactivé |
squash-orchestrator/sshee.yaml |
targets: [default], missing_host_key_policy: auto-add, namespaces: default |
squash-orchestrator/arranger.yaml |
pending_timeout_minutes: 5 |
squash-orchestrator/squashtf.yaml |
agentchannel désactivé |
squash-orchestrator/trusted_key.pub |
Nouvelle clé publique RSA 4096 |
squash-seed/squash.tm.cfg.properties |
squash.rest-api.jwt.secret décommenté |
test-runner/Dockerfile |
Ajout git |
test-runner/scripts/smoke-test.robot |
Fix import squash_tf |
test-runner/scripts/CT-002-prix-coherence.robot |
Fix import squash_tf |
Résultats¶
| Test | Résultat |
|---|---|
| CT-001 Smoke test API | ✅ PASS — 1 test, 1 passed, 0 failed |
| CT-002 Prix cohérence Selenium | ✅ Lancé et exécuté |
Pending session 23¶
- [ ] Remontée des logs Robot Framework vers
/rf-logs/(Loki/Grafana) - [ ] Automatiser la config Squash TM via
seed.py - [ ] Tester CT-002 complet avec résultat dans Squash TM
Notes infrastructure (formateur)¶
Procédure rebuild test-runner (Windows → NAS)¶
Le NAS Synology DSM 7 ne supporte pas seccomp — impossible de builder en natif.
Le build se fait sur Windows puis est exporté en tar.
# Windows PowerShell — répertoire test-runner
cd C:\...\perfshop\test-runner
docker build --no-cache -t perfshop-test-runner:latest .
docker save perfshop-test-runner:latest -o perfshop-test-runner-latest.tar
# Copier le tar dans /volume4/docker-speed/perfshop/ sur le NAS
# NAS
docker load -i /volume4/docker-speed/perfshop/perfshop-test-runner-latest.tar
docker compose stop perfshop-test-runner
docker compose up -d perfshop-test-runner
docker exec perfshop-test-runner which git && echo "GIT OK"
Token JWT RSA (clé fixe du projet)¶
La paire RSA est générée une seule fois avec opentf-ctl et committée dans le repo :
- Clé publique : squash-orchestrator/trusted_key.pub (montée dans l'orchestrateur)
- Clé privée : squash-orchestrator/trusted_key.pem (NAS uniquement, non committée)
Token actuel (valide jusqu'au 12/05/2027) :
eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwidXVpZCI6IjMzNWUwODVhLWY4MTUtNDEwMy1hYjhjLTRjNDk2YWRmMjJhNSIsInBlcm1pc3Npb25zIjoiUkVBRF9XUklURSIsImlhdCI6MTc3Mzc3MjQ5NywiZXhwIjoxODA1MTU1MjAwfQ.7KV98NkR_oDST7y7mfd5617q2nlTf1BHoHnDmuMxBz3Z4xgoyQdAFrl4D5a8wUhAM1jlfcce4bu9FAMk3mP59w
Pour régénérer le token depuis le NAS :
docker exec perfshop-orchestrator opentf-ctl generate-token \
--private-key /squash-orchestrator/trusted_key.pem \
--issuer "squash orchestrator" --subject "squash-tm"
Configuration GitLab SCM¶
Compte dédié perfshop-ci / Squash2026/* — rôle Developer sur perfshop-tests.
Cohérence des mots de passe après session 22¶
Tous les compose files utilisent ${SQUASH_ADMIN_PASSWORD:-perfshop} comme valeur
par défaut (au lieu de admin hardcodé). Le squash-seed utilise également ces variables.
Variables supprimées définitivement¶
| Variable | Raison |
|---|---|
SQUASH_REST_API_JWT_SECRET (orchestrateur) |
Non documentée, cause throwNotExistOrSetLastUsage |
SSH_CHANNEL_HOST/USER/PASSWORD/TAGS/POOLS |
Forcent targets=['agents'], écrasent sshee.yaml |
SSHCHANNEL_DEBUG_LEVEL: DEBUG |
Commenté — décommenter si besoin debug paramiko |
PUBLIC_KEY (orchestrateur) |
Variable fantôme sans effet |
Erreurs Claude¶
| # | Erreur | Sévérité |
|---|---|---|
| 1 | Nombreuses fausses pistes sur le namespace routing | MAJEUR |
| 2 | SQUASH_REST_API_JWT_SECRET ajouté alors que non documenté |
MAJEUR |
| 3 | Token personnel Squash TM (HS512) mis dans serveur autom | MOYEN |
| 4 | Plusieurs cycles sur agentchannel avant désactivation | MOYEN |
| 5 | SCM non identifié comme cause du fail pendant longtemps | MAJEUR |