O05 Pull Requests & Code Review

Les Pull Requests sont le coeur de la collaboration sur GitHub. Ce module couvre leur anatomie, les stratégies de merge, la code review et la protection des branches.

1 · Anatomie d'une Pull Request

Une PR est bien plus qu'une simple demande de merge — c'est un espace de conversation et de validation.

feat: ajout authentification JWT #47 Open
👤 Alaa EL HUSSEIN
🌿 feature/jwt-authmain
📁 5 fichiers modifiés, +247 / -12
🏷️ enhancement ready for review
👥 Reviewers: team-backend
🔗 Closes #23, #31
✅ CI: 3 checks passed
💬 4 commentaires
2 approbations

Composants clés d'une PR

  • Titre — Suivre les Conventional Commits : feat: ..., fix: ..., docs: ...
  • Description — What (quoi), Why (pourquoi), How (comment), Test plan
  • Liste des commits — Chaque commit visible individuellement
  • Files changed — Diff complet, ligne par ligne, commentable
  • Checks CI — Tests automatiques, linting, build
  • Reviewers — Personnes assignées pour valider
  • Labels — Catégorisation : bug, enhancement, breaking-change…
  • Linked issuesCloses #42 ferme l'issue au merge

Draft Pull Request

# Créer une PR en mode brouillon (work in progress)
gh pr create --draft --title "feat: [WIP] authentification JWT"

# Convertir en PR normale quand prêt
# → GitHub : bouton "Ready for review"
gh pr ready
Draft PR : Idéal pour partager du travail en cours, recevoir un feedback précoce, et montrer l'avancement sans que la PR soit mergeable.

2 · Templates de Pull Request

Un template PR standardise les informations à fournir à chaque contribution.

Emplacement du fichier

.github/PULL_REQUEST_TEMPLATE.md
# ou pour plusieurs templates :
.github/PULL_REQUEST_TEMPLATE/feature.md
.github/PULL_REQUEST_TEMPLATE/bugfix.md

Template complet recommandé

## What — Qu'est-ce que cette PR fait ?


## Why — Pourquoi ces changements sont-ils nécessaires ?

Closes #

## How — Comment avez-vous implémenté la solution ?


## Test plan
- [ ] Tests unitaires ajoutés / mis à jour
- [ ] Tests end-to-end validés
- [ ] Testé manuellement en local
- [ ] Pas de régression sur les features existantes

## Screenshots (si changements UI)
| Avant | Après |
|-------|-------|
| ...   | ...   |

## Checklist
- [ ] Code auto-documenté (commentaires pertinents)
- [ ] Pas de secrets dans le code
- [ ] CHANGELOG mis à jour si breaking change
Astuce : Un bon template réduit les aller-retours en code review et accélère le cycle de validation.

3 · Stratégies de merge

GitHub propose 3 façons de merger une Pull Request, chacune avec un impact différent sur l'historique.

🔀 Merge commit

Crée un commit de merge. Conserve l'historique complet de la branche.

✅ Idéal pour : features importantes, branches longues, audit trail

⬜ Squash and merge

Fusionne tous les commits en 1 seul. Historique linéaire et propre.

✅ Idéal pour : PRs avec commits "WIP", historique de main propre

↕️ Rebase and merge

Rejoue chaque commit de la branche sur main. Linéaire sans squash.

✅ Idéal pour : commits atomiques bien structurés, pas de merge commits

Comparaison de l'historique résultant

StratégieCommits ajoutésHistoriqueSHA modifiés
Merge commitN commits + 1 mergeNon linéaireNon
Squash and merge1 seul commitLinéaireOui (nouveau)
Rebase and mergeN commitsLinéaireOui (replay)
# Merger via GitHub CLI
gh pr merge 47 --merge       # merge commit
gh pr merge 47 --squash      # squash and merge
gh pr merge 47 --rebase      # rebase and merge

# Avec suppression automatique de la branche
gh pr merge 47 --squash --delete-branch

4 · Code Review

Approve

Code validé. Comptabilisé pour les règles de protection de branche.

🔄

Request changes

Modifications obligatoires avant de pouvoir merger.

💬

Comment

Feedback neutre. Ne bloque ni n'approuve le merge.

Suggestion de code

# Dans un commentaire de review sur GitHub :
# Cliquer sur le "+" en face d'une ligne → "Add a suggestion"
# Ou écrire manuellement :

```suggestion
const userEmail = input.trim().toLowerCase();
const isValid   = /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(userEmail);
```

# L'auteur peut appliquer en 1 clic → commit automatique dans la PR
# Plusieurs suggestions peuvent être groupées en 1 commit

Checklist du reviewer

  • Logique — Le code fait-il ce qu'il est censé faire ?
  • Sécurité — Y a-t-il des injections, failles XSS, données sensibles exposées ?
  • Performance — N+1 queries, boucles inutiles, fuite mémoire ?
  • Tests — Les cas limites sont-ils couverts ?
  • Lisibilité — Noms de variables clairs, fonctions courtes ?
  • DRY — Code dupliqué qui pourrait être factorisé ?

CODEOWNERS — reviewers automatiques

# .github/CODEOWNERS
# Format : <pattern> @owner ou @org/team

# Tout le code — team lead reviewe tout
* @team-lead

# API backend — team backend
/src/api/**   @org/backend

# Frontend — team frontend
/src/ui/**    @org/frontend

# Sécurité — toujours revue par le secops
/src/auth/**  @secops-team @team-lead

# Infrastructure
*.tf          @devops
docker*.yml   @devops
Convention : Distinguez les bloquants (MUST:) des suggestions (NIT: pour nitpick ou OPTIONAL:) dans vos commentaires.

5 · Branch Protection Rules

Les règles de protection empêchent les modifications directes sur les branches importantes et garantissent la qualité.

  • 👥
    Required pull request reviews Minimum 2 approbations avant le merge. Les "Dismiss stale reviews" annule les approbations si un nouveau push est fait.
  • Required status checks La CI (tests, lint, build) doit passer. "Require branches to be up to date" force le rebase avant merge.
  • 🔒
    Restrict direct pushes Interdit les commits directs sur main — tout passe par une PR.
  • 📏
    Require linear history Interdit les merge commits — force Squash or Rebase. Maintient un historique propre.
  • 🗑️
    Restrict deletions Empêche la suppression de la branche protégée.

Configuration via API / GitHub CLI

# Voir la protection d'une branche
gh api repos/OWNER/REPO/branches/main/protection

# Exemple de config JSON (via Settings > Branches sur GitHub)
{
  "required_status_checks": {
    "strict": true,
    "contexts": ["ci/tests", "ci/lint"]
  },
  "required_pull_request_reviews": {
    "required_approving_review_count": 2,
    "dismiss_stale_reviews": true
  },
  "restrictions": null,
  "enforce_admins": true
}
Attention : Activez enforce_admins: true pour que les règles s'appliquent aussi aux administrateurs du dépôt — sinon ils peuvent bypasser la protection.

6 · Labels, Assignees, Reviewers & Issues liées

🏷️ Labels

  • bug — défaut à corriger
  • enhancement — nouvelle fonctionnalité
  • documentation — docs seulement
  • breaking-change — incompatibilité
  • good first issue — pour débutants
  • help wanted — aide bienvenue
  • blocked — bloqué par autre chose

🎯 Milestones

  • Regrouper PR/issues par version
  • Ex : v2.0.0, Sprint 5
  • Suivi de progression (% closed)
  • Date d'échéance configurable

📋 GitHub Projects

  • Tableau Kanban intégré (To Do / In Progress / Done)
  • Lier issues ET pull requests
  • Automatisation : PR mergée → carte Done
  • Vues table, board, roadmap

🤖 Automatisations

  • Closes #42 dans PR → issue fermée au merge
  • CODEOWNERS → reviewers auto-assignés
  • Stale bot → alerte PR inactives
  • GitHub Actions → checks auto

Workflow labeling recommandé

# Ajouter un label via CLI
gh pr edit 47 --add-label "enhancement,ready for review"

# Assigner des reviewers
gh pr edit 47 --add-reviewer "collègue1,collègue2"

# Checker l'état des PR
gh pr list --state open --label "bug"

# Voir une PR spécifique
gh pr view 47 --web
← O04 : GitHub Remote
Exercices O05 → Accueil →