Exercice 05 : Collaboration en Équipe
🎯 Objectifs
À la fin de cet exercice, vous serez capable de :
- ✅ Simuler un workflow d'équipe avec Git
- ✅ Créer des branches de fonctionnalités
- ✅ Créer et réviser des Pull Requests
- ✅ Gérer les feedback et les changements
- ✅ Merger du code en équipe
- ✅ Maintenir un historique propre
Durée estimée : 40 minutes
Difficulté : ⭐⭐⭐☆☆ (Intermédiaire)
Prérequis :
- Avoir complété Exercice 01-04 (Git, branches, GitHub)
📖 Contexte
Dans un vrai projet DevOps, vous ne changez jamais main directement. Au lieu de cela :
- Créez une branche pour votre fonctionnalité
- Poussez la branche vers GitHub
- Créez une Pull Request (demande de fusion)
- Demandez une review à un collègue
- Ils révisent et donnent du feedback
- Vous faites les changements si nécessaire
- Ils approuvent et vous mergez
C'est le workflow professionnel que vous verrez partout.
📋 Énoncé
Vous allez simuler une équipe de 2 personnes :
Alice (vous) :
- Crée une branche
feature/logging - Ajoute un système de logging
- Crée une Pull Request
Bob (simulé par vous) :
- Revoit le code
- Suggère des changements
- Approuve la PR
Résultat :
- Code merged proprement avec historique
- Messages de commit clairs
- Processus de review simul é
🔧 Matériel Nécessaire
- Repository GitHub : Celui créé à l'Exercice 04
- 2 clones locaux : Pour simuler 2 développeurs
- Terminal : Accès à Git
- GitHub.com : Créer une PR via l'interface
- Temps : 60 minutes
🧭 Déroulement de l'exercice
Voici les grandes étapes à réaliser dans l'ordre. Chaque étape décrit ce que vous devez accomplir - à vous de trouver la commande. La solution complète est disponible si vous êtes bloqué.
Tâche 1 : Préparer deux clones (Alice et Bob)
Clonez votre repository deux fois dans des dossiers séparés : un pour Alice, un pour Bob. Ces deux dossiers simulent deux développeurs sur deux machines différentes.
Indice : Créez d'abord un dossier
git-team-exercise/puis clonez deux fois dedans avec des noms de destination différents.
Vérification : Les deux dossiers doivent avoir le même git log --oneline et le remote origin correctement configuré.
Tâche 2 : Alice crée une branche feature et développe
Depuis le clone d'Alice, créez une branche feature/logging et ajoutez un fichier logger.py avec un système de logging basique. Faites au moins 1 commit.
Indice : La convention
feature/nomest une bonne pratique d'équipe. Les commits doivent avoir des messages clairs décrivant ce qui a été ajouté.
Vérification : git log --oneline depuis la branche feature doit montrer le nouveau commit.
Tâche 3 : Alice pousse sa branche sur GitHub
Poussez la branche feature/logging vers GitHub. La branche n'existe pas encore sur le remote - il faut le préciser.
Indice : Pour pousser une nouvelle branche, il faut indiquer à Git où elle doit aller sur le remote avec
--set-upstream(ou-u).
Vérification : La branche feature/logging doit apparaître dans l'onglet "Branches" de votre repository GitHub.
Tâche 4 : Créer une Pull Request
Depuis GitHub.com, créez une Pull Request pour fusionner feature/logging dans main. Rédigez un titre clair et une description qui explique ce que fait ce changement.
Indice : GitHub propose automatiquement de créer une PR quand il détecte une branche récemment poussée. Sinon, utilisez l'onglet "Pull requests" > "New pull request".
Vérification : La PR doit apparaître dans l'onglet "Pull requests" avec le statut "Open".
Tâche 5 : Bob fait une code review
Depuis le clone de Bob, récupérez les dernières branches distantes. Ensuite, depuis GitHub.com, faites une review de la PR : ajoutez au moins 1 commentaire sur une ligne de code spécifique et demandez une modification.
Indice : Bob doit faire
git fetchpour voir les nouvelles branches. Sur GitHub, lors d'une review, vous pouvez commenter une ligne précise en cliquant sur le+qui apparaît à gauche.
Vérification : La PR doit afficher un commentaire de review avec le statut "Changes requested".
Tâche 6 : Alice répond au feedback et met à jour
Depuis le clone d'Alice, faites les modifications demandées par Bob et poussez un nouveau commit sur la même branche.
Indice : De nouveaux commits sur une branche source mettent automatiquement à jour la Pull Request sur GitHub. Pas besoin de recréer la PR.
Vérification : La PR sur GitHub doit montrer le nouveau commit d'Alice, et le commentaire de Bob doit être résolvable.
Tâche 7 : Merger la Pull Request
Bob approuve la PR et la merge dans main. Choisissez l'option "Create a merge commit".
Indice : GitHub propose 3 options de merge : merge commit (préserve l'historique), squash (compresse en un seul commit), rebase (rejoue les commits). Pour cet exercice, le merge commit est le plus pédagogique.
Vérification : La PR doit passer en statut "Merged". git pull depuis main doit récupérer les changements.
� Mini-Projet : Contribuer à un projet partagé
Vous allez simuler un cycle complet de contribution professionnel : branche → développement → PR → review → merge → synchronisation.
Scénario : Vous travaillez sur un projet devops-wiki avec une collègue. Elle a déjà commencé - vous devez ajouter une page sur Docker tout en gérant une review.
Ce que vous devez réaliser :
- Clonez votre repository
devops-portfoliodans deux dossiers :dev-aliceetdev-bob - Depuis
dev-alice: créez une branchefeature/docker-page, ajoutez un fichierdocker.mdavec au moins 5 lignes de contenu, poussez la branche - Depuis
dev-alice: créez une Pull Request versmainavec un titre et une description clairs - Depuis
dev-bob: récupérez les branches distantes et examinez le code de la PR sur GitHub - Depuis GitHub : ajoutez un commentaire de review sur une ligne du fichier et demandez une modification
- Depuis
dev-alice: implémentez la modification demandée, committez et poussez - Depuis GitHub : approuvez la PR et mergez
- Depuis
dev-bob: synchronisezmainavec le remote
Checkpoints de validation :
- La PR apparaît en statut "Merged" dans l'onglet Pull Requests de GitHub
docker.mdest présent dansmainsur GitHub- La PR affiche au moins 2 commits (initial + réponse au feedback)
git log --oneline maindansdev-bob(aprèsgit pull) contient le commit de merge- L'historique GitHub montre clairement qui a committé quoi
- Les branches
feature/docker-page(locale et distante) ont été supprimées après merge
�📚 Étapes Détaillées
Étape 1 : Préparer Deux Clones
Objectif : Simuler deux développeurs avec deux dossiers
Instructions:
- Allez dans un dossier temporaire :
mkdir ~/git-team-exercise
cd ~/git-team-exercise- Créer le clone "Alice" :
git clone git@github.com:USERNAME/ma-premiere-app.git alice
cd alice- Créer le clone "Bob" (retour au parent d'abord) :
cd ..
git clone git@github.com:USERNAME/ma-premiere-app.git bobRésultat :
git-team-exercise/
├── alice/
│ ├── .git/
│ ├── ma-premiere-app/
│ └── ... (tous les fichiers)
└── bob/
├── .git/
├── ma-premiere-app/
└── ... (tous les fichiers)Étape 2 : Alice Crée une Branche de Fonctionnalité
Objectif : Alice commence à travailler sur une nouvelle feature
Instructions:
- Allez dans le dossier d'Alice :
cd alice- Vérifier la branche actuelle :
git branchRésultat attendu :
* main- Créer et basculer vers une branche feature :
git checkout -b feature/logging- Vérifier :
git branchRésultat attendu :
* feature/logging
mainÉtape 3 : Alice Ajoute du Code
Objectif : Alice écrit la nouvellfonctionnalité
Instructions:
- Créer un fichier
logging.py:
cat > logging.py << 'EOF'
import logging
from datetime import datetime
def setup_logging(log_level=logging.INFO):
"""Configure le système de logging pour l'application."""
logger = logging.getLogger(__name__)
logger.setLevel(log_level)
# Formatteur
formatter = logging.Formatter(
'%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)
# Handler fichier
file_handler = logging.FileHandler('app.log')
file_handler.setFormatter(formatter)
logger.addHandler(file_handler)
# Handler console
console_handler = logging.StreamHandler()
console_handler.setFormatter(formatter)
logger.addHandler(console_handler)
return logger
def log_info(message):
"""Log un message d'information."""
logger = logging.getLogger(__name__)
logger.info(message)
if __name__ == "__main__":
logger = setup_logging()
logger.info("Système de logging initialisé")
EOF- Vérifier le fichier :
cat logging.py- Ajouter et committer :
git add logging.py
git commit -m "Ajouter module de logging
- Configuration centralisée du logging
- Sortie vers fichier et console
- Utilise le standard logging Python"Résultat attendu :
[feature/logging 2a3b4c5] Ajouter module de logging
1 file changed, 35 insertions(+)
create mode 100644 logging.pyÉtape 4 : Alice Ajoute des Tests
Objectif : Alice ajoute des tests pour son code
Instructions:
- Créer un fichier
test_logging.py:
cat > test_logging.py << 'EOF'
import logging
from logging_module import setup_logging
def test_logging_setup():
"""Vérifier que le logging s'initialise correctement."""
logger = setup_logging()
assert logger is not None
assert logger.level == logging.INFO
print("✓ Test: logging setup OK")
def test_log_levels():
"""Vérifier les différents niveaux de log."""
logger = setup_logging(logging.DEBUG)
assert logger.level == logging.DEBUG
print("✓ Test: log levels OK")
if __name__ == "__main__":
test_logging_setup()
test_log_levels()
print("\nTous les tests passent!")
EOF- Ajouter et committer :
git add test_logging.py
git commit -m "Ajouter tests unitaires pour le module de logging
- Test de la configuration
- Test des niveaux de log
- Tous les tests passent"Étape 5 : Alice Pousse la Branche
Objectif : Envoyer la branche vers GitHub
Instructions:
- Vérifier les commits locaux :
git log --oneline -3- Pousser la branche :
git push origin feature/loggingRésultat attendu :
Enumerating objects: 6, done.
Counting objects: 100% (6/6), done.
Delta compression using up to 2 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (2/2), 2.45 KiB | 2.45 MiB/s, done.
Total 6 (delta 1), reused 0 (delta 0), reused 1 (delta 0)
remote: Reviewable
To github.com:username/ma-premiere-app.git
* [new branch] feature/logging -> feature/loggingÉtape 6 : Créer une Pull Request sur GitHub
Objectif : Alice demande une review
Instructions:
- Aller sur GitHub.com
- Allez dans le repository et vous devriez voir une notification :
- "feature/logging had recent pushes"
- Bouton "Compare & pull request"
- Cliquer le bouton
- Remplir la PR :
- Title : "Ajouter système de logging"
- Description :
## Description
Ajoute un module de logging centralisé pour l'application.
## Changements
- Créé `logging.py` avec configuration centralisée
- Logs vers fichier et console avec niveau configurable
- Ajouté tests unitaires dans `test_logging.py`
## Checklist
- [x] Code testé localement
- [x] Tests unitaires passent
- [x] Pas de conflits
- [x] Messages de commit clairs
@username Peux-tu réviser?- Cliquer "Create pull request"
Résultat :
- PR créée et visible
- Numéro de PR (ex: #1)
- Section "Conversation" visible
Étape 7 : Bob Revoit la PR
Objectif : Simuler un collègue qui revoit le code
Instructions:
- Aller dans le dossier de Bob :
cd ../bob- Récupérer les derniers changements :
git fetch origin- Voir la branche :
git branch -rRésultat attendu :
origin/feature/logging
origin/main- Sur GitHub, cliquer sur la PR créée
- Cliquer sur l'onglet "Files changed"
- Cliquer sur une ligne de code pour ajouter un commentaire
Étape 8 : Alice Répond aux Commentaires
Objectif : Itération et feedback
Instructions:
Dans cet exercice, supposons que Bob a demandé :
"Peux-tu ajouter un exemple dans le README sur comment utiliser le logging?"
- Retour à Alice :
cd ../alice- Vérifier que vous êtes sur la bonne branche :
git branchRésultat attendu :
* feature/logging
main- Ajouter une section au README :
echo "
## Utilisation du Logging
\`\`\`python
from logging import setup_logging
# Configuration
logger = setup_logging()
# Utilisation
logger.info('Application démarrée')
logger.warning('Attention: espace disque faible')
logger.error('Erreur de connexion à la BD')
\`\`\`
" >> README.md- Ajouter et committer :
git add README.md
git commit -m "Ajouter exemple de logging au README
Répond au feedback de la review:
- Montre comment utiliser le module de logging
- Exemple avec différents niveaux"- Pousser le changement :
git push origin feature/loggingLa PR se met à jour automatiquement !
Étape 9 : Merger la PR
Objectif : Finaliser la fusion
Instructions:
- Sur GitHub, allez à la PR
- Vérifier que :
- ✅ Pas de conflits ("This branch has no conflicts with main")
- ✅ Tous les tests passent
- ✅ Code révisé et approuvé
- Cliquer "Merge pull request"
- Choisir le type de merge (normalement "Create a merge commit")
- Cliquer "Confirm merge"
Résultat :
- PR mergée
- Bouton "Delete branch" apparaît
- Vous pouvez supprimer la branche distante
- Cliquer "Delete branch" (pour nettoyer)
Étape 10 : Synchroniser Localement
Objectif : Les développeurs récupèrent les nouveaux changements
Instructions (pour Alice) :
- Allez dans le dossier d'Alice :
cd ../alice- Vérifier main :
git checkout main- Récupérer les changements :
git pull origin mainRésultat attendu :
From github.com:username/ma-premiere-app
* branch main -> FETCH_HEAD
Updating 6a2b5c8..8b7c1d9
Fast-forward
README.md | 15 +++++++++++++++
logging.py | 35 ++++++++++++++++++++++++++++++++++
test_logging.py | 18 ++++++++++++++++++
3 files changed, 68 insertions(+)- Vérifier les fichiers :
ls -la
cat logging.pyLes fichiers sont maintenant dans main !
Instructions (pour Bob) :
cd ../bob
git checkout main
git pull origin mainLes deux clones sont maintenant synchronisés.
✅ Vérification du Résultat
Pour vérifier que vous avez réussi :
# Vérifier la PR mergée sur GitHub
# Aller sur github.com/USERNAME/ma-premiere-app/pulls
# La PR #1 devrait être fermée (merged)
# Vérifier l'historique
cd alice
git log --oneline --graph | head -10
# Devrait montrer les commits de Alice et le merge commit
# Vérifier les fichiers
ls -la
# logging.py, test_logging.py devraient être présentsChecklist finale :
- ✅ Branche feature créée et poussée
- ✅ Pull Request créée sur GitHub
- ✅ Code révisé et amélioré
- ✅ PR mergée avec succès
- ✅ Historique propre sur main
- ✅ Synchronisation réussie dans les deux clones
🎮 Défi Bonus
Défi 1 : Pratiquer avec une vraie équipe
# Demander à un ami de:
# 1. fork votre repo
# 2. Créer une branche
# 3. Faire des changements
# 4. Créer une PR vers votre repo
# Vous pouvez alors accorder l'accès ou gérer les PRsDéfi 2 : Ajouter des branches de protection
# Sur GitHub, Settings → Branches → Branch protection rules
# Require pull request reviews
# Dismiss stale pull request approvals
# Require status checks to pass
# Restrict who can push to matching branchesDéfi 3 : Utiliser github.com à travers les commandes CLI
# GitHub CLI (gh)
# Installer: https://cli.github.com
gh pr create --title "Test PR" --body "Description"
gh pr view 1
gh pr merge 1💡 Points Clés à Retenir
- Pull Request = Demande de fusion (avec review)
- Feature branch = Branche pour chaque nouvelle fonctionnalité
- Code review = Processus d'apprentissage et de qualité
- Merge commit = Enregistre clairement la fusion
- Protection de main = main ne doit changer que via PR
🎯 Prochaines Étapes
- ✅ Vous comprenez le workflow d'équipe professionnel
- 🔜 Exercice suivant : Projet capstone (intégration complète)
- 🚀 Index des exercices : Tous les exercices
Excellent ! Vous êtes prêt pour le travail en équipe ! 🚀