Release Branch est une branche dans Git Flow créée à partir de develop pour préparer une release spécifique au déploiement. Elle fige la version de l'application, corrige les derniers bogues et met à jour les métadonnées, sans ajouter de nouvelles fonctionnalités. Selon Vincent Driessen, 2010, la branche release sépare la préparation de la release du développement en cours, permettant aux deux activités de se dérouler en parallèle.
Points clés
release/X.Y.Z selon la version de l'application.Release Branch (branche de release) est une branche temporaire dans Git Flow, créée à partir de develop lorsque l'équipe décide que l'ensemble actuel de fonctionnalités est prêt pour la publication. Elle existe exactement le temps que dure la préparation finale de la release, de quelques heures à quelques jours.
L'objectif principal d'une branche release est de figer un ensemble spécifique de fonctionnalités pour la release sans arrêter le développement des versions suivantes. Pendant que la branche release est préparée pour le déploiement, d'autres développeurs peuvent continuer à fusionner des branches feature dans develop pour la prochaine release.
Aucune nouvelle fonctionnalité n'est créée dans la branche release, seulement des corrections de bogues, une mise à jour de la version de l'application, la localisation et la documentation. Une fois tout le travail terminé, la branche release est fusionnée dans main (marquée comme release) et de nouveau dans develop (pour que les corrections parviennent aux versions futures).
Selon Atlassian, 2024, les branches release sont d'une importance cruciale pour les projets avec des cycles de release réguliers, car elles garantissent la prévisibilité et la stabilité du processus de publication.
Le cycle de vie de la branche release, de sa création à sa suppression, comprend plusieurs étapes. Comprendre chaque étape aide l'équipe à synchroniser ses actions et à éviter les erreurs.
release/2.5.0 est créée. develop continue d'accepter les branches feature pour la version suivante.v2.5.0.L'étape 6 (la fusion inverse dans develop) est souvent oubliée, mais elle est d'une importance cruciale. Sans elle, les corrections effectuées dans la branche release ne parviendront pas à develop, et les mêmes erreurs pourraient réapparaître dans la prochaine release.
La durée de vie d'une branche release dépend de la complexité de la release et de la qualité du code dans develop. En moyenne, la préparation prend de 2 à 5 jours ouvrés pour une application mobile de taille moyenne.
Dans la branche release, un ensemble strictement limité de tâches est exécuté. Tout écart par rapport à cette liste viole le modèle Git Flow et crée des risques pour la stabilité de la release.
| Type de modification | Autorisé | Exemple |
|---|---|---|
| Versionnage | Oui | Mise à jour de versionName dans build.gradle |
| Correction de bogues | Oui | Correction d'un crash au démarrage |
| Localisation | Oui | Ajout de traductions pour de nouveaux écrans |
| Documentation | Oui | Mise à jour de CHANGELOG et README |
| Nouvelles fonctionnalités | Non | Ajout d'un nouvel écran de profil |
| Refactorisation | Non | Réécriture de la couche réseau |
| Mise à jour de bibliothèques | Avec précaution | Uniquement les versions patch pour les corrections |
La règle de l'interdiction des nouvelles fonctionnalités est la plus importante dans une branche release. Si une fonctionnalité n'est pas prête pour la release, elle attend le cycle suivant. Tenter d'introduire une fonctionnalité incomplète dans la branche release est la principale cause de dépassement des délais et de bogues en production.
Dans la branche release, le numéro de version de l'application est obligatoirement mis à jour. Pour Android, ce sont les champs versionCode et versionName dans build.gradle ; pour iOS — CFBundleShortVersionString dans Info.plist.
// build.gradle (niveau application) — mise à jour de version dans la branche release
android {
defaultConfig {
versionCode 42
versionName "2.5.0"
}
}
// Pour iOS — mise à jour d'Info.plist
// CFBundleShortVersionString = 2.5.0
// CFBundleVersion = 42
Les développeurs débutants confondent souvent les branches release et hotfix, bien que leurs objectifs soient fondamentalement différents. Choisir le mauvais type de branche peut retarder une correction critique ou perturber le processus de release.
Si un bogue est trouvé pendant la préparation de la release (dans la branche release), c'est une correction normale. Si un bogue est trouvé en production (sur main), c'est un hotfix, et il est créé à partir de main, même si la branche release existe déjà.
Une norme unifiée de nommage des branches release simplifie la navigation dans le référentiel et permet aux systèmes CI/CD de détecter automatiquement qu'une branche appartient au processus de release.
release/2.5.0.release/merlin.release/2024-12-01.Le format release/X.Y.Z est préféré car il lie explicitement la branche au numéro de version qui sera attribué à la release. Cela simplifie la recherche et le traitement automatique par les scripts CI/CD.
La fusion inverse (merge back) de la branche release dans develop est l'une des opérations les plus importantes et en même temps l'une des plus souvent négligées. Sans elle, toutes les corrections effectuées dans la branche release restent uniquement dans la version de release et ne parviennent pas au prochain cycle de release.
Le processus de fusion inverse est effectué après que la branche release a déjà été fusionnée dans main. D'abord, release est fusionnée dans develop, puis supprimée. Cela garantit que develop contient toutes les corrections effectuées pendant la préparation de la release.
Après la fusion inverse, des conflits peuvent survenir, surtout si de nouvelles branches feature qui modifiaient les mêmes fichiers sont déjà apparues dans develop. Le développeur responsable de la release résout ces conflits et pousse develop sur le serveur.
Certaines équipes utilisent rebase au lieu de merge pour la fusion inverse afin de garder un historique linéaire. Cependant, merge est plus sûr pour develop car il ne réécrit pas l'historique des commits qui pourrait déjà être utilisé par d'autres développeurs.
Examinons le cycle complet de travail avec une branche release : de la création à la suppression après une release réussie d'une application mobile version 2.5.0.
# 1. Créer la branche release depuis develop
git checkout develop
git pull origin develop
git checkout -b release/2.5.0
# 2. Mettre à jour la version et les corrections
git add build.gradle
git commit -m "Bump version to 2.5.0"
# 3. Corriger les bogues (uniquement les bugfixes)
git add src/fix/
git commit -m "Fix crash on payment screen"
# 4. Envoyer la branche release sur le serveur
git push origin release/2.5.0
# 5. Fusionner release dans main
git checkout main
git pull origin main
git merge --no-ff release/2.5.0
git tag -a v2.5.0 -m "Release 2.5.0"
git push origin main --tags
# 6. Fusion inverse dans develop
git checkout develop
git merge --no-ff release/2.5.0
git push origin develop
# 7. Supprimer la branche release
git branch -d release/2.5.0
git push origin --delete release/2.5.0
Les commandes 5 et 6 (la double fusion) sont d'une importance cruciale. D'abord, main reçoit le code de release et le tag, puis develop se synchronise avec les corrections de release. Si l'étape 6 est ignorée, les corrections de la release ne parviendront pas au prochain cycle de développement.
Pour les projets mobiles avec des releases régulières, le processus de création d'une branche release et de mise à jour de la version peut être automatisé via des scripts CI/CD. GitHub Actions permet de créer un workflow qui, en cliquant sur un bouton, crée une branche release avec une mise à jour automatique de la version.
Pour les projets mobiles avec des releases régulières, le processus de création d'une branche release et de mise à jour de la version peut être automatisé via des scripts CI/CD. GitHub Actions permet de créer un workflow qui, en cliquant sur un bouton, crée une branche release avec une mise à jour automatique de la version.
# GitHub Actions — automatisation de la création de branche release
name: Create Release Branch
on:
workflow_dispatch:
inputs:
version:
description: 'Release version (e.g. 2.5.0)'
required: true
jobs:
create-release:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Create release branch
run: |
git checkout develop
git checkout -b release/${{ inputs.version }}
git push origin release/${{ inputs.version }}
Questions fréquentes
Une seule branche release à la fois, si vous suivez Git Flow. Avoir deux branches release actives signifie que l'équipe tente de publier deux versions en parallèle, ce qui viole le principe des releases séquentielles et crée une confusion dans les versions.
Supprimez les commits de la fonctionnalité incomplète de la branche release avec git revert et reportez la fonctionnalité à la prochaine release. Ne publiez jamais de fonctionnalité incomplète en production — la dette technique et les bogues potentiels ne valent pas la précipitation.
Pour les releases simples avec une seule correction, la branche release peut être sautée et fusionnée directement de develop vers main. Cependant, pour les releases standard, une branche release est obligatoire car elle fige la version, isole la préparation et garantit la double fusion des corrections.
Utilisez git revert sur main pour créer un nouveau commit qui annule toutes les modifications de la release. Supprimez ensuite le tag de release avec git push origin --delete vX.Y.Z. Après avoir corrigé les problèmes, créez une nouvelle branche release avec un numéro de patch incrémenté.
Un release candidate (RC) est un artefact de build qui subit les tests finaux. Une release branch est une branche Git à partir de laquelle le release candidate est construit. Une même branche release peut générer plusieurs builds RC (RC1, RC2, etc.) au fur et à mesure que les bogues sont corrigés.
Résumé
release/X.Y.Z avec numéro de version SemVer.Nous développerons une application mobile clé en main
IT Sectr crée des applications iOS et Android pour les startups et les entreprises depuis 2017. Nous vous conseillerons et vous proposerons la meilleure solution.
Lisez aussi