Référence CI/CD historique — sports-connect-front¶
Objet du document¶
Ce document décrit une photographie historique de l’ancienne architecture CI/CD de sports-connect-front.
Il ne décrit plus la chaîne active cible de HeyMoov. Il sert de référence de départ pour comprendre le builder legacy et les migrations réalisées ensuite.
Périmètre¶
- Application : web app React
- Dépôt GitHub : sports-connect-front
- Environnements couverts :
- staging
- production (structure partiellement connue, modèle similaire à staging)
État du document :
- référence legacy
- non source de vérité pour les déploiements HeyMoov actuels
- à lire comme état hérité avant bascule vers les nouvelles chaînes GitHub Actions
Vue d’ensemble¶
La chaîne actuelle repose sur trois rôles distincts : 1. GitHub Actions pour le déclenchement. 2. Un serveur de build pour la récupération du code, le build front et la publication de l’artefact. 3. Un serveur de déploiement par environnement pour récupérer l’artefact et l’installer sur le serveur web.
Machines identifiées¶
- Serveur de build :
ls2i-notification - Serveur de déploiement + web staging :
ls2i-staging - Serveur de déploiement + web production : machine de production distincte
Flux global¶
Staging¶
- Un
pushsur la branchestagingdéclenche un workflow GitHub Actions. - Le workflow s’exécute sur un runner self-hosted situé sur
ls2i-notification. - Le runner appelle le script local
/opt/builder/bin/build sports-connect staging. - Le script :
- charge la configuration d’environnement,
- met à jour le dépôt local,
- installe les dépendances,
- build l’application React,
- génère une archive
staging.tar.gz. - L’archive est rendue accessible via
https://build.ls2i.net/.... - Le script appelle le webhook de déploiement staging :
https://staging.deploy.ls2i.net/deploy/sports-connect. - Le serveur
ls2i-stagingreçoit la demande, télécharge l’archive depuisbuild.ls2i.net, puis l’extrait dans le répertoire web staging. - Le site staging est servi directement depuis ce répertoire.
Production¶
Le principe est équivalent :
1. push sur main
2. build sur ls2i-notification
3. publication de l’artefact
4. appel d’un webhook de déploiement production
5. récupération de l’artefact par le serveur de production
6. installation dans le répertoire web de production
Remarque : les détails exacts du webhook et du script de déploiement production n’ont pas encore été documentés dans cette version de référence.
Déclenchement GitHub¶
Workflow¶
Nom du workflow : Build and deploy
Déclencheurs :
- push sur staging
- push sur main
- workflow_dispatch
Jobs¶
build-stagingsigithub.ref == 'refs/heads/staging'build-productionsigithub.ref == 'refs/heads/main'
Commandes exécutées¶
Staging¶
/opt/builder/bin/build sports-connect staging
Production¶
/opt/builder/bin/build sports-connect main
Serveur de build — ls2i-notification¶
Le serveur de build a plusieurs responsabilités : - héberger le runner self-hosted GitHub Actions, - maintenir un clone local des dépôts, - exécuter les builds front, - publier les artefacts, - déclencher les déploiements via webhook.
Script principal de build¶
Chemin : /opt/builder/bin/build
Comportement du script¶
Le script de build :
1. valide les arguments (project, env),
2. charge un fichier d’environnement situé dans /opt/builder/env/<project>/<env>,
3. configure l’accès GitHub via une clé SSH dédiée,
4. clone le dépôt si nécessaire dans /opt/builder/src/<project>,
5. se positionne sur la branche définie par GIT_BRANCH,
6. exécute git fetch puis git pull si nécessaire,
7. vérifie la cohérence des variables VITE_APP* et REACT_APP* avec .env.dist,
8. nettoie node_modules et le dossier de build,
9. exécute :
- pnpm install --no-frozen-lockfile
- pnpm build
10. crée une archive .tar.gz dans /opt/builder/build/<project>/,
11. appelle un webhook de déploiement.
Exemple d’environnement staging¶
Fichier : /opt/builder/env/sports-connect/staging
Paramètres observés :
- GIT_BRANCH=staging
- DEPLOY_PATH=/var/www/staging.sports-connect.net
- DEPLOY_SERVER=debian@152.228.231.145
- WEBHOOK_URL=https://staging.deploy.ls2i.net/deploy
- WEBHOOK_TOKEN=***
Variables applicatives front :
- VITE_APP_API_GO_BASE_URL=https://staging.app.sports-connect.net
- VITE_APP_PREFIX_AUTH=/v1/web/auth
- VITE_APP_PREFIX_PUBLIC=/v1/public
- VITE_APP_PREFIX_API=/v1/web/api
- VITE_APP_MERCURE_URL=https://staging.mercure.sports-connect.net
- VITE_APP_MERCURE_PREFIX_TOPIC=https://staging.app.sports-connect.net
- VITE_APP_BASE_SEGMENT_URL=/
- VITE_APP_HUGO_URL=https://staging.www.sports-connect.net
- VITE_APP_UPLOAD=https://staging.app.sports-connect.net/uploads
- variables de captcha masquées
Artefacts de build¶
Emplacement disque¶
Pour sports-connect :
- staging : /opt/builder/build/sports-connect/staging.tar.gz
- production : attendu sur le même modèle, par ex. main.tar.gz
Publication HTTP¶
Le domaine build.ls2i.net est servi par Nginx sur ls2i-notification.
Configuration observée :
- root /opt/builder/build;
- autoindex on;
- accès HTTPS
- restriction IP :
- allow 152.228.231.145;
- deny all;
Conséquence :
- l’artefact /opt/builder/build/sports-connect/staging.tar.gz
- devient accessible via https://build.ls2i.net/sports-connect/staging.tar.gz
- uniquement depuis la machine ls2i-staging
Webhook de déploiement staging¶
URL¶
https://staging.deploy.ls2i.net/deploy/:project
Hébergement¶
- Nginx sur
ls2i-staging - reverse proxy vers
127.0.0.1:9222
Restrictions d’accès¶
Nginx n’autorise que l’IP du serveur de build ls2i-notification.
Authentification applicative¶
Le service Go vérifie un token transmis soit :
- en query string : access_token
- soit via le header : Authorization: X-Auth-Token <token>
Comportement du contrôleur¶
Le contrôleur :
1. lit le paramètre :project,
2. répond immédiatement 202 Accepted,
3. exécute ensuite la commande définie par DEPLOY_CMD, avec le nom du projet.
Point important¶
Le statut HTTP 202 est renvoyé avant la fin réelle du déploiement. Le succès de la requête HTTP ne garantit donc pas que le déploiement a abouti.
Déploiement staging¶
Service Go¶
- variable
DEPLOY_CMD=bin/deploy - le contrôleur lance :
bin/deploy sports-connect
Script de déploiement¶
Le script de staging :
1. définit server_url="https://build.ls2i.net"
2. télécharge l’archive :
https://build.ls2i.net/sports-connect/staging.tar.gz
/tmp/build/sports-connect.tar.gz
4. choisit le répertoire cible via un mapping project -> deploy_path
5. pour sports-connect, le chemin cible est :
/var/www/staging.sports-connect.net
tar xf
Répertoire cible observé¶
- staging :
/var/www/staging.sports-connect.net
Hébergement web staging¶
Le site staging est servi sur la même machine que le déployeur, à savoir ls2i-staging.
Diagramme logique¶
GitHub push (staging/main)
-> GitHub Actions
-> runner self-hosted sur ls2i-notification
-> script /opt/builder/bin/build
-> git fetch / git pull
-> pnpm install
-> pnpm build
-> archive tar.gz dans /opt/builder/build/<project>/
-> exposition via build.ls2i.net
-> appel webhook deploy
-> service Go de déploiement
-> téléchargement de l’artefact
-> extraction dans /var/www/...
-> site servi par le serveur web cible
Hypothèses opérationnelles¶
Staging¶
GIT_BRANCH=staging- l’artefact attendu est
staging.tar.gz - le site est servi depuis
/var/www/staging.sports-connect.net
Production¶
GIT_BRANCH=main- l’artefact attendu est probablement
main.tar.gz - le site est servi par une machine de production distincte
Forces de l’architecture actuelle¶
- séparation claire entre build et déploiement,
- artefacts publiés via HTTP simple,
- cloisonnement réseau par IP,
- token applicatif sur le webhook,
- architecture compréhensible et légère,
- possibilité de centraliser le build sur une seule machine.
Faiblesses et points de vigilance¶
1. Le build n’est pas figé sur le SHA du workflow¶
Le script build la branche via git pull, et non le commit exact ayant déclenché le workflow.
2. Retour prématuré du webhook¶
Le webhook répond 202 Accepted avant la fin réelle du déploiement.
3. Déploiement non atomique¶
L’archive est extraite directement dans le répertoire servi.
4. Risque de fichiers obsolètes¶
Le répertoire cible n’est pas nettoyé explicitement avant extraction.
5. Pas de rollback natif visible¶
Aucun mécanisme de release versionnée, de symlink current, ou de restauration automatique n’a été identifié.
6. Reproductibilité partielle du build¶
pnpm install --no-frozen-lockfile réduit le déterminisme du build.
7. Contrôles qualité peu visibles¶
Aucun lint, test unitaire, audit de dépendances ou smoke test post-déploiement n’a été identifié dans les éléments documentés.
8. Gestion de concurrence non documentée¶
Aucun verrou explicite n’a été observé pour empêcher des builds ou déploiements simultanés.
Zones encore à documenter¶
Pour compléter cette référence, il reste à documenter : - le webhook de production, - le script de déploiement production, - le chemin final de déploiement production, - la configuration Nginx du site staging, - la configuration Nginx du site production, - la stratégie de rollback, - la politique de journalisation et d’alerting, - la gestion de la concurrence, - les tests attendus avant et après déploiement.
Pistes d’optimisation prioritaires¶
Priorité 1 — Fiabiliser¶
- figer le build sur le SHA GitHub du workflow,
- faire remonter le statut réel du déploiement,
- ajouter un verrou par projet/environnement,
- nettoyer ou versionner les répertoires de release.
Priorité 2 — Rendre le déploiement plus sûr¶
- déployer dans un dossier versionné,
- basculer via symlink
current, - conserver les N dernières releases,
- prévoir un rollback manuel rapide.
Priorité 3 — Améliorer la qualité pipeline¶
- ajouter lint,
- ajouter tests unitaires,
- ajouter smoke tests post-déploiement,
- utiliser un lockfile strict si possible.
Priorité 4 — Observabilité¶
- centraliser les logs,
- tracer le SHA déployé,
- notifier les échecs de build et de déploiement avec contexte,
- conserver un historique de releases par environnement.
Conclusion¶
L’architecture actuelle fonctionne comme une chaîne build centralisé + artefacts HTTP + déploiement pull via webhook. Elle est simple et opérationnelle, mais présente plusieurs fragilités classiques : traçabilité imparfaite du SHA, déploiement non atomique, absence de rollback visible, et retour de succès trop tôt côté webhook.
Ce document doit servir de base de travail pour cadrer les prochaines optimisations sans perdre la compréhension de l’existant.