Aller au contenu

Vue d'ensemble du déploiement

KanjiIQ utilise un pipeline CI/CD entièrement automatisé qui construit les images Docker, les pousse vers le Forgejo Container Registry et déploie sur le cluster k3s à chaque push vers main.

Flux du pipeline

graph LR
    A[git push main] --> B[Forgejo Actions<br/>Triggered]
    B --> C[Docker Build<br/>Multi-stage]
    C --> D[Push to Registry<br/><registry>]
    D --> E[kubectl set image<br/>Rolling update]
    E --> F[Rollout Status<br/>Health check]

Déclenchement basé sur les chemins

Chaque composant dispose de son propre workflow, déclenché uniquement lorsque les fichiers pertinents changent :

Workflow Chemins déclencheurs Image
deploy-frontend.yml frontend/**, Dockerfile.frontend, nginx.frontend.conf jlpt-kanji-frontend
deploy-backend.yml backend/**, Dockerfile.backend jlpt-kanji-backend
deploy-docs.yml docs/**, mkdocs.yml, Dockerfile.docs jlpt-kanji-docs

Cela signifie que la modification d'une page de documentation ne déclenche pas la reconstruction du frontend ou du backend.

Stratégie de déploiement

KanjiIQ utilise les rolling updates de Kubernetes :

  • De nouveaux pods sont créés avec l'image mise à jour
  • Les sondes de readiness doivent réussir avant que les anciens pods ne soient terminés
  • Si la nouvelle version échoue aux vérifications de santé, le déploiement est automatiquement arrêté
  • Déploiements sans interruption avec 2 réplicas

Environnements

Environnement Fonction URL
Production Application en ligne kanjiiq.com
Staging Tests pré-release Namespace Kubernetes local
Développement Développement local localhost:8080 / localhost:3000

L'environnement de staging reproduit les manifestes de production dans un namespace Kubernetes séparé (jlpt-kanji-staging) avec sa propre instance PostgreSQL.

Tagging des images

Chaque build produit deux tags :

  • :latest — Pointe toujours vers le build le plus récent
  • :COMMIT_SHA — Tag immuable pour la traçabilité

Les déploiements utilisent le tag SHA du commit pour garantir des déploiements déterministes :

kubectl set image deployment/jlpt-kanji \
  frontend=<registry>/jlpt-kanji-frontend:abc1234 \
  -n jlpt-kanji