Nous abordons ici les différentes stratégies Git, les bonnes pratiques du point de vue DevOps, et la mise en place des rulesets GitHub, ainsi que les vérifications finales pour sécuriser et structurer le workflow.
Les stratégies Git, ou workflows, structurent la gestion des branches pour optimiser le développement collaboratif
Elles définissent comment créer les fonctionnalités, les correctifs (hotfixes) et la manière de livrer le code.
Github Flow (Simple/Web):
Une branche main stable, et des branches feature qui sont fusionnées dès que la fonctionnalité est terminée et testée
Parfait pour les applications web et les petites équipes. Facilite la revue de code via les Pull Requests avant fusion
Gitflow (Structuré/Releases):
Modèle plus complexe adapté grande équipe et aux releases planifiées.
Il utilise une branche master/main (production), develop (intégration), et des branches séparées pour les fonctionnalités (feature), les pré-productions (release) et les correctifs (hotfix)
Trunk-based Development (DevOps Moderne):
Les développeurs fusionnent fréquemment leurs modifications (plusieurs fois par jour) dans une branche unique (trunk ou main)
Cela minimise les conflits de fusion et s'aligne parfaitement avec la CI/CD
GitLab Flow :
Hybride entre le GitHub Flow (trop simple pour la prod) et le Git Flow (trop complexe), il utilise des branches d'environnement (pre-production, production) pour plus de contrôle dans les pipelines CI/CD
GitFlow, Github Flow... En DevOps, une stratégie de branchement définit comment une équipe collabore sur le code pour assurer une livraison continue et stable.
Le choix dépend de la complexité du projet et de la fréquence de déploiement.
Une stratégie Git multi-branche DevOps efficace structure le développement via des branches spécialisées (feature, develop, main/release) pour garantir la stabilité de la production, permettre des livraisons continues (CI/CD) et automatiser les tests.
Branches éphémères: Supprimez les branches de fonctionnalités immédiatement après la fusion pour éviter l'accumulation de dette technique
Branche de Release: Créer des branches spécifiques pour les versions afin de stabiliser le code avant la mise en production
Automatisation: Utiliser des pipelines CI/CD (Azure, Jenkins, GitHub Actions) déclenchés automatiquement pour valider le code à chaque merge
Ma configuration correspond à un modèle "GitLab Flow" avec branches d'environnement, où staging joue le rôle d'environnement de stress test et de pré-production continue. Les fonctionnalités sont développées dans la branche develop, puis promues progressivement vers staging et main via des Pull Requests.
GitLab Flow introduit une idée simple : On structure le flux autour des environnements de déploiement
feature → develop → staging → main
↓ ↓
tests, CI lourds
C'est exactement le modèle que j'utilise
feature/*
↓
develop
↓ (tests classiques)
staging
↓ (tests lourds, perf, intégration complète)
main
↓
tag = release
Dans ce modèle, le code circule de manière unidirectionnelle pour garantir que ce qui est testé en Staging est exactement ce qui arrive en Production
develop → feature/xxx
feature/xxx → PR → develop
develop → PR → staging
staging → PR → main
develop (Source de vérité agile):
On crée des branches depuis develop, ensuite on les y fusionnent via Pull Request. C'est le "bac à sable" d'intégration continue
staging (Validation de performance):
On fusionne vers staging uniquement quand un lot de fonctionnalités est stable. Cet environnement doit être le miroir de la prod
main (Production immuable):
On fusionne staging vers main par un Tag Git (ex: v1.2.0), Le tag déclenche le pipeline final. L'utilisation de tags assure la traçabilité complète des versions
Isolation des Workflows: Les tests lourds (K6) ne ralentissent pas le cycle quotidien de dev, car ils ne tournent que sur la branche staging
Promotion du code: On valide l'artefact technique (le code testé) à chaque étape, réduisant ainsi les risques d'erreurs "de dernière minute" en production
Sécurité par Tag: En restreignant le déploiement sur main aux seuls tags, on évite les accidents lors de simples fusions de branches
| Branche | Require a PR before Merging | Require Status Check to Pass | Linear History | Block force pushes | |
|---|---|---|---|---|---|
| develop | Oui | Oui → Build and test | Non (optionnel) | Non (optionnel) | |
| staging | Oui | Oui → ci-staging | Oui | Oui | |
| main | Oui | Oui → Prod Build, Analyze and Deploy | Oui | Oui | |
Rulesets Options
|
|||||
Une fois mis en place, il sera impossible de casser prod par erreur
Depuis votre projet Github, allez dans Settings, depuis le menu General, cliquez dans le menu Rules et puis Rulesets
Vous verrez alors la liste de toutes les règles définies pour le repository. Si vous n'en avez pas, cliquez sur le bouton


Si vous appliquer une autre stratégie, vous pouvez définir plusieurs branches cibles


Restrict creations: Empêche de créer la branche
Restrict update Seul moi, et les personnes autorisée
pouvons mettre à jour
Restrict deletions: Empêche de supprimer la branche
Require linear history: Optionel (sur develop)

Require a PR before Merging + possibilité d'ajouter un "reviewer" (cela pour être vous)
Require Status Check to PassAprès avoir coché la case, cliquez sur Add checks, cliquez ensuite sur Show additional settings
Entrez le nom du job de votre workflow dans le champs, il doit proposer l'option pour valider l'étape
Block force pushes → empêche les push forcés


Après sauvegarde, essayer de faire:
Si → refusé/error: c'est verrouillé correctement
$ git push origin develop
remote: error: GH006: Protected branch update failed for refs/heads/develop.
remote: error: Changes must be made through a pull request.
To github.com:username/repo.git
! [remote rejected] develop -> develop (protected branch hook declined)
error: failed to push some refs to 'github.com:username/repo.git'