GitHub
- Open source, communauté immense
- Pull Requests, GitHub Actions, Codespaces
- Marketplace d’extensions
- Idéal pour l’open source, startups, projets collaboratifs
Git est devenu un standard universel. Un écosystème complet s’est construit autour de lui, avec plusieurs plateformes qui enrichissent l’expérience de développement.
GitHub
GitLab
Bitbucket
Azure DevOps
| Plateforme | Open Source | CI/CD | Self Hosting | Écosystème |
|---|---|---|---|---|
| GitHub | Excellent | Excellent | Limité | Excellent |
| GitLab | Très bon | Excellent | Excellent | Très bon |
| Bitbucket | Bon | Bon | Bon | Très bon |
| Azure DevOps | Moyen | Excellent | Bon | Excellent |
Tout le monde n’est pas à l’aise avec la ligne de commande. Les outils graphiques permettent de visualiser et manipuler Git sans terminal.
Client graphique officiel de GitHub. Il permet de :
Client Git avancé avec des fonctionnalités puissantes :
gitGraph
commit id: "Initial"
branch feature/login
checkout feature/login
commit id: "Login UI"
commit id: "Login API"
checkout main
merge feature/login id: "Merge"
Un Webhook est un mécanisme de notification automatique. Il permet à un système d’envoyer des données en temps réel à un autre système lorsqu’un événement se produit.
Push ↓GitHub ↓Webhook (POST HTTP) ↓Discord / Slack / Serveur externeUn développeur pousse du code sur main. GitHub envoie immédiatement une notification à Discord. Toute l’équipe reçoit :
Eurin a effectué un push sur
main— 3 nouveaux commits
Imaginons le scénario suivant : après chaque push, vous devez :
Faire cela manuellement à chaque modification devient rapidement :
Lent Répétitif Source d'erreursL’automatisation résout ces problèmes en exécutant ces tâches de manière fiable et reproductible.
GitHub Actions est le moteur d’automatisation intégré à GitHub. Il permet de déclencher des tâches (workflows) en réponse à des événements du dépôt.
| Concept | Description |
|---|---|
| Workflow | Processus automatisé défini dans un fichier YAML |
| Event | Déclencheur (push, pull_request, schedule…) |
| Job | Ensemble d’étapes exécutées sur un même runner |
| Step | Commande ou action individuelle |
| Action | Unité réutilisable (marketplace ou personnalisée) |
| Runner | Machine virtuelle qui exécute le workflow |
.github/└── workflows/ └── ci.ymlname: CI
on: push: branches: [main, develop] pull_request: branches: [main]
jobs: test: runs-on: ubuntu-latest
steps: - uses: actions/checkout@v4
- name: Install dependencies run: npm install
- name: Run tests run: npm test# Déclenchement sur pushon: push
# Sur pull requeston: pull_request
# Planifié (cron)on: schedule: - cron: '0 6 * * 1' # Tous les lundis à 6h UTC
# Manuelon: workflow_dispatch:
# Sur plusieurs événementson: push: branches: [main] pull_request: branches: [main] schedule: - cron: '0 0 * * 0'jobs: test: runs-on: ubuntu-latest strategy: matrix: node-version: [18, 20, 22]
steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: ${{ matrix.node-version }} - run: npm ci - run: npm testLe Marketplace GitHub propose des milliers d’actions prêtes à l’emploi :
- uses: actions/checkout@v4 # Récupère le code- uses: actions/setup-node@v4 # Configure Node.js- uses: actions/setup-python@v5 # Configure Python- uses: docker/build-push-action@v5 # Build & push Docker- uses: actions/cache@v4 # Met en cache les dépendances- uses: actions/upload-artifact@v4 # Archive des artéfactsname: CI Pipeline
on: push: branches: [main, develop] pull_request: branches: [main]
env: NODE_VERSION: 20
jobs: lint: name: Lint runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: ${{ env.NODE_VERSION }} cache: npm - run: npm ci - run: npm run lint
test: name: Test needs: lint runs-on: ubuntu-latest strategy: matrix: node-version: [18, 20, 22] 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 - uses: actions/upload-artifact@v4 with: name: coverage-${{ matrix.node-version }} path: coverage/
build: name: Build needs: test runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: ${{ env.NODE_VERSION }} cache: npm - run: npm ci - run: npm run build - uses: actions/upload-artifact@v4 with: name: build path: dist/
deploy: name: Deploy needs: build runs-on: ubuntu-latest if: github.ref == 'refs/heads/main' steps: - uses: actions/download-artifact@v4 with: name: build path: dist/ - name: Deploy to production run: | echo "Déploiement en production..." # Exemple : scp, rsync, ou appel APIGitLab propose également un moteur d’automatisation puissant, intégré nativement à sa plateforme.
Push ↓Pipeline ↓Stages (build → test → deploy) ↓Jobs ↓Runners ↓Résultat.gitlab-ci.ymlstages: - build - test - deploy
build-app: stage: build image: node:20 script: - npm ci - npm run build artifacts: paths: - dist/
test-app: stage: test image: node:20 script: - npm ci - npm test
deploy-production: stage: deploy image: alpine:latest script: - echo "Déploiement en production..." only: - main| Caractéristique | GitHub Actions | GitLab CI/CD |
|---|---|---|
| Fichier de config | .github/workflows/*.yml | .gitlab-ci.yml |
| Runners | Hébergés ou auto-hébergés | Hébergés ou auto-hébergés |
| Marketplace | Oui (GitHub Marketplace) | Non (templates) |
| Matrice | strategy.matrix | parallel:matrix |
| Cache | actions/cache | cache: |
| Artefacts | actions/upload-artifact | artifacts: |
Une application moderne dépend de bibliothèques, frameworks et packages. Ces dépendances peuvent contenir des vulnérabilités, des secrets exposés ou du code malveillant. La sécurité ne concerne plus uniquement votre code, mais tout l’écosystème.
Stocker des secrets dans le code est une mauvaise pratique.
// ❌ Mauvaise pratiqueconst API_KEY = "sk-1234567890abcdef";# ✅ Bonne pratique : utiliser GitHub Secretsjobs: deploy: runs-on: ubuntu-latest steps: - name: Deploy with secret run: ./deploy.sh env: API_KEY: ${{ secrets.API_KEY }}Les secrets sont chiffrés et injectés comme variables d’environnement au moment de l’exécution.
Dependabot surveille automatiquement vos dépendances :
version: 2updates: - package-ecosystem: "npm" directory: "/" schedule: interval: "weekly" open-pull-requests-limit: 10
- package-ecosystem: "github-actions" directory: "/" schedule: interval: "monthly"GitHub peut détecter automatiquement les secrets exposés dans votre code :
Dès qu’un secret est détecté, GitHub alerte l’équipe et peut bloquer le push.
Un commit signé cryptographiquement permet de vérifier :
git config --global user.signingkey KEY_IDgit config --global commit.gpgsign truegit commit -S -m "feat: ajout authentification"Empêche les actions dangereuses sur les branches critiques :
mainPrincipe fondamental : donner uniquement les permissions nécessaires, jamais plus.
jobs: test: runs-on: ubuntu-latest permissions: contents: read # Lecture seule issues: write # Écriture sur les issues pull-requests: write # Écriture sur les PRDéveloppeur ↓Push (Signed Commit) ↓GitHub (Secret Scanning) ↓GitHub Actions (CI/CD) ↓Tests → Build → Deploy ↓Notifications (Webhooks) ↓Dependabot (surveillance continue)Créer un pipeline CI/CD complet pour le projet Operation Sentinel.
Créez le répertoire de workflow :
mkdir -p .github/workflowsCréez .github/workflows/ci.yml avec le contenu suivant :
name: Operation Sentinel CI
on: push: branches: [main, develop] pull_request: branches: [main]
jobs: test: runs-on: ubuntu-latest
steps: - 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 lint run: npm run lint
- name: Run tests run: npm test
- name: Build project run: npm run buildDEPLOY_TOKEN avec une valeur factice - name: Deploy run: ./deploy.sh env: TOKEN: ${{ secrets.DEPLOY_TOKEN }}Créez .github/dependabot.yml :
version: 2updates: - package-ecosystem: "npm" directory: "/" schedule: interval: "weekly" - package-ecosystem: "github-actions" directory: "/" schedule: interval: "monthly"main :
test doit passer)Construisez un pipeline complet qui exécute la chaîne suivante :
Push ↓Lint ↓Test ↓Build ↓Notification (via Webhook Discord/Slack)Créer le workflow — Ajoutez un job notify à la fin du pipeline existant.
Ajouter une action de notification — Utilisez action-slack/notify ou Ilshidur/action-discord.
Configurer le secret — Stockez le webhook URL dans un GitHub Secret.
Pousser le code — Déclenchez le pipeline et vérifiez la notification.
name: Pipeline Complet
on: push: branches: [main]
jobs: quality: 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 lint - run: npm test - run: npm run build
notify: needs: quality runs-on: ubuntu-latest steps: - name: Send notification uses: Ilshidur/action-discord@master env: DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }} with: args: "✅ Pipeline terminé avec succès !"L’ingénierie moderne ne consiste plus uniquement à écrire du code. Elle consiste également à :
Le workflow moderne devient :
Code → Git → GitHub → Tests → Build → Deploy → MonitoringQuelle est la syntaxe de base d'un workflow GitHub Actions ?
Cliquer pour révéler la réponsename → on → jobs → runs-on → steps avec uses/run
Cliquer pour voir la questionQuels événements peuvent déclencher une CI ?
Cliquer pour révéler la réponsepush, pull_request, schedule, workflow_dispatch, release
Cliquer pour voir la questionQuel est le rôle d'un Webhook GitHub ?
Cliquer pour révéler la réponseNotifier un système externe en temps réel lors d'un événement du dépôt
Cliquer pour voir la questionQue fait Dependabot ?
Cliquer pour révéler la réponseAnalyse les dépendances et ouvre automatiquement des PR pour les mettre à jour
Cliquer pour voir la questionQu'est-ce que le CI/CD ?
Quel fichier définit un workflow GitHub Actions ?
Quel est le rôle d'un Webhook ?
Quel outil surveille automatiquement les dépendances pour détecter les vulnérabilités ?
Pourquoi est-il déconseillé de coder un secret en dur dans le code source ?