Dans les projets maven, la version d'un projet est contenue dans le <version>
attritbute du fichier pom.xml. Lors de la création d'une nouvelle version dans le modèle git flow, je dois augmenter le numéro de version. Cet article explique comment cela se fait (sans maven):
De plus, il dit:
C'est exactement au début d'une branche de publication que la version à venir reçoit un numéro de version, pas plus tôt. Jusqu'à ce moment, la branche de développement reflétait les changements pour la "prochaine version", mais il n'est pas clair si cette "prochaine version" deviendra finalement 0.3 ou 1.0, jusqu'à ce que la branche de version soit lancée. Cette décision est prise au début de la branche de publication et est exécutée par les règles du projet sur le remplacement de numéro de version.
Je vois ici deux problèmes avec maven:
1.1-SNAPSHOT
. Maintenant, nous avons changé cela en simplement 1.1
sur la branche de publication et fusionné à master. Bien. Mais nous devons également fusionner cette branche pour la développer et pour cela, nous devons adapter la version à, par exemple. 1.2-SNAPSHOT
. Et nous n'aurions probablement pas dû faire cela sur la branche release car ce commit ne devrait pas faire partie de la release. En fait, nous aurions probablement dû effectuer ce changement juste après la dérivation de develop car tous les futurs commits sur develop concerneront la prochaine version.En recherchant le problème sur Google, j'ai trouvé des articles sur les plugins maven qui peuvent automatiser le processus, ce qui peut être intéressant, mais cette question est vraiment sur la façon dont le graphique git devrait ressembler et où la version bump commit devrait être et pas comment je peux automatiser cela en utilisant un plugin maven.
Pour les versions normales, faites juste le bump de version de l'instantané après avoir fusionné la branche de version:
develop
et supprimez l'instantané de la versionmaster
develop
develop
pour la prochaine version de l'instantanémaster
et develop
Lorsque vous appuyez sur toutes les modifications en même temps, l'équipe ne voit que la version de l'instantané augmenter.
Pour les correctifs, cela n'est pas possible car vous le créez à partir de la branche master
. Il y a solution pour ce scénario, voici un exemple utilisant les commandes raw git.
Exemple: vous avez 1.0.0
sur master
et souhaitez créer un 1.0.1
version du correctif. Votre développement est déjà à 1.1.0-SNAPSHOT
.
git checkout master
git checkout -b hotfix/1.0.1
mvn versions:set -DnewVersion=1.0.1
git commit -a -m "hotfix release 1.0.1"
git checkout master
git merge hotfix/1.0.1
(facile, car nous avons créé la branche sur master
)git checkout develop
mvn versions:set -DnewVersion=1.0.0
git commit -a -m "workaround to avoid merge conflicts"
git merge hotfix/1.0.1
(fonctionnera en raison de la validation avant)mvn versions:set -DnewVersion=1.1.0-SNAPSHOT
git commit -a -m "set version back to 1.1.0-snapshot"
Pas très sympa mais ça marche. Cette solution est également utilisée par jgitflow (un plugin Maven pour vous soutenir avec git flow)
Gardez à l'esprit que Git a été développé pour le noyau Linux qui a ses propres règles de version.
Pour Maven, vous devez créer une branche de version qui obtient la version instantanée de la prochaine version. Cette modification doit être une validation unique (c'est-à-dire uniquement la modification du numéro de version dans pom.xml
). Lors de la fusion, extrayez master
et utilisez git merge --strategy=ours <release-branch>
--strategy=ours
signifie: effectuez une fusion en disant "tout dans master
a été correctement fusionné avec la branche release"; aucune modification n'est apportée au master. Ensuite, Git traitera les branches comme fusionnées (c'est-à-dire sans changement) malgré le numéro de version différent dans les deux branches.
Pour éviter toutes sortes de problèmes lors de la construction de master
avec Maven, utilisez un numéro de version impair ou très élevé qui ne change jamais comme 99.DEV-SNAPSHOT
.
Lorsque vous effectuez la libération, supprimez le -SNAPSHOT
à partir de la version dans la branche release et commit. Ensuite, vous extrayez master et fusionnez à nouveau avec --strategy=ours
.
Remarque: Si vous faites cela, vous ne devez pas apporter d'autres modifications sur la branche de publication, mais changer les versions. Tous les autres correctifs seront perdus! Vous ne pouvez que les choisir.
Vous pouvez utiliser jgitflow-maven-plugin : objectifs jgitflow: release-start et jgitflow: release-finish .
Avec Maven, vous devez pas changer le numéro de version manuellement.
Vous devez ajouter les informations "scm" à votre pom, afin de permettre à Maven de valider et de pousser le changement de version directement.
Ensuite, utilisez le "plugin de libération". Il fera le travail pour vous. Supposons que votre version actuelle soit "1.1-SNAPSHOT", la tâche maven "release: perform":
Voici un extrait d'un historique git sur un projet où le plugin de sortie Maven est utilisé:
* 2345678 - Normal developpement commit (on branch 1.2-SNAPHOT).
* 5678901 - [maven-release-plugin] prepare for next development iteration
* 8901234 - (tag: 1.1) [maven-release-plugin] prepare release 1.1
* 1234567 - Normal developpement commit (on branch 1.1-SNAPHOT).
Remarque 1: Au moment de la sortie, vous devez provisionner la prochaine version (1.2 dans cet exemple). Si vous changez d'avis, vous pouvez le changer plus tard. Le plugin Maven "version: set-version" vous permet de réaffecter la version de toute la hiérarchie du projet. Vous n'aurez qu'à valider ce changement de version avant la prochaine version.
Remarque 2: Au moment de la sortie, vous pouvez également changer la version de la sortie. Même si la version actuelle est 1.1-SNAPSHOT, vous pouvez décider que la version est la version 2.0 et la prochaine version de développement la 2.1-SNAPSHOT.