5. Github Actions
GitHub Actions est un outil d'automatisation intégré à GitHub qui permet d'exécuter des workflows (flux de travail) automatiquement en réponse à des événements (push, pull request, etc.).
Cas d'usage
- Exécuter des tests à chaque push
- Vérifier le formatage du code
- Valider les commits
- Déployer automatiquement en production
- Publier des packages npm
- Envoyer des notifications
Pourquoi c'est important ?
Sans CI/CD, vous devez manuellement :
- Vérifier que le code compile
- Exécuter tous les tests
- Vérifier le linting
- S'assurer que le formatage est correct
Problème : Si un développeur oublie une étape, du code cassé peut être mergé. Avec GitHub Actions, tout est automatique et garanti
Concepts de base
Workflow
Un workflow est un fichier YAML qui définit les actions à exécuter. Il est stocké dans .github/workflows/.
Job
Un job est un ensemble d'étapes (steps) qui s'exécutent sur une machine virtuelle.
Step
Une step est une action individuelle (installer des dépendances, exécuter des tests, etc.).
Event
Un event déclenche l'exécution d'un workflow (push, pull_request, schedule, etc.).
Notre premier workflow
Nous allons créer un workflow qui s'exécute à chaque pull request et vérifie :
- Que le code compile
- Que les tests passent
- Que le linting est correct
- Que le formatage est bon
Créer le fichier workflow
Créez le fichier .github/workflows/ci.yml :
name: CI
on:
pull_request:
branches: [main]
push:
branches: [main]
jobs:
test:
name: Test and Lint
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'
- name: Install dependencies
run: npm ci
- name: Run linter
run: npm run lint
- name: Check code formatting
run: npm run format:check
- name: Run type checking
run: npm run typecheck
- name: Run tests
run: npm run test
Explication du workflow
Déclencheurs :
on:
pull_request:
branches: [main]
push:
branches: [main]
- Le workflow s'exécute à chaque pull request vers
main - Et à chaque push sur
main
Job :
jobs:
test:
runs-on: ubuntu-latest
- Nom du job :
test - S'exécute sur Ubuntu (machine virtuelle GitHub)
Steps :
- Checkout : Récupère le code du repository
- uses: actions/checkout@v4
- Setup Node.js : Installe Node.js
- uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'
- Installer les dépendances :
- run: npm ci
npm ci est plus rapide que npm install et utilise le package-lock.json.
- Exécuter les vérifications :
- run: npm run lint
- run: npm run format:check
- run: npm run typecheck
- run: npm run test
Scripts nécessaires
Assurez-vous que votre package.json contient les scripts :
{
"scripts": {
"lint": "eslint .",
"format:check": "prettier --check .",
"typecheck": "tsc --noEmit",
"test": "vitest run"
}
}
Tester le workflow
- Créez une branche :
git checkout -b test-ci
- Faites une modification :
echo "console.log('test');" >> src/index.ts
- Commit et push :
git add .
git commit -m "feat: test CI workflow"
git push origin test-ci
-
Créez une Pull Request sur GitHub
-
Observez l'exécution :
- Allez sur votre repository GitHub
- Onglet Pull requests → Votre PR
- Vous verrez le workflow s'exécuter en temps réel
Si tout est vert, le code est prêt à être mergé ! Si des erreurs apparaissent, le code doit être corrigé.
Protections de branche
Pour forcer que la CI passe avant de merger, configurez des branch protection rules.
Configuration
- Allez sur votre repository GitHub
- Settings → Branches → Add rule
- Branch name pattern :
main - Cochez :
- Require a pull request before merging
- Require status checks to pass before merging
- Require branches to be up to date before merging
- Sélectionnez les checks :
Test and Lint - Save changes
Résultat
Maintenant, impossible de merger une PR si :
- Les tests échouent
- Le linting échoue
- Le formatage est incorrect
- Le type checking échoue
Seul du code valide peut être mergé ! 🎉
Protections supplémentaires
Require pull request reviews
Obligez au moins 1 revue avant de merger :
Settings → Branches → Branch protection rule :
- Require approvals :
1
Dismiss stale reviews
Si le code change après une revue, annulez l'approbation :
- Dismiss stale pull request approvals when new commits are pushed
Require conversation resolution
Obligez à résoudre tous les commentaires avant de merger :
- Require conversation resolution before merging
Secrets et variables d'environnement
Pour des données sensibles (clés API, tokens), utilisez les GitHub Secrets :
- Settings → Secrets and variables → Actions → New repository secret
- Nom :
JWT_SECRET - Valeur :
votre-secret
Utilisez-le dans votre workflow :
env:
JWT_SECRET: ${{ secrets.JWT_SECRET }}