### CI/CD — Fonctionnement observé et architecture de déploiement Cette documentation décrit le pipeline CI/CD tel qu’il peut être déduit des artefacts présents dans le dépôt : `Dockerfile`, `package.json`, et les manifestes Kubernetes rendus dans `temp.yaml`. Aucune configuration de pipeline explicite n’est présente dans le dépôt (pas de `.gitea/`, `.github/workflows/`, `.gitlab-ci.yml`, `.drone.yml`). Le flux ci-dessous s’appuie donc sur ces éléments pour décrire le fonctionnement attendu. ### Portée - **Build applicatif**: Next.js (Node 19-alpine) avec dépendance privée `le-coffre-resources` via SSH. - **Image Docker**: construction multi-étapes, publication attendue vers un registre Scaleway Container Registry. - **Déploiement Kubernetes**: namespace `lecoffre`, intégration Vault Agent pour l’injection d’ENV, `ExternalSecret` pour le secret de pull Docker, `Ingress` TLS via cert-manager, ressources de `Deployment`/`Service`. ### Chaîne de build - **Dépendances** - `package.json` indique Next.js 14, TypeScript 4.9, ESLint 8.36, etc. - La dépendance privée `le-coffre-resources` est récupérée depuis `git.4nkweb.com` via SSH (`git+ssh`). - **Dockerfile** (multi-étapes, Node 19-alpine) - Étape `deps`: installation des dépendances avec `npm install` en utilisant BuildKit et le forward d’agent SSH pour accéder au dépôt privé. - Étape `development`: copie du code, exécution sous un utilisateur non-root, commande par défaut `npm run dev` (pour le développement local). Pour la prod, l’image utilisée en cluster exécute `npm run start` (cf. manifeste). - **Build Next.js** - Script `build`: `NEXT_TELEMETRY_DISABLED=1 next build --no-lint` - Script `start`: `next start` - Le lint n’est pas bloquant au build (flag `--no-lint`). ### Image, registre et version - **Image utilisée en cluster**: `rg.fr-par.scw.cloud/lecoffre/front:v0.1.9` (cf. `temp.yaml`). - **Registre**: Scaleway Container Registry (région `fr-par`). - **Tagging**: la version d’exemple observée est `v0.1.9`. L’origine du tag (automatique via CI, ou manuel) n’est pas dans le dépôt. ### Déploiement Kubernetes (extrait de `temp.yaml`) - **Namespace**: `lecoffre` - **ServiceAccount**: `lecoffre-front-sa` avec `Secret` token associé. - **ExternalSecret**: création de `imagePullSecret` à partir de Vault via `external-secrets.io` en lisant `secret/data/lecoffre-front-stg/config/dockerpullsecret` (clé `.dockerconfigjson`). - **Deployment**: `apps/v1` nommé `lecoffre-front` avec: - `image`: `rg.fr-par.scw.cloud/lecoffre/front:v0.1.9` - `imagePullPolicy`: `Always` - `resources`: `requests` (cpu 200m, ram 1Gi), `limits` (ram 2Gi) - **Vault Agent Injector**: annotations pour injecter des variables d’environnement depuis `secret/data/lecoffre-front-stg/config/envs` en exportant chaque paire `clé=valeur` dans `/vault/secrets/envs`. - **Commande de démarrage**: `['sh','-c', '. /vault/secrets/envs && npm run start']` - **Service**: type ClusterIP exposant le port 80 vers le `targetPort` 3000 du conteneur Next.js. - **Ingress**: classe `nginx` avec TLS géré par `cert-manager` (ClusterIssuer `letsencrypt-prod`) pour `app.stg.lecoffre.smart-chain.fr`. ### Flux CI/CD attendu (déduit) 1. **Checkout + préparation** - Récupération du code et configuration de l’agent SSH (accès à `git.4nkweb.com`). 2. **Installation des dépendances** - `npm install` avec BuildKit (`--mount=type=ssh`) pour la dépendance privée. 3. **Build applicatif** - `npm run build` (désactive la télémétrie et le lint bloquant). 4. **Construction de l’image** - `docker build` avec BuildKit et forward d’agent SSH. - Taggage semver (ex. `v0.1.9`) et éventuellement `latest`/environnement (non constaté ici). 5. **Push au registre** - `docker push rg.fr-par.scw.cloud/lecoffre/front:`. 6. **Déploiement Kubernetes** - Application des manifestes (ou rendu Helm) dans le namespace `lecoffre`. - Les secrets de pull sont fournis via `ExternalSecret` connecté à Vault. - Au runtime, Vault Agent injecte les variables d’environnement nécessaires avant `npm run start`. ### Sécurité et secrets - **Build**: le forward d’agent SSH évite d’écrire la clé privée dans l’image. - **Runtime**: aucune variable sensible n’est stockée dans l’image; elles sont injectées à l’exécution par Vault. - **Pull de l’image**: la config Docker (`.dockerconfigjson`) est fournie par `ExternalSecret` à partir de Vault. ### Points à confirmer - Outil CI utilisé (Gitea Actions, Woodpecker/Drone, GitLab CI, autre) et fichiers de pipeline hébergés ailleurs. - Règles de nommage des tags d’image et gouvernance de version (`vX.Y.Z`, tags d’environnement). - Stratégie de déploiement (Helm chart source exact, commandes d’apply, gestion multi-env: dev/stg/prod). - Politique de lint/test avant build (actuellement `--no-lint` au build Next.js). ### Bonnes pratiques recommandées - Activer un job de lint et tests unitaires avant build d’image. - Signer les images (Cosign) et activer des scans SCA/Container. - Gérer explicitement les tags et le changelog en CI. - Déployer via Helm chart versionné, avec valeurs par environnement (`values.{env}.yaml`).