From 498cacb1d5ad4532ea09c6c4ac3fa80b5c7a4da4 Mon Sep 17 00:00:00 2001 From: hoaraualderic Date: Tue, 26 May 2026 22:44:02 +0200 Subject: [PATCH] feat: init git course --- 01-introduction-concepts.md | 71 +++++ 02-installation-configuration.md | 134 +++++++++ 03-premiers-pas.md | 110 +++++++ 04-maitrise-branches.md | 132 +++++++++ 05-collaboration-remotes.md | 75 +++++ 06-commandes-avancees-debogage.md | 129 ++++++++ 07-meilleures-pratiques-devops.md | 154 ++++++++++ 08-workflows-automation.md | 252 ++++++++++++++++ 09-exercices.md | 60 ++++ 10-projet-fil-rouge.md | 132 +++++++++ 11-solutions.md | 472 ++++++++++++++++++++++++++++++ README.md | 50 +++- cheat-sheet.pdf | Bin 0 -> 112091 bytes 13 files changed, 1769 insertions(+), 2 deletions(-) create mode 100644 01-introduction-concepts.md create mode 100644 02-installation-configuration.md create mode 100644 03-premiers-pas.md create mode 100644 04-maitrise-branches.md create mode 100644 05-collaboration-remotes.md create mode 100644 06-commandes-avancees-debogage.md create mode 100644 07-meilleures-pratiques-devops.md create mode 100644 08-workflows-automation.md create mode 100644 09-exercices.md create mode 100644 10-projet-fil-rouge.md create mode 100644 11-solutions.md create mode 100644 cheat-sheet.pdf diff --git a/01-introduction-concepts.md b/01-introduction-concepts.md new file mode 100644 index 0000000..a3645b3 --- /dev/null +++ b/01-introduction-concepts.md @@ -0,0 +1,71 @@ +# 01 - Introduction à Git et au versionnage + +[🏠 Accueil](README.md) | [02 - Installation et Configuration →](02-installation-configuration.md) + +--- + +## 1. Qu'est-ce que Git ? + +**Git** est un système de contrôle de version distribué créé par Linus Torvalds en 2005. +C'est l'outil le plus utilisé au monde pour gérer les versions de code source et suivre l'historique des modifications d'un projet. + +![Git Logo](https://git-scm.com/images/logos/downloads/Git-Logo-2Color.png) + +### Pourquoi Git est essentiel en DevOps Azure ? + +En DevOps Azure, tout est code : les infrastructures (Terraform, Bicep), les pipelines CI/CD, les configurations Kubernetes, les scripts Azure CLI. Git est le fil conducteur qui relie chaque modification à un contexte et une personne. + +- **🏗️ Versionnage de l'Infrastructure as Code** : Suivez chaque modification de vos fichiers Terraform, Bicep ou ARM templates. +- **🤝 Collaboration d'équipe** : Plusieurs ingénieurs travaillent simultanément sur la même infrastructure sans écraser leurs modifications. +- **🔄 Reproductibilité** : Retournez à l'état exact de votre infrastructure à n'importe quel point dans le temps. +- **🚀 Intégration CI/CD** : Déclenchez automatiquement un `terraform apply` ou un déploiement AKS à chaque merge sur `main`. +- **🔍 Audit et conformité** : Identifiez qui a modifié une règle de sécurité, un RBAC ou un pare-feu Azure, quand et pourquoi. + +--- + +## 2. Les concepts fondamentaux + +| Concept | Description | Analogie DevOps | +|---|---|---| +| **Repository (Dépôt)** | Conteneur qui stocke tout l'historique du projet | Un dépôt Terraform avec tout son historique | +| **Commit** | Snapshot de vos fichiers à un instant T | Un état figé de votre infrastructure Azure | +| **Branch (Branche)** | Ligne de développement indépendante | Un environnement de staging isolé | +| **Merge (Fusion)** | Combinaison de deux branches | Promotion d'une feature en production | +| **Remote** | Version du dépôt hébergée sur un serveur | Votre repo GitHub ou Azure DevOps Repos | + +--- + +## 3. Architecture Git : Distribué vs Centralisé + +Contrairement aux systèmes centralisés (SVN, CVS), Git est **distribué**. Chaque ingénieur possède une copie complète de l'historique, permettant de travailler hors ligne et de créer des branches sans toucher au serveur central. + +### Les trois états de Git + +1. **Working Directory** : Vos fichiers actuels (`main.tf`, `deployment.yaml`, etc.). +2. **Staging Area (Index)** : Zone de préparation avant le commit. +3. **Repository (.git)** : Base de données contenant tout l'historique. + +```text +Working Directory ─────► Staging Area ─────► Repository + (main.tf modifié) (Préparé) (Commité) +``` + +--- + +## 4. Git dans l'écosystème DevOps Azure + +Git est la pierre angulaire de toute la chaîne DevOps : + +``` +Code / IaC CI/CD Cloud Azure +────────── ────── ─────────── +git push → GitHub Actions → az deployment + → terraform plan → Azure Resources + → docker build → ACR / AKS +``` + +Les plateformes principales utilisées en entreprise pour héberger les dépôts Git sont **GitHub** (avec GitHub Actions pour le CI/CD) et **Azure DevOps Repos** (avec Azure Pipelines). + +--- + +[🏠 Accueil](README.md) | [02 - Installation et Configuration →](02-installation-configuration.md) diff --git a/02-installation-configuration.md b/02-installation-configuration.md new file mode 100644 index 0000000..bb6c20b --- /dev/null +++ b/02-installation-configuration.md @@ -0,0 +1,134 @@ +# 02 - Installation et Configuration + +[← 01 - Introduction](01-introduction-concepts.md) | [🏠 Accueil](README.md) | [03 - Premiers pas →](03-premiers-pas.md) + +--- + +## 1. Installation de Git + +### 🍎 macOS +```bash +# Avec Homebrew +brew install git +# Ou via Xcode +xcode-select --install +``` + +### 🐧 Linux (Debian/Ubuntu) +```bash +sudo apt-get update +sudo apt-get install git +``` + +### 🪟 Windows +Téléchargez Git depuis [git-scm.com](https://git-scm.com/download/win) ou installez [Git for Windows](https://gitforwindows.org/). + +--- + +## 2. Configuration initiale (OBLIGATOIRE) + +Avant votre premier commit, vous devez configurer votre identité : + +```bash +# Identité (apparaîtra dans l'historique) +git config --global user.name "Votre Prénom Nom" +git config --global user.email "votre.email@example.com" + +# Éditeur par défaut (ex: VS Code) +git config --global core.editor "code --wait" + +# Branche par défaut +git config --global init.defaultBranch main +``` + +### Voir la configuration +```bash +git config --list +``` + +--- + +## 3. Les Alias : Gagner du temps +Créez des raccourcis pour les commandes fréquentes : + +```bash +git config --global alias.st status +git config --global alias.co checkout +git config --global alias.br branch +git config --global alias.ci commit +git config --global alias.lg 'log --oneline --graph --all --decorate' +``` + +Usage : `git st` au lieu de `git status`. + +--- + +## 4. Authentification SSH (Recommandé) + +L'authentification par **clé SSH** est plus sécurisée et plus pratique que le mot de passe : vous n'avez plus à vous authentifier à chaque `push` ou `pull`. + +### Étape 1 : Générer une paire de clés SSH + +```bash +# Générer une clé ED25519 (algorithme moderne et recommandé) +ssh-keygen -t ed25519 -C "votre.email@example.com" + +# Laisser le chemin par défaut (~/.ssh/id_ed25519) +# Définir une passphrase (optionnel mais conseillé) +``` + +### Étape 2 : Démarrer l'agent SSH et ajouter la clé + +```bash +# Démarrer l'agent SSH en arrière-plan +eval "$(ssh-agent -s)" + +# Ajouter votre clé privée à l'agent +ssh-add ~/.ssh/id_ed25519 +``` + +### Étape 3 : Copier la clé publique + +```bash +# Afficher la clé publique (à copier) +cat ~/.ssh/id_ed25519.pub +``` + +### Étape 4 : Ajouter la clé sur GitHub / GitLab + +**GitHub** : `Settings` → `SSH and GPG keys` → `New SSH key` → Coller la clé publique. + +**GitLab** : `Preferences` → `SSH Keys` → Coller la clé publique. + +### Étape 5 : Tester la connexion + +```bash +# GitHub +ssh -T git@github.com +# Réponse attendue : "Hi username! You've successfully authenticated..." + +# GitLab +ssh -T git@gitlab.com +``` + +### Utiliser SSH au lieu de HTTPS + +```bash +# Cloner avec SSH (au lieu de HTTPS) +git clone git@github.com:username/mon-projet.git + +# Changer un remote existant de HTTPS vers SSH +git remote set-url origin git@github.com:username/mon-projet.git +``` + +> 💡 **Astuce** : Sur macOS, ajoutez ces lignes dans `~/.ssh/config` pour que la passphrase soit mémorisée dans le trousseau : +> ``` +> Host github.com +> AddKeysToAgent yes +> UseKeychain yes +> IdentityFile ~/.ssh/id_ed25519 +> ``` + +--- + +[← 01 - Introduction](01-introduction-concepts.md) | [🏠 Accueil](README.md) | [03 - Premiers pas →](03-premiers-pas.md) diff --git a/03-premiers-pas.md b/03-premiers-pas.md new file mode 100644 index 0000000..8430a48 --- /dev/null +++ b/03-premiers-pas.md @@ -0,0 +1,110 @@ +# 03 - Premiers pas : Créer et gérer un dépôt + +[← 02 - Configuration](02-installation-configuration.md) | [🏠 Accueil](README.md) | [04 - Maîtrise des branches →](04-maitrise-branches.md) + +--- + +## 1. Initialiser ou Cloner un dépôt + +### Nouveau projet local +```bash +mkdir infra-azure +cd infra-azure +git init +``` + +### Récupérer un projet existant +```bash +# Via HTTPS +git clone https://github.com/username/infra-azure.git + +# Via SSH (recommandé, voir module 02) +git clone git@github.com:username/infra-azure.git +``` + +--- + +## 2. Le cycle de vie d'un fichier + +En DevOps Azure, vos fichiers sont typiquement des configurations IaC (`.tf`, `.bicep`), des manifests Kubernetes (`.yaml`) ou des scripts Azure CLI (`.sh`). + +### Vérifier l'état +```bash +git status +``` + +### Ajouter des modifications (Staging) +```bash +git add main.tf # Fichier Terraform spécifique +git add kubernetes/ # Tout un dossier de manifests +git add . # Tout le dossier actuel +``` + +### Créer un commit (Snapshot) +```bash +git commit -m "feat: add AKS cluster Terraform module" +``` + +--- + +## 3. Consulter l'historique + +### Liste des commits +```bash +git log # Complet +git log --oneline # Résumé (idéal pour voir les changements d'infra) +git log --graph # Vue graphique des branches +``` + +### Voir les modifications d'un commit +```bash +git show +# Affiche le diff exact : quelles lignes de main.tf ont changé +``` + +### Voir les différences non committées +```bash +git diff # Working directory vs Staging +git diff --staged # Staging vs dernier commit +``` + +--- + +## 4. Structure typique d'un dépôt IaC Azure + +``` +infra-azure/ +├── terraform/ +│ ├── main.tf # Ressources principales +│ ├── variables.tf # Déclaration des variables +│ ├── outputs.tf # Valeurs exportées +│ └── versions.tf # Contraintes de versions +├── kubernetes/ +│ ├── deployment.yaml +│ └── service.yaml +├── scripts/ +│ └── bootstrap.sh # Script Azure CLI d'initialisation +├── .github/ +│ └── workflows/ +│ └── deploy.yml # Pipeline CI/CD GitHub Actions +├── .gitignore +└── README.md +``` + +--- + +## 💡 Conseil : Commits atomiques en IaC + +Un commit IaC doit représenter **une seule ressource ou une seule décision d'architecture**. Ne mélangez pas la création d'un AKS et la configuration d'un Key Vault dans le même commit. Cela facilite les revues et les retours en arrière en cas d'incident. + +```bash +# ✅ Bon : un commit = une ressource +git commit -m "feat: add Azure Key Vault for secrets management" + +# ❌ Mauvais : tout dans un commit +git commit -m "update infra" +``` + +--- + +[← 02 - Configuration](02-installation-configuration.md) | [🏠 Accueil](README.md) | [04 - Maîtrise des branches →](04-maitrise-branches.md) diff --git a/04-maitrise-branches.md b/04-maitrise-branches.md new file mode 100644 index 0000000..090d493 --- /dev/null +++ b/04-maitrise-branches.md @@ -0,0 +1,132 @@ +# 04 - Maîtriser les branches + +[← 03 - Premiers pas](03-premiers-pas.md) | [🏠 Accueil](README.md) | [05 - Collaboration et Remotes →](05-collaboration-remotes.md) + +--- + +## 1. Pourquoi utiliser des branches ? +Les branches permettent d'isoler le développement. En DevOps Azure, chaque modification d'infrastructure (nouveau module Terraform, mise à jour d'un manifest Kubernetes, ajout d'un pipeline) passe par une branche dédiée avant d'être fusionnée dans `main` — qui représente l'état **déployé en production**. + +--- + +## 2. Gérer les branches + +### Créer et naviguer +```bash +git branch feature/aks-cluster # Créer +git switch feature/aks-cluster # Basculer +# OU (syntaxe moderne pour créer et changer) +git switch -c feature/aks-cluster +``` + +### Nommage recommandé en DevOps Azure + +| Préfixe | Usage | Exemple | +|---|---|---| +| `feature/` | Nouvelle ressource ou fonctionnalité | `feature/keyvault-integration` | +| `fix/` | Correction de configuration | `fix/nsg-rule-typo` | +| `hotfix/` | Correctif urgent en production | `hotfix/aks-node-pool-crash` | +| `release/` | Préparation d'une version | `release/v2.1.0` | +| `chore/` | Maintenance (docs, refacto) | `chore/update-providers` | + +### Fusionner (Merge) +```bash +git switch main +git merge feature/aks-cluster +``` + +--- + +## 3. Stratégies courantes + +**GitHub Flow** : Une branche `main` stable, chaque feature part de `main` et y retourne après review. Adapté aux déploiements continus (CD) où chaque merge déclenche un `terraform apply`. + +**Git Flow** : Plus structuré, avec branches `develop`, `release` et `hotfix`. Recommandé quand vous gérez plusieurs environnements Azure (dev, staging, prod) avec des cycles de release planifiés. + +--- + +## 4. Résoudre les conflits + +Un conflit survient quand deux branches modifient la même ligne — par exemple, deux ingénieurs qui ont chacun modifié la taille d'un node pool AKS dans `main.tf`. + +1. Tentez le merge : `git merge feature/X`. +2. Si conflit, ouvrez le fichier et cherchez les marqueurs `<<<<<<<`, `=======`, `>>>>>>>`. +3. Éditez pour garder le bon code (concertez-vous avec le collègue !). +4. Marquez comme résolu : `git add `. +5. Finalisez : `git commit`. + +--- + +## 5. Rebase : Réécrire l'historique proprement + +Le `rebase` est une alternative au `merge`. Au lieu de créer un commit de fusion, il **réapplique** vos commits sur la pointe d'une autre branche, produisant un historique linéaire et lisible. + +### Rebase simple + +```bash +# Situation : vous êtes sur feature/aks-cluster +# et main a avancé depuis que vous avez branché + +git switch feature/aks-cluster +git rebase main +# Git réapplique vos commits un par un sur la pointe de main +``` + +**Avant rebase :** +``` +main: A──B──C +feature: \──D──E +``` + +**Après rebase :** +``` +main: A──B──C +feature: D'──E' +``` + +### Rebase interactif : `git rebase -i` + +Le rebase interactif permet de **nettoyer vos commits avant de les partager** : fusionner des micro-commits, reformuler des messages, supprimer des commits inutiles. + +```bash +# Réécrire les 3 derniers commits +git rebase -i HEAD~3 +``` + +Un éditeur s'ouvre avec la liste de vos commits : + +``` +pick a1b2c3 feat: add AKS node pool configuration +pick d4e5f6 fix typo in variables.tf +pick g7h8i9 wip: debug output + +# Commandes disponibles : +# pick = conserver le commit tel quel +# reword = conserver mais modifier le message +# squash = fusionner avec le commit précédent +# drop = supprimer le commit +``` + +**Exemple : fusionner les 3 commits en un seul** + +``` +pick a1b2c3 feat: add AKS node pool configuration +squash d4e5f6 fix typo in variables.tf +squash g7h8i9 wip: debug output +``` + +Git fusionnera les trois en un seul commit propre et vous demandera de rédiger le message final. + +### Merge vs Rebase : quand choisir ? + +| Situation | Recommandation | +|---|---| +| Branche partagée avec l'équipe | `merge` (ne pas réécrire l'historique public) | +| Branche locale avant une PR | `rebase` (historique propre et linéaire) | +| Synchroniser sa feature avec main | `rebase main` | + +> ⚠️ **Règle d'or** : Ne jamais faire de `rebase` sur une branche déjà poussée et partagée avec d'autres développeurs. Cela réécrit l'historique et crée des conflits pour tout le monde. + +--- + +[← 03 - Premiers pas](03-premiers-pas.md) | [🏠 Accueil](README.md) | [05 - Collaboration et Remotes →](05-collaboration-remotes.md) diff --git a/05-collaboration-remotes.md b/05-collaboration-remotes.md new file mode 100644 index 0000000..4ebdcec --- /dev/null +++ b/05-collaboration-remotes.md @@ -0,0 +1,75 @@ +# 05 - Collaboration avec des dépôts distants + +[← 04 - Branches](04-maitrise-branches.md) | [🏠 Accueil](README.md) | [06 - Commandes Avancées →](06-commandes-avancees-debogage.md) + +--- + +## 1. Qu'est-ce qu'un remote ? + +C'est la version de votre dépôt hébergée sur un serveur. En DevOps Azure, vous utiliserez principalement **GitHub** (avec GitHub Actions) ou **Azure DevOps Repos** (avec Azure Pipelines). + +### Gérer les remotes +```bash +git remote add origin git@github.com:mon-org/infra-azure.git +git remote -v # Voir la liste des remotes +git remote remove origin # Supprimer un remote +``` + +--- + +## 2. Synchroniser le code + +### Envoyer (Push) +```bash +git push origin main +git push -u origin feature/aks-cluster # -u lie la branche locale à la distante +``` + +### Récupérer (Fetch / Pull) + +- **Fetch** : Télécharge les commits distants sans les fusionner — utile pour inspecter avant d'intégrer. +- **Pull** : Télécharge ET fusionne (Fetch + Merge). + +```bash +git fetch origin # Inspecter sans risque +git pull origin main # Récupérer et fusionner +``` + +--- + +## 3. Workflow collaboratif DevOps Azure + +En équipe, chaque modification d'infrastructure passe par une **Pull Request (PR)** — aussi appelée **Merge Request** sur GitLab/Azure DevOps. Cela garantit qu'une revue humaine a lieu avant tout déploiement. + +``` +1. Pull les dernières modifs de main +2. Créer une branche feature/fix +3. Modifier les fichiers IaC (Terraform, Bicep, YAML) +4. Commit et Push la branche +5. Ouvrir une Pull Request +6. Revue du code + terraform plan automatique (CI) +7. Approbation et Merge dans main +8. Déploiement automatique déclenché (CD) +``` + +### Bonnes pratiques pour une PR d'infrastructure + +- **Titre clair** : `feat: add AKS cluster with autoscaling` plutôt que `update infra` +- **Description** : expliquer *pourquoi* le changement, pas juste *quoi* +- **Lier un ticket** : `Closes #42` pour tracer la décision +- **Inclure le plan Terraform** : joindre la sortie de `terraform plan` en commentaire pour faciliter la review + +--- + +## 4. Protection de la branche `main` + +En entreprise, la branche `main` est **protégée** : personne ne peut pusher directement dessus. Tout passe par une PR approuvée. Configurez cela dans : + +**GitHub** : `Settings → Branches → Add branch protection rule` +- ✅ Require pull request reviews before merging +- ✅ Require status checks to pass (votre CI/CD) +- ✅ Restrict who can push to matching branches + +--- + +[← 04 - Branches](04-maitrise-branches.md) | [🏠 Accueil](README.md) | [06 - Commandes Avancées →](06-commandes-avancees-debogage.md) diff --git a/06-commandes-avancees-debogage.md b/06-commandes-avancees-debogage.md new file mode 100644 index 0000000..70d98f5 --- /dev/null +++ b/06-commandes-avancees-debogage.md @@ -0,0 +1,129 @@ +# 06 - Commandes avancées et débogage + +[← 05 - Collaboration](05-collaboration-remotes.md) | [🏠 Accueil](README.md) | [07 - Meilleures Pratiques DevOps →](07-meilleures-pratiques-devops.md) + +--- + +## 1. Annuler des modifications + +### Restaurer un fichier (Undo local) +```bash +# Annuler les modifications locales sur un fichier IaC +git restore main.tf +git restore kubernetes/deployment.yaml +``` + +### Unstage un fichier +```bash +# Retirer du staging sans perdre les modifications +git restore --staged main.tf +``` + +### Annuler des commits (Reset) + +- `--soft` : Annule le commit, garde les modifs stagées — utile pour reformuler un message. +- `--mixed` : Annule le commit et le staging, garde les fichiers modifiés. +- `--hard` : Annule tout (⚠️ DANGER : perte de données). + +```bash +# Annuler le dernier commit mais garder les modifications +git reset --soft HEAD~1 + +# Annuler complètement (uniquement si jamais pushé) +git reset --hard HEAD~1 +``` + +> ⚠️ **Règle d'or** : N'utilisez jamais `reset --hard` sur des commits déjà poussés vers le remote. Utilisez `git revert` à la place (crée un commit d'annulation sans réécrire l'historique). + +```bash +# Annuler un commit déjà pushé, en toute sécurité +git revert +``` + +--- + +## 2. Stash : Mettre de côté + +Utile quand vous devez changer de branche en urgence (ex: hotfix de prod) sans committer un travail inachevé sur votre module Terraform. + +```bash +git stash # Sauvegarder le travail en cours +git stash push -m "wip: AKS node pool config" # Avec un message descriptif +git stash list # Voir la liste des stashs +git stash pop # Récupérer et supprimer le dernier +git stash apply stash@{1} # Appliquer sans supprimer +``` + +--- + +## 3. Débogage et Recherche + +### Blame : qui a modifié quoi ? + +Indispensable en audit : identifier qui a modifié une règle de sécurité ou une configuration réseau. + +```bash +git blame main.tf +git blame kubernetes/deployment.yaml +``` + +### Bisect : trouver le commit fautif + +`git bisect` effectue une recherche binaire dans l'historique pour identifier quel commit a introduit un problème (ex: une règle NSG qui bloque du trafic). + +```bash +git bisect start +git bisect bad # Le commit actuel est cassé +git bisect good v1.2.0 # Cette version fonctionnait + +# Git vous positionne sur un commit intermédiaire +# Testez, puis indiquez : +git bisect good # ou +git bisect bad + +# Quand Git a trouvé le commit fautif : +git bisect reset # Revenir à l'état normal +``` + +### Reflog : votre filet de sécurité ultime + +Le reflog enregistre **toutes** les actions Git, même les reset. Si vous avez supprimé des commits par erreur, le reflog vous sauve. + +```bash +git reflog # Voir tout l'historique des actions +git checkout HEAD@{3} # Revenir à l'état d'il y a 3 actions +``` + +--- + +## 4. Tags : versionner vos releases Azure + +Les tags marquent les versions déployées en production. En DevOps Azure, un tag déclenche souvent un pipeline de déploiement. + +```bash +# Créer un tag annoté +git tag -a v1.2.0 -m "Release: add AKS autoscaling and Key Vault integration" + +# Pousser le tag vers le remote (déclencheur CI/CD possible) +git push origin v1.2.0 + +# Pousser tous les tags +git push origin --tags + +# Lister les tags +git tag -l +``` + +### Utilisation dans GitHub Actions + +```yaml +# Déclencher un déploiement Azure uniquement sur un tag +on: + push: + tags: + - 'v*' +``` + +--- + +[← 05 - Collaboration](05-collaboration-remotes.md) | [🏠 Accueil](README.md) | [07 - Meilleures Pratiques DevOps →](07-meilleures-pratiques-devops.md) diff --git a/07-meilleures-pratiques-devops.md b/07-meilleures-pratiques-devops.md new file mode 100644 index 0000000..318cde8 --- /dev/null +++ b/07-meilleures-pratiques-devops.md @@ -0,0 +1,154 @@ +# 07 - Meilleures pratiques pour le DevOps Azure + +[← 06 - Avancé](06-commandes-avancees-debogage.md) | [🏠 Accueil](README.md) | [08 - Workflows et Automation →](08-workflows-automation.md) + +--- + +## 1. Le .gitignore : Critique pour l'IaC Azure + +En Infrastructure as Code, certains fichiers ne doivent **jamais** être versionnés : états Terraform, credentials Azure, fichiers générés. Un secret commité est un secret compromis. + +```gitignore +# ============================================ +# TERRAFORM +# ============================================ +# État Terraform (contient des données sensibles en clair) +*.tfstate +*.tfstate.* +.terraform/ +.terraform.lock.hcl + +# Fichiers de plan (peuvent contenir des secrets) +*.tfplan + +# Variables locales (surcharges personnelles) +*.auto.tfvars +!example.tfvars # Garder les fichiers d'exemple + +# ============================================ +# AZURE CREDENTIALS & SECRETS +# ============================================ +.env +.env.* +!.env.example # Garder le template +*.pem +*.key +service-principal.json +azure-credentials.json + +# ============================================ +# HELM / KUBERNETES +# ============================================ +charts/*.tgz +values-prod.yaml # Valeurs de production avec secrets + +# ============================================ +# OUTILS & IDE +# ============================================ +.DS_Store +.idea/ +.vscode/settings.json # Garder .vscode/extensions.json +__pycache__/ +*.pyc +``` + +### Utiliser les secrets Azure Key Vault + +Ne stockez jamais de secrets dans Git. Utilisez **Azure Key Vault** : + +```bash +# Récupérer un secret depuis Key Vault dans un pipeline +az keyvault secret show \ + --vault-name mon-keyvault \ + --name "db-password" \ + --query value -o tsv +``` + +Dans GitHub Actions, utilisez les **GitHub Secrets** pour stocker les credentials du Service Principal Azure. + +--- + +## 2. Conventional Commits + +Les messages de commit structurés permettent de générer des changelogs automatiques et de déclencher des actions CI/CD conditionnelles. + +| Préfixe | Usage DevOps Azure | Exemple | +|---|---|---| +| `feat:` | Nouvelle ressource Azure | `feat: add Azure Container Registry` | +| `fix:` | Correction de configuration | `fix: correct NSG inbound rule for port 443` | +| `docs:` | Documentation | `docs: add runbook for AKS scaling` | +| `chore:` | Maintenance, mise à jour | `chore: bump azurerm provider to 3.85` | +| `perf:` | Optimisation | `perf: enable AKS node autoprovisioning` | +| `ci:` | Pipeline CI/CD | `ci: add terraform plan step on PR` | +| `refactor:` | Restructuration IaC | `refactor: split network module from main.tf` | + +### Format complet + +``` +(): + +[Corps optionnel : expliquer le POURQUOI, pas le QUOI] + +[Footer : liens, breaking changes] +``` + +**Exemple réel :** + +``` +feat(aks): add autoscaling to node pool + +Enable cluster autoscaler with min 2 / max 10 nodes to handle +peak loads without manual intervention. + +Closes #87 +``` + +--- + +## 3. Structurer son dépôt IaC + +Un dépôt bien structuré facilite la collaboration et la navigation. + +### Structure recommandée (mono-repo) + +``` +infra-azure/ +├── modules/ # Modules Terraform réutilisables +│ ├── aks/ +│ │ ├── main.tf +│ │ ├── variables.tf +│ │ └── outputs.tf +│ ├── network/ +│ └── keyvault/ +├── environments/ # Configuration par environnement +│ ├── dev/ +│ │ ├── main.tf # Appelle les modules +│ │ └── terraform.tfvars +│ ├── staging/ +│ └── prod/ +├── kubernetes/ # Manifests K8s par application +│ └── app-backend/ +├── .github/workflows/ # Pipelines CI/CD +├── .gitignore +└── README.md +``` + +--- + +## 4. Git LFS pour les artefacts binaires + +Si votre dépôt contient de gros fichiers binaires (certificats, archives Helm, images de base), utilisez **Git LFS** pour ne pas alourdir le dépôt. + +```bash +# Installer Git LFS +git lfs install + +# Tracker les fichiers .tgz (archives Helm) +git lfs track "*.tgz" +git add .gitattributes +git commit -m "chore: configure Git LFS for Helm archives" +``` + +--- + +[← 06 - Avancé](06-commandes-avancees-debogage.md) | [🏠 Accueil](README.md) | [08 - Workflows et Automation →](08-workflows-automation.md) diff --git a/08-workflows-automation.md b/08-workflows-automation.md new file mode 100644 index 0000000..10b3a10 --- /dev/null +++ b/08-workflows-automation.md @@ -0,0 +1,252 @@ +# 08 - Workflows et Automation + +[← 07 - Pratiques DevOps](07-meilleures-pratiques-devops.md) | [🏠 Accueil](README.md) | [09 - Exercices →](09-exercices.md) + +--- + +## 1. Pre-commit Hooks pour l'IaC Azure + +Les hooks Git sont des scripts exécutés automatiquement avant chaque commit. En DevOps Azure, ils permettent de valider la qualité de votre code Terraform, YAML et Bicep **avant** qu'il n'atteigne le dépôt. + +### Installation + +```bash +pip install pre-commit +``` + +### Configuration : `.pre-commit-config.yaml` + +```yaml +# .pre-commit-config.yaml +repos: + # Vérifications générales + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.5.0 + hooks: + - id: trailing-whitespace # Espaces en fin de ligne + - id: end-of-file-fixer # Saut de ligne final + - id: check-yaml # Syntaxe YAML (K8s, pipelines) + - id: check-added-large-files # Bloque fichiers > 500 KB + args: ['--maxkb=500'] + - id: detect-private-key # Détecte les clés privées accidentelles + + # Formatage et validation Terraform + - repo: https://github.com/antonbabenko/pre-commit-terraform + rev: v1.88.0 + hooks: + - id: terraform_fmt # Formate automatiquement les .tf + - id: terraform_validate # Valide la syntaxe Terraform + - id: terraform_tflint # Linting Terraform (bonnes pratiques) + - id: terraform_docs # Génère la doc des modules + + # Linting YAML (manifests Kubernetes, pipelines) + - repo: https://github.com/adrienverge/yamllint + rev: v1.35.1 + hooks: + - id: yamllint + args: ['--strict'] + + # Détection de secrets dans le code (Azure credentials, tokens) + - repo: https://github.com/Yelp/detect-secrets + rev: v1.4.0 + hooks: + - id: detect-secrets + args: ['--baseline', '.secrets.baseline'] +``` + +### Activation + +```bash +# Installer les hooks (une seule fois par développeur) +pre-commit install + +# Tester sur tous les fichiers existants +pre-commit run --all-files + +# Mettre à jour les versions des hooks +pre-commit autoupdate +``` + +--- + +## 2. CI/CD GitHub Actions pour Azure + +GitHub Actions permet de déclencher automatiquement des validations et déploiements Azure à chaque modification du dépôt. + +### Workflow complet : Terraform sur Azure + +```yaml +# .github/workflows/terraform.yml +name: Terraform Azure CI/CD + +on: + pull_request: + branches: [ main ] + push: + branches: [ main ] + +env: + ARM_CLIENT_ID: ${{ secrets.AZURE_CLIENT_ID }} + ARM_CLIENT_SECRET: ${{ secrets.AZURE_CLIENT_SECRET }} + ARM_SUBSCRIPTION_ID: ${{ secrets.AZURE_SUBSCRIPTION_ID }} + ARM_TENANT_ID: ${{ secrets.AZURE_TENANT_ID }} + +jobs: + terraform-validate: + name: Validate + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup Terraform + uses: hashicorp/setup-terraform@v3 + with: + terraform_version: '1.7.0' + + - name: Terraform Init + run: terraform init + working-directory: ./environments/prod + + - name: Terraform Format Check + run: terraform fmt -check -recursive + + - name: Terraform Validate + run: terraform validate + working-directory: ./environments/prod + + terraform-plan: + name: Plan + needs: terraform-validate + runs-on: ubuntu-latest + if: github.event_name == 'pull_request' + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup Terraform + uses: hashicorp/setup-terraform@v3 + + - name: Terraform Init + run: terraform init + working-directory: ./environments/prod + + - name: Terraform Plan + id: plan + run: terraform plan -no-color -out=tfplan + working-directory: ./environments/prod + + # Publier le plan en commentaire de la PR + - name: Comment PR with Plan + uses: actions/github-script@v7 + with: + script: | + const output = `#### Terraform Plan 📋 + \`\`\` + ${{ steps.plan.outputs.stdout }} + \`\`\``; + github.rest.issues.createComment({ + issue_number: context.issue.number, + owner: context.repo.owner, + repo: context.repo.repo, + body: output + }) + + terraform-apply: + name: Apply + needs: terraform-validate + runs-on: ubuntu-latest + if: github.ref == 'refs/heads/main' && github.event_name == 'push' + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup Terraform + uses: hashicorp/setup-terraform@v3 + + - name: Terraform Init + run: terraform init + working-directory: ./environments/prod + + - name: Terraform Apply + run: terraform apply -auto-approve + working-directory: ./environments/prod +``` + +### Déclencheurs courants (`on:`) + +| Déclencheur | Usage DevOps Azure | +|---|---| +| `pull_request` | Lancer `terraform plan` et afficher le diff en PR | +| `push: branches: [main]` | Lancer `terraform apply` après merge | +| `push: tags: ['v*']` | Déployer une release versionnée | +| `workflow_dispatch` | Déploiement manuel depuis l'interface GitHub | +| `schedule` | Audit de conformité quotidien | + +--- + +## 3. Git + Docker + Azure Container Registry (ACR) + +En DevOps Azure, les images Docker sont poussées vers **Azure Container Registry (ACR)** et déployées sur **AKS**. Le hash du commit Git garantit la traçabilité. + +### Tagger une image avec le hash Git + +```bash +COMMIT_HASH=$(git rev-parse --short HEAD) +ACR_NAME="monregistry.azurecr.io" +IMAGE="mon-app" + +# Construire +docker build -t ${ACR_NAME}/${IMAGE}:${COMMIT_HASH} . + +# S'authentifier sur ACR +az acr login --name monregistry + +# Pousser +docker push ${ACR_NAME}/${IMAGE}:${COMMIT_HASH} +``` + +### Workflow GitHub Actions : Build → ACR → AKS + +```yaml +name: Build and Deploy to AKS + +on: + push: + branches: [ main ] + +jobs: + build-and-deploy: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + + - name: Login Azure + uses: azure/login@v2 + with: + creds: ${{ secrets.AZURE_CREDENTIALS }} + + - name: Build and push to ACR + run: | + COMMIT_HASH=$(git rev-parse --short HEAD) + az acr build \ + --registry monregistry \ + --image mon-app:${COMMIT_HASH} \ + --image mon-app:latest . + + - name: Deploy to AKS + uses: azure/k8s-deploy@v4 + with: + manifests: kubernetes/deployment.yaml + images: monregistry.azurecr.io/mon-app:${{ github.sha }} +``` + +> 🔍 **Traçabilité** : L'image `mon-app:a3f5c12` en production correspond exactement au commit `a3f5c12` dans Git. En cas d'incident, `git show a3f5c12` révèle le changement exact qui a causé le problème. + +--- + +[← 07 - Pratiques DevOps](07-meilleures-pratiques-devops.md) | [🏠 Accueil](README.md) | [09 - Exercices →](09-exercices.md) diff --git a/09-exercices.md b/09-exercices.md new file mode 100644 index 0000000..da38e5e --- /dev/null +++ b/09-exercices.md @@ -0,0 +1,60 @@ +# 09 - Exercices : Pratique de Git en DevOps Azure + +[← 08 - Automation](08-workflows-automation.md) | [🏠 Accueil](README.md) | [10 - Projet Fil Rouge →](10-projet-fil-rouge.md) + +--- + +## 📝 Niveau 1 : Bases + +1. Configurez votre identité Git (nom, email) et votre éditeur par défaut. +2. Initialisez un dépôt nommé `git-devops-practice`. +3. Créez un fichier `versions.tf` contenant la contrainte de version Terraform suivante et faites votre premier commit : + ```hcl + terraform { + required_version = ">= 1.5.0" + required_providers { + azurerm = { + source = "hashicorp/azurerm" + version = "~> 3.85" + } + } + } + ``` +4. Créez un alias `git lg` pour `log --oneline --graph --all --decorate`. +5. Configurez la branche par défaut sur `main`. + +--- + +## 🌿 Niveau 2 : Branches + +1. Créez une branche `feature/add-resource-group`. +2. Ajoutez un fichier `main.tf` avec une ressource Azure Resource Group vide et committez avec un message conventionnel (`feat:`). +3. Retournez sur `main` et fusionnez la branche. +4. Supprimez la branche feature. +5. **Bonus** : Reproduisez l'exercice en utilisant `rebase` au lieu de `merge`, puis comparez l'historique avec `git log --graph`. + +--- + +## 🤝 Niveau 3 : Collaboration + +1. Créez un dépôt sur GitHub nommé `git-devops-practice`. +2. Liez votre dépôt local au remote via SSH. +3. Poussez votre branche `main`. +4. Créez une branche `feature/add-vnet`, ajoutez un fichier `network.tf` avec un commentaire, et poussez-la. +5. Ouvrez une Pull Request sur GitHub depuis `feature/add-vnet` vers `main`, ajoutez une description expliquant le changement, puis fusionnez-la. +6. Récupérez le résultat en local (`git pull`) et supprimez la branche locale. + +--- + +## 🔒 Niveau 4 : Sécurité et bonnes pratiques + +1. Créez un fichier `.gitignore` adapté à un projet Terraform + Azure (ignorez les fichiers `.tfstate`, `.terraform/`, `.env`). +2. Créez volontairement un fichier `.env` contenant `AZURE_CLIENT_SECRET=mon_secret`, tentez de le commiter, et vérifiez que `.gitignore` l'empêche. +3. Installez `pre-commit` et configurez un hook `detect-private-key`. Testez qu'il bloque un commit contenant une fausse clé privée. +4. Créez un tag `v0.1.0` annoté sur votre dernier commit et poussez-le vers GitHub. + +[📖 Voir les solutions](11-solutions.md) + +--- + +[← 08 - Automation](08-workflows-automation.md) | [🏠 Accueil](README.md) | [10 - Projet Fil Rouge →](10-projet-fil-rouge.md) diff --git a/10-projet-fil-rouge.md b/10-projet-fil-rouge.md new file mode 100644 index 0000000..cf3a43b --- /dev/null +++ b/10-projet-fil-rouge.md @@ -0,0 +1,132 @@ +# 10 - Projet Fil Rouge : Déploiement d'une infrastructure AKS sur Azure + +[← 09 - Exercices](09-exercices.md) | [🏠 Accueil](README.md) | [11 - Solutions →](11-solutions.md) + +--- + +## 🎯 Objectif + +Versionner et déployer une infrastructure Azure complète en utilisant Git selon le **Git Flow** : features, releases et hotfix. Ce projet simule les conditions réelles d'un Ingénieur DevOps Azure en entreprise. + +## 📋 Scénario + +Vous êtes Ingénieur DevOps chez **CloudOps Corp.** Votre mission : versionner le déploiement d'un cluster AKS avec son infrastructure réseau et son pipeline CI/CD, de la conception jusqu'au correctif en production. + +## 🌿 Schéma Git Flow du projet + +``` +main ●─────────────────────────────●──────────────────● + \ / \ / +develop ●──────────●─────────────● \ / + \ / \ / +feature/... ●───────● release/v1.0.0 ●────────────● + hotfix/v1.0.1 ●──● +``` + +--- + +## 🛠️ Phases du projet + +### Phase 1 : Initialisation + +**Contexte :** Le projet démarre. Vous posez les fondations du dépôt IaC. + +1. Initialisez le dépôt Git local nommé `infra-aks-cloudops`. +2. Créez la structure de dossiers suivante : + ``` + infra-aks-cloudops/ + ├── modules/ + │ ├── aks/ + │ │ ├── main.tf + │ │ ├── variables.tf + │ │ └── outputs.tf + │ └── network/ + │ ├── main.tf + │ └── variables.tf + ├── environments/ + │ └── prod/ + │ ├── main.tf + │ └── terraform.tfvars.example + ├── kubernetes/ + │ └── .gitkeep + ├── .github/ + │ └── workflows/ + │ └── terraform.yml + ├── .gitignore + └── README.md + ``` +3. Configurez un `.gitignore` robuste (état Terraform, secrets Azure, fichiers générés). +4. Faites un premier commit sur `main` : `"chore: initial IaC project structure"`. +5. Créez la branche `develop` à partir de `main`. + +--- + +### Phase 2 : Développement Feature + +**Contexte :** Vous développez le module Terraform pour créer le cluster AKS. + +1. Depuis `develop`, créez la branche `feature/aks-cluster-module`. +2. Dans `modules/aks/main.tf`, écrivez la ressource Terraform `azurerm_kubernetes_cluster` avec un node pool par défaut. +3. Dans `modules/aks/variables.tf`, déclarez les variables `cluster_name`, `resource_group_name`, `location`, `node_count`. +4. Dans `modules/aks/outputs.tf`, exportez `kube_config` et `cluster_id`. +5. Committez : `"feat(aks): add AKS cluster Terraform module"`. +6. Dans `environments/prod/main.tf`, appelez le module AKS avec les valeurs de production. +7. Committez : `"feat(prod): wire AKS module in production environment"`. +8. Fusionnez `feature/aks-cluster-module` dans `develop`. +9. Supprimez la branche feature. + +--- + +### Phase 3 : Release + +**Contexte :** Le module AKS est validé, vous préparez la mise en production. + +1. Depuis `develop`, créez la branche `release/v1.0.0`. +2. Mettez à jour le `README.md` avec les prérequis (Azure CLI, Terraform, permissions RBAC) et les instructions de déploiement. +3. Committez : `"docs: add deployment instructions for v1.0.0"`. +4. Complétez le workflow GitHub Actions `terraform.yml` avec les jobs `validate`, `plan` (sur PR) et `apply` (sur merge dans `main`). +5. Committez : `"ci: add Terraform CI/CD pipeline for Azure"`. +6. Fusionnez `release/v1.0.0` dans `main`. +7. Taguez la version : `git tag -a v1.0.0 -m "Production release: AKS cluster v1.0.0"`. +8. Fusionnez également `release/v1.0.0` dans `develop` (synchronisation). +9. Supprimez la branche release. + +--- + +### Phase 4 : Hotfix + +**Contexte :** 🚨 En production, une alerte de sécurité est levée ! Le cluster AKS a été créé avec l'API Server accessible publiquement (`api_server_authorized_ip_ranges` vide). Il faut restreindre l'accès en urgence directement depuis `main`. + +1. Depuis `main` (le code en production), créez la branche `hotfix/v1.0.1`. +2. Dans `modules/aks/main.tf`, ajoutez la variable `api_server_authorized_ip_ranges` et appliquez-la sur la ressource `azurerm_kubernetes_cluster`. +3. Dans `modules/aks/variables.tf`, déclarez la nouvelle variable avec une liste de CIDRs autorisés. +4. Committez : `"fix(aks): restrict API server access to authorized IP ranges"`. +5. Fusionnez `hotfix/v1.0.1` dans `main`. +6. Taguez la correction : `git tag -a v1.0.1 -m "Security hotfix: restrict AKS API server access"`. +7. Fusionnez `hotfix/v1.0.1` dans `develop`. +8. Supprimez la branche hotfix. + +> ⚠️ **Règle d'or Git Flow** : Un hotfix part toujours de `main` (l'état de production) et doit être fusionné dans **les deux branches** : `main` ET `develop`. + +--- + +## 📦 Livrable attendu + +À la fin du projet, vérifiez votre historique avec `git log --oneline --graph --all` : + +``` +* (tag: v1.0.1) Merge hotfix/v1.0.1 into main +* fix(aks): restrict API server access to authorized IP ranges +* (tag: v1.0.0) Merge release/v1.0.0 into main +* ci: add Terraform CI/CD pipeline for Azure +* docs: add deployment instructions for v1.0.0 +* feat(prod): wire AKS module in production environment +* feat(aks): add AKS cluster Terraform module +* chore: initial IaC project structure +``` + +[📖 Voir les solutions](11-solutions.md) + +--- + +[← 09 - Exercices](09-exercices.md) | [🏠 Accueil](README.md) | [11 - Solutions →](11-solutions.md) diff --git a/11-solutions.md b/11-solutions.md new file mode 100644 index 0000000..e32e6ef --- /dev/null +++ b/11-solutions.md @@ -0,0 +1,472 @@ +# 11 - Solutions des exercices + +[← 10 - Projet Fil Rouge](10-projet-fil-rouge.md) | [🏠 Accueil](README.md) + +--- + +## 📝 Solution Niveau 1 : Bases + +```bash +# Identité +git config --global user.name "Nom Prénom" +git config --global user.email "email@cloudops.com" + +# Éditeur par défaut +git config --global core.editor "code --wait" + +# Branche par défaut +git config --global init.defaultBranch main + +# Créer le dépôt +mkdir git-devops-practice && cd git-devops-practice +git init + +# Créer le fichier versions.tf et committer +cat > versions.tf << 'EOF' +terraform { + required_version = ">= 1.5.0" + required_providers { + azurerm = { + source = "hashicorp/azurerm" + version = "~> 3.85" + } + } +} +EOF + +git add versions.tf +git commit -m "chore: add Terraform version constraints" + +# Alias utiles +git config --global alias.lg 'log --oneline --graph --all --decorate' +git config --global alias.st status +``` + +--- + +## 🌿 Solution Niveau 2 : Branches + +```bash +# Créer et basculer sur la branche feature +git switch -c feature/add-resource-group + +# Créer main.tf avec une ressource Azure Resource Group +cat > main.tf << 'EOF' +resource "azurerm_resource_group" "main" { + name = var.resource_group_name + location = var.location +} +EOF + +git add main.tf +git commit -m "feat: add Azure Resource Group resource" + +# Retourner sur main et fusionner +git switch main +git merge feature/add-resource-group + +# Supprimer la branche feature +git branch -d feature/add-resource-group + +# --- BONUS : Même exercice avec rebase --- +git switch -c feature/add-rg-v2 +echo '# network' > network.tf +git add network.tf +git commit -m "feat: add network placeholder" + +git switch main +git switch -c feature/add-rg-v2 +# Simuler une avancée de main +echo "# updated" >> versions.tf +git add versions.tf +git commit -m "chore: update comment" + +git switch feature/add-rg-v2 +git rebase main # Historique linéaire, sans commit de merge + +git switch main +git merge feature/add-rg-v2 # Fast-forward propre +git branch -d feature/add-rg-v2 + +# Comparer avec un merge classique : +git log --oneline --graph +``` + +--- + +## 🤝 Solution Niveau 3 : Collaboration + +```bash +# 1. Lier le dépôt local à GitHub via SSH +git remote add origin git@github.com:votre-user/git-devops-practice.git + +# 2. Pousser la branche main +git push -u origin main + +# 3. Créer et pousser une branche feature +git switch -c feature/add-vnet + +cat > network.tf << 'EOF' +resource "azurerm_virtual_network" "main" { + name = "vnet-cloudops-prod" + address_space = ["10.0.0.0/16"] + location = var.location + resource_group_name = var.resource_group_name +} +EOF + +git add network.tf +git commit -m "feat(network): add Azure Virtual Network" +git push -u origin feature/add-vnet + +# 4. Ouvrir une Pull Request depuis GitHub : +# GitHub → votre repo → "Compare & pull request" +# Titre : "feat(network): add Azure Virtual Network" +# Description : expliquer l'adresse CIDR choisie et pourquoi +# Cliquer "Create pull request" puis "Merge pull request" + +# 5. Récupérer le merge en local et nettoyer +git switch main +git pull origin main +git branch -d feature/add-vnet +``` + +--- + +## 🔒 Solution Niveau 4 : Sécurité et bonnes pratiques + +```bash +# 1. Créer le .gitignore Terraform/Azure +cat > .gitignore << 'EOF' +# Terraform +*.tfstate +*.tfstate.* +.terraform/ +.terraform.lock.hcl +*.tfplan +*.auto.tfvars +!example.tfvars + +# Azure secrets +.env +.env.* +!.env.example +*.pem +*.key +service-principal.json +EOF + +git add .gitignore +git commit -m "chore: add Terraform and Azure .gitignore" + +# 2. Tester que .gitignore bloque .env +echo "AZURE_CLIENT_SECRET=mon_super_secret" > .env +git status # .env ne doit PAS apparaître +git add .env 2>&1 || echo ".env correctement ignoré" + +# 3. Installer pre-commit et configurer detect-private-key +pip install pre-commit + +cat > .pre-commit-config.yaml << 'EOF' +repos: + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.5.0 + hooks: + - id: detect-private-key + - id: check-yaml + - id: trailing-whitespace +EOF + +pre-commit install + +# Test : tenter de committer une fausse clé privée +echo "-----BEGIN RSA PRIVATE KEY-----" > fake-key.pem +git add fake-key.pem +git commit -m "test: should be blocked" +# → Le hook detect-private-key doit bloquer le commit + +# Nettoyage +git restore --staged fake-key.pem +rm fake-key.pem +git add .pre-commit-config.yaml +git commit -m "ci: add pre-commit hooks for security" + +# 4. Créer et pousser un tag +git tag -a v0.1.0 -m "Initial IaC structure with security hooks" +git push origin v0.1.0 +``` + +--- + +## 🚀 Solution Projet Fil Rouge + +### Phase 1 : Initialisation + +```bash +mkdir infra-aks-cloudops && cd infra-aks-cloudops +git init + +# Structure du projet +mkdir -p modules/aks modules/network environments/prod kubernetes .github/workflows + +touch modules/aks/main.tf modules/aks/variables.tf modules/aks/outputs.tf +touch modules/network/main.tf modules/network/variables.tf +touch environments/prod/main.tf environments/prod/terraform.tfvars.example +touch kubernetes/.gitkeep +touch .github/workflows/terraform.yml +touch README.md + +cat > .gitignore << 'EOF' +*.tfstate +*.tfstate.* +.terraform/ +.terraform.lock.hcl +*.tfplan +*.auto.tfvars +!*.tfvars.example +.env +*.pem +*.key +EOF + +git add . +git commit -m "chore: initial IaC project structure" +git switch -c develop +``` + +--- + +### Phase 2 : Développement Feature + +```bash +git switch -c feature/aks-cluster-module + +# Module AKS - main.tf +cat > modules/aks/main.tf << 'EOF' +resource "azurerm_kubernetes_cluster" "main" { + name = var.cluster_name + location = var.location + resource_group_name = var.resource_group_name + dns_prefix = var.cluster_name + + default_node_pool { + name = "default" + node_count = var.node_count + vm_size = "Standard_D2_v2" + } + + identity { + type = "SystemAssigned" + } +} +EOF + +# Module AKS - variables.tf +cat > modules/aks/variables.tf << 'EOF' +variable "cluster_name" { + type = string + description = "Nom du cluster AKS" +} + +variable "resource_group_name" { + type = string + description = "Nom du Resource Group Azure" +} + +variable "location" { + type = string + description = "Région Azure" + default = "West Europe" +} + +variable "node_count" { + type = number + description = "Nombre de nœuds dans le node pool" + default = 2 +} +EOF + +# Module AKS - outputs.tf +cat > modules/aks/outputs.tf << 'EOF' +output "kube_config" { + value = azurerm_kubernetes_cluster.main.kube_config_raw + sensitive = true +} + +output "cluster_id" { + value = azurerm_kubernetes_cluster.main.id +} +EOF + +git add modules/aks/ +git commit -m "feat(aks): add AKS cluster Terraform module" + +# Environnement de production +cat > environments/prod/main.tf << 'EOF' +module "aks" { + source = "../../modules/aks" + cluster_name = "aks-cloudops-prod" + resource_group_name = "rg-cloudops-prod" + location = "West Europe" + node_count = 3 +} +EOF + +git add environments/prod/main.tf +git commit -m "feat(prod): wire AKS module in production environment" + +git switch develop +git merge feature/aks-cluster-module +git branch -d feature/aks-cluster-module +``` + +--- + +### Phase 3 : Release + +```bash +git switch -c release/v1.0.0 + +cat > README.md << 'EOF' +# Infrastructure AKS - CloudOps Corp + +## Prérequis +- Azure CLI >= 2.50 +- Terraform >= 1.5.0 +- Permissions : Contributor sur la subscription Azure + +## Déploiement +az login +cd environments/prod +terraform init +terraform plan +terraform apply +EOF + +git add README.md +git commit -m "docs: add deployment instructions for v1.0.0" + +cat > .github/workflows/terraform.yml << 'EOF' +name: Terraform Azure CI/CD +on: + pull_request: + branches: [main] + push: + branches: [main] +env: + ARM_CLIENT_ID: ${{ secrets.AZURE_CLIENT_ID }} + ARM_CLIENT_SECRET: ${{ secrets.AZURE_CLIENT_SECRET }} + ARM_SUBSCRIPTION_ID: ${{ secrets.AZURE_SUBSCRIPTION_ID }} + ARM_TENANT_ID: ${{ secrets.AZURE_TENANT_ID }} +jobs: + validate: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: hashicorp/setup-terraform@v3 + - run: terraform init + working-directory: ./environments/prod + - run: terraform validate + working-directory: ./environments/prod + apply: + needs: validate + runs-on: ubuntu-latest + if: github.ref == 'refs/heads/main' && github.event_name == 'push' + steps: + - uses: actions/checkout@v4 + - uses: hashicorp/setup-terraform@v3 + - run: terraform init && terraform apply -auto-approve + working-directory: ./environments/prod +EOF + +git add .github/workflows/terraform.yml +git commit -m "ci: add Terraform CI/CD pipeline for Azure" + +git switch main +git merge release/v1.0.0 +git tag -a v1.0.0 -m "Production release: AKS cluster v1.0.0" + +git switch develop +git merge release/v1.0.0 +git branch -d release/v1.0.0 +``` + +--- + +### Phase 4 : Hotfix + +```bash +git switch main +git switch -c hotfix/v1.0.1 + +# Corriger la faille de sécurité : restreindre l'accès à l'API Server +cat > modules/aks/variables.tf << 'EOF' +variable "cluster_name" { + type = string + description = "Nom du cluster AKS" +} + +variable "resource_group_name" { + type = string + description = "Nom du Resource Group Azure" +} + +variable "location" { + type = string + description = "Région Azure" + default = "West Europe" +} + +variable "node_count" { + type = number + description = "Nombre de nœuds dans le node pool" + default = 2 +} + +variable "api_server_authorized_ip_ranges" { + type = list(string) + description = "CIDRs autorisés à accéder à l'API Server AKS" +} +EOF + +# Appliquer la restriction dans la ressource +cat > modules/aks/main.tf << 'EOF' +resource "azurerm_kubernetes_cluster" "main" { + name = var.cluster_name + location = var.location + resource_group_name = var.resource_group_name + dns_prefix = var.cluster_name + + default_node_pool { + name = "default" + node_count = var.node_count + vm_size = "Standard_D2_v2" + } + + api_server_access_profile { + authorized_ip_ranges = var.api_server_authorized_ip_ranges + } + + identity { + type = "SystemAssigned" + } +} +EOF + +git add modules/aks/ +git commit -m "fix(aks): restrict API server access to authorized IP ranges" + +git switch main +git merge hotfix/v1.0.1 +git tag -a v1.0.1 -m "Security hotfix: restrict AKS API server access" + +git switch develop +git merge hotfix/v1.0.1 +git branch -d hotfix/v1.0.1 +``` + +> ✅ **Vérification finale** : `git log --oneline --graph --all` pour visualiser l'historique complet avec branches et tags. + +--- + +[← 10 - Projet Fil Rouge](10-projet-fil-rouge.md) | [🏠 Accueil](README.md) diff --git a/README.md b/README.md index 96a7fc8..4089c23 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,48 @@ -# cours-git -Cours GIT pour SIMPLON +# Formation Git : Maîtriser le versionnage pour le DevOps Azure + +Bienvenue dans ce module complet dédié à Git. Git est l'outil fondamental de tout Ingénieur DevOps pour garantir la traçabilité, la collaboration et la reproductibilité des infrastructures et déploiements Azure. + +## 🎯 Objectifs Pédagogiques + +- Comprendre les concepts fondamentaux (Commit, Branch, Remote). +- Maîtriser le workflow quotidien et la collaboration d'équipe. +- Adopter les meilleures pratiques spécifiques à l'Infrastructure as Code (IaC) sur Azure. +- Automatiser les vérifications via les pre-commit hooks et GitHub Actions. + +## 📚 Programme + +### [01 - Introduction et Concepts](01-introduction-concepts.md) +Découvrez l'importance de Git et son architecture distribuée dans un contexte DevOps Azure. + +### [02 - Installation et Configuration](02-installation-configuration.md) +Préparez votre environnement de travail professionnel, y compris l'authentification SSH. + +### [03 - Premiers pas](03-premiers-pas.md) +Initialisation, staging area et historique des commits appliqués à des fichiers IaC. + +### [04 - Maîtrise des branches](04-maitrise-branches.md) +Isolez vos développements, résolvez les conflits et maîtrisez le rebase. + +### [05 - Collaboration et Remotes](05-collaboration-remotes.md) +Travaillez en équipe via GitHub/Azure DevOps et les Pull Requests. + +### [06 - Commandes avancées et débogage](06-commandes-avancees-debogage.md) +Annulation, stash, tags et filet de sécurité Git. + +### [07 - Meilleures pratiques pour le DevOps Azure](07-meilleures-pratiques-devops.md) +Gérer les fichiers IaC, .gitignore sécurisé pour Azure et commits conventionnels. + +### [08 - Workflows et Automation](08-workflows-automation.md) +Pre-commit hooks Terraform/YAML, CI/CD GitHub Actions pour déploiements Azure. + +### [09 - Exercices Pratiques](09-exercices.md) +Mise en pratique des commandes essentielles dans un contexte DevOps Azure. + +### [10 - Projet Fil Rouge : Déploiement AKS](10-projet-fil-rouge.md) +Projet complet simulant le déploiement d'une infrastructure Azure avec Git Flow. + +### [11 - Solutions](11-solutions.md) +Corrigés détaillés des exercices et du projet. + +--- +**Academy** - Formation Ingénieur DevOps Azure diff --git a/cheat-sheet.pdf b/cheat-sheet.pdf new file mode 100644 index 0000000000000000000000000000000000000000..c67fdffc1b75ff490666bd165825d0eb4bcb2ad8 GIT binary patch literal 112091 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 O9T=;h?(QC*A5T9^YN03q literal 0 HcmV?d00001