Configurer les Github Actions
Apprends à automatiser la CI avec Github Actions : build Docker et vérification TypeScript pour un déploiement React Router 7 fiable.
Dans cette leçon, tu vas apprendre à :
- pousser ton projet React Router 7 sur GitHub ;
- déclencher un workflow CI dès chaque push ;
- faire tourner 2 jobs :
build(image Docker) ettypecheck(TS strict) ; - lire les logs pour corriger une erreur de typage avant qu’elle n’atteigne la prod.
En clair : tu poses les bases d’un pipeline de Continuous Integration robuste, première brique indispensable avant le déploiement automatisé.
Préparer le dépôt Git
1# depuis la racine du projet2git init3git add .4git commit -m "Initial commit"
- Crée un repo vide sur GitHub.
- Ajoute-le comme
origin, bascule surmainet pousse :
1git branch -M main2git remote add origin git@github.com:<ton-user>/5-configurer-les-github-actions.git3git push -u origin main
Tip
push, rafraîchis la page GitHub : tout ton code est en ligne.Première action : builder l’image Docker
Depuis l’onglet Actions de GitHub, sélectionne le template “Docker image” puis clique sur Set up this workflow.
GitHub génère automatiquement un fichier :
1name: Docker Image CI23on:4push:5branches: ["main"]6pull_request:7branches: ["main"]89jobs:10build:11runs-on: ubuntu-latest12steps:13- uses: actions/checkout@v4 # 1️⃣ clone le repo sur le runner14- name: Build the Docker image # 2️⃣ docker build15run: docker build . -t my-app:latest
actions/checkout@v4est le “git clone” de la plate-forme – indispensable dans 99 % des workflows.
Valide le fichier avec Commit changes.
Un dossier .github/workflows apparaît : ton projet est désormais “CI ready”.
Anatomie d’un workflow GitHub Actions
| Élément | Rôle |
|---|---|
on | Déclencheurs (push, PR, cron…). Ici seulement branch main. |
jobs | Liste de tâches pouvant tourner en parallèle. |
runs-on | OS du runner. ubuntu-latest = VM Linux fournie par GitHub. |
steps | Commandes séquentielles ; chaque step tourne dans le même conteneur que le job. |
Note
Ajouter un second job de type-checking
Nous voulons bloquer la CI si le code TypeScript n’est plus valide.
1jobs:2build:3…4+ typecheck:5+ runs-on: ubuntu-latest6+ steps:7+ - uses: actions/checkout@v48+ - name: Install dependencies9+ run: npm ci10+ - name: Run typechecking11+ run: npm run typecheck
- Pourquoi un second job ?
- Les jobs tournent en parallèle ➜ pas d’allongement artificiel du temps de CI.
- Tu sépares clairement “build prod” et “qualité du code”.
📥 Commit, pousse, puis ouvre l’onglet Actions : une nouvelle exécution démarre avec 2 jobs.
Corriger les erreurs de typage
Dans la vidéo, le job typecheck échoue :
1error TS2322: Type 'undefined' is not assignable to type 'string'.
Reproduis localement :
1npm run typecheck
La commande plante au même endroit → parfait.
Corrige le fichier incriminé (ici users.server.ts), puis relance :
1npm run typecheck # ✅ 0 error2git add .3git commit -m "fix: type error in addUser"4git push
Nouvelle exécution GitHub Actions : les deux jobs passent au vert.
Important
La CI est là pour ça !
Lire les logs pour comprendre un échec
- Ouvre Actions → build #<id> → typecheck.
- Chaque step affiche les commandes exécutées et la sortie complète.
- Clique sur un step pour le replier / déplier.
Le même principe s’applique aux tests unitaires, à des scripts de lint, au build statique, etc.
Bonnes pratiques pour tes futurs workflows
- Un job = un objectif (build, tests, lint, e2e…).
- N’installe les dépendances (
npm ci) quand c’est nécessaire. - Utilise des caches (
actions/cache) pour accélérernpm cisur les jobs lourds. - Bloque la branche
maindans Settings → Branch protection (merge refusé si la CI échoue). - Garde tes secrets (clé Docker Hub, SSH VPS...) dans Settings → Secrets & variables
jamais en clair dans le
.yml.
Dans la prochaine leçon on s’attaque au Dockerfile de production : comment embarquer React Router, Prisma et Tailwind dans une image minimaliste, puis pousser cette image sur Docker Hub – prérequis ultime avant le déploiement auto sur ton VPS.
Comprendre les concepts fondamentaux
Quelle est la principale différence entre les composants client et serveur dans React ?
Optimisation des performances
Quelle technique est recommandée pour éviter les rendus inutiles dans React ?
Architecture des données
Quel hook permet de gérer les effets de bord dans un composant React ?