6.7 KiB
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-resourcesvia SSH. - Image Docker: construction multi-étapes, publication vers le registre Docker hébergé sur
git.4nkweb.com(accès via clés SSH). - Déploiement Kubernetes: namespace
lecoffre, intégration Vault Agent pour l’injection d’ENV,ExternalSecretpour le secret de pull Docker,IngressTLS via cert-manager, ressources deDeployment/Service. - Variables front ajoutées:
NEXT_PUBLIC_4NK_IFRAME_URLpour distinguer l’URL complète de l’iframe de son origin (NEXT_PUBLIC_4NK_URL).
Chaîne de build
-
Dépendances
package.jsonindique Next.js 14, TypeScript 4.9, ESLint 8.36, etc.- La dépendance privée
le-coffre-resourcesest récupérée depuisgit.4nkweb.comvia SSH (git+ssh).
-
Dockerfile (multi-étapes, Node 19-alpine)
- Étape
deps: installation des dépendances avecnpm installen 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éfautnpm run dev(pour le développement local). Pour la prod, l’image utilisée en cluster exécutenpm run start(cf. manifeste).
- Étape
-
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).
- Script
Image, registre et version
- Registre: Docker registry interne sur
git.4nkweb.com. - Tagging: contrôlé par la CI via le message de commit (préfixe
ci: docker_tag=<valeur>), sinon fallbackdev-test. La branche peut être utilisée comme tag par défaut selon la CI. Recommandation: utiliser un tag non versionnéext.
Déploiement Kubernetes (extrait de temp.yaml)
-
Namespace:
lecoffre -
ServiceAccount:
lecoffre-front-saavecSecrettoken associé. -
ExternalSecret: création de
imagePullSecretà partir de Vault viaexternal-secrets.ioen lisantsecret/data/lecoffre-front-stg/config/dockerpullsecret(clé.dockerconfigjson). -
Deployment:
apps/v1nommélecoffre-frontavec:image:rg.fr-par.scw.cloud/lecoffre/front:v0.1.9imagePullPolicy:Alwaysresources: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/envsen exportant chaque paireclé=valeurdans/vault/secrets/envs. - Commande de démarrage:
['sh','-c', '. /vault/secrets/envs && npm run start']
-
Service: type ClusterIP exposant le port 80 vers le
targetPort3000 du conteneur Next.js. -
Ingress: classe
nginxavec TLS géré parcert-manager(ClusterIssuerletsencrypt-prod) pourapp.stg.lecoffre.smart-chain.fr.
Flux CI/CD attendu (déduit)
-
Checkout + préparation
- Récupération du code et configuration de l’agent SSH (accès à
git.4nkweb.com).
- Récupération du code et configuration de l’agent SSH (accès à
-
Installation des dépendances
npm installavec BuildKit (--mount=type=ssh) pour la dépendance privée.
-
Build applicatif
npm run build(désactive la télémétrie et le lint bloquant).
-
Construction de l’image
- Réalisée par la CI (BuildKit + forward d’agent SSH) après un
git pushsurgit.4nkweb.com. - Taggage déterminé par le message de commit et/ou la branche.
- Réalisée par la CI (BuildKit + forward d’agent SSH) après un
-
Push au registre
- Réalisé par la CI vers le registre
git.4nkweb.com.
- Réalisé par la CI vers le registre
-
Déploiement Kubernetes
- Application des manifestes (ou rendu Helm) dans le namespace
lecoffre. - Les secrets de pull sont fournis via
ExternalSecretconnecté à Vault. - Au runtime, Vault Agent injecte les variables d’environnement nécessaires avant
npm run start.
- Application des manifestes (ou rendu Helm) dans le namespace
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 parExternalSecretà partir de Vault.
Secrets CI requis
- USER: identifiant du compte CI sur
git.4nkweb.comdisposant des droits requis (lecture repo, push d’image vers le registry). - TOKEN: jeton d’accès (API/registry) associé à
USER. Utilisé par la CI pour:- Authentifier les actions git/HTTP vers
git.4nkweb.com(si nécessaire) - Authentifier le
docker loginvers le registry Gitea si la CI ne repose pas sur des credentials intégrés.
- Authentifier les actions git/HTTP vers
Notes:
- Préférer des tokens à portée restreinte, régénérés périodiquement.
- Stocker
USERetTOKENdans le gestionnaire de secrets CI et ne jamais les committer.
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-lintau build Next.js). - Passage des variables
NEXT_PUBLIC_4NK_URLetNEXT_PUBLIC_4NK_IFRAME_URLà l’étape de build Docker (ARG/ENV) dans la CI.
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).
Validation de l'image Docker « ext » (intégration des variables)
- Objectif: vérifier que les variables
NEXT_PUBLIC_*sont bien injectées dans l'image construite par la CI. - Commande:
docker pull git.4nkweb.com/4nk/lecoffre-front:ext
docker run --rm git.4nkweb.com/4nk/lecoffre-front:ext sh -lc "env | grep '^NEXT_PUBLIC_' | sort"
- Attendus clés:
NEXT_PUBLIC_4NK_URLetNEXT_PUBLIC_4NK_IFRAME_URLdoivent être définies.- Les URLs API (
NEXT_PUBLIC_API_URL,NEXT_PUBLIC_BACK_API_*) doivent refléter l'environnement.