DEV NOTE
Mettre en place une pipeline CI/CD simple avec GitHub Actions
Une méthode concrète pour relier lint, tests et build dans une pipeline CI/CD GitHub Actions exploitable.
CI/CD & DevOpsTEMPS DE LECTURE : 4 MIN
Introduction : GitHub Actions, le CI/CD natif de GitHub
GitHub Actions est devenu l'outil CI/CD incontournable pour les projets hébergés sur GitHub. Lancé en 2019, il offre une intégration native avec vos repositories, éliminant le besoin de configurer des services tiers comme Jenkins ou Travis CI.
L'avantage majeur ?
Tout se passe au même endroit : code, issues, pull requests et pipelines de déploiement.
Concepts fondamentaux
Workflows, Jobs et Steps
Un
workflow est un processus automatisé défini en YAML et stocké dans
.github/workflows/.
Structure hiérarchique :
- Workflow : processus complet (CI, CD, release...)
- Job : unité d'exécution (tests, build, deploy...)
- Step : action individuelle (run command, use action...)
Déclencheurs (Triggers)
GitHub Actions peut réagir à de nombreux événements :
- push : sur un commit
- pull_request : ouverture/modification de PR
- schedule : cron jobs (backups, cleanups...)
- workflow_dispatch : déclenchement manuel
- release : création de release
Pipeline CI complète
Créez
.github/workflows/ci.yml :
name: CI Pipeline
on:
push:
branches: [main, develop]
pull_request:
branches: [main]
jobs:
lint:
name: Code Quality
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'
- run: npm ci
- run: npm run lint
- run: npm run format:check
test:
name: Tests
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [18, 20]
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
cache: 'npm'
- run: npm ci
- run: npm test -- --coverage
- name: Upload coverage
if: matrix.node-version == '20'
uses: codecov/codecov-action@v4
with:
token: ${{ secrets.CODECOV_TOKEN }}
build:
name: Build
needs: [lint, test]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'
- run: npm ci
- run: npm run build
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: dist
path: dist/
Points clés
1. Parallélisation
"lint" et "test" tournent en même temps. "build" attend leur succès avec
needs.
2. Matrix builds
Teste sur Node 18 et 20 simultanément.
3. Caching
cache: 'npm' divise le temps d'install par 3.
Pipeline CD : Déploiement
.github/workflows/deploy.yml :
name: Deploy
on:
push:
branches: [main]
jobs:
deploy-staging:
name: Deploy Staging
runs-on: ubuntu-latest
environment:
name: staging
url: https://staging.app.com
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'
- run: npm ci
- run: npm run build
env:
VITE_API_URL: ${{ secrets.STAGING_API }}
- name: Deploy to Vercel
uses: amondnet/vercel-action@v25
with:
vercel-token: ${{ secrets.VERCEL_TOKEN }}
vercel-org-id: ${{ secrets.ORG_ID }}
vercel-project-id: ${{ secrets.PROJECT_ID }}
deploy-production:
name: Deploy Production
needs: deploy-staging
runs-on: ubuntu-latest
environment:
name: production
url: https://app.com
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'
- run: npm ci
- run: npm run build
env:
VITE_API_URL: ${{ secrets.PROD_API }}
- name: Deploy to Vercel Prod
uses: amondnet/vercel-action@v25
with:
vercel-token: ${{ secrets.VERCEL_TOKEN }}
vercel-org-id: ${{ secrets.ORG_ID }}
vercel-project-id: ${{ secrets.PROJECT_ID }}
vercel-args: '--prod'
Gestion des Secrets
Créer des secrets
Dans GitHub :
Settings → Secrets and variables → Actions
Types de secrets :
- Repository secrets : accessibles partout
- Environment secrets : staging vs production
- Organization secrets : partagés entre repos
Utilisation dans le workflow
env:
API_KEY: ${{ secrets.API_KEY }}
DB_URL: ${{ secrets.DATABASE_URL }}
PUBLIC_VAR: ${{ vars.PUBLIC_CONFIG }}
Sécurité :
- Ne jamais echo un secret
- Masquer automatiquement dans les logs
- Révoquer si compromis
Optimisations avancées
Caching multi-niveaux
- name: Cache dependencies
uses: actions/cache@v4
with:
path: |
~/.npm
node_modules
.next/cache
key: ${{ runner.os }}-${{ hashFiles('**/package-lock.json') }}
Conditional execution
- name: Deploy only on main
if: github.ref == 'refs/heads/main' && success()
run: npm run deploy
Reusable workflows
Créez des workflows réutilisables pour éviter la duplication :
# .github/workflows/deploy-reusable.yml
on:
workflow_call:
inputs:
environment:
required: true
type: string
Actions du Marketplace
Actions essentielles :
- actions/checkout@v4 : clone le repo
- actions/setup-node@v4 : installe Node.js
- actions/cache@v4 : cache les dépendances
- codecov/codecov-action : upload coverage
- slackapi/slack-github-action : notifs Slack
Debugging
Activer les logs détaillés
Ajoutez dans Settings → Secrets :
- ACTIONS_RUNNER_DEBUG = true
- ACTIONS_STEP_DEBUG = true
Afficher le contexte
- name: Debug
run: echo '${{ toJSON(github) }}'
Best Practices
1. Versionner les actions
- actions/checkout@v4
- actions/checkout@main
2. Timeouts
jobs:
test:
timeout-minutes: 10
3. Fail fast
strategy:
fail-fast: true
4. Environnements protégés
Activez "Required reviewers" pour la production.
Conclusion
GitHub Actions transforme le CI/CD en un
processus transparent et automatisé.
Avantages clés :
- Gratuit pour projets publics
- Intégration GitHub native
- 10 000+ actions disponibles
- Configuration simple en YAML
Action immédiate : Créez votre premier workflow CI aujourd'hui et observez la magie opérer !
Ressources :
- docs.github.com/actions
- github.com/marketplace?type=actions
- github.com/sdras/awesome-actions