web-dev-qa-db-fra.com

Comment dois-je mettre à jour la version dans mon pom.xml lors de la libération à l'aide de git flow?

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):

  1. Créer une branche de publication
  2. Modifier le numéro de version et valider
  3. Fusionner la branche de publication pour développer et maîtriser

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. La version en cours de développement dans maven serait [version suivante] -SNAPSHOT. Nous ne pouvons donc pas vraiment reporter la décision de la version à venir jusqu'au moment où nous créons une branche de publication. Bien sûr, si nous pouvons changer d'avis plus tard, mais nous devons déjà entrer/une valeur/ici plus tôt.
  2. Avant de créer notre version, la version dans le pom.xml était disons 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.

23
yankee

Pour les versions normales, faites juste le bump de version de l'instantané après avoir fusionné la branche de version:

  1. Créez la branche de publication hors develop et supprimez l'instantané de la version
  2. Fusionnez-le dans master
  3. Fusionnez-le dans develop
  4. Changez la version sur develop pour la prochaine version de l'instantané
  5. Appuyez à la fois sur 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.

  1. git checkout master
  2. git checkout -b hotfix/1.0.1
  3. Faites votre correctif!
  4. mvn versions:set -DnewVersion=1.0.1
  5. git commit -a -m "hotfix release 1.0.1"
  6. git checkout master
  7. git merge hotfix/1.0.1 (facile, car nous avons créé la branche sur master)
  8. git checkout develop
  9. mvn versions:set -DnewVersion=1.0.0
  10. git commit -a -m "workaround to avoid merge conflicts"
  11. git merge hotfix/1.0.1 (fonctionnera en raison de la validation avant)
  12. mvn versions:set -DnewVersion=1.1.0-SNAPSHOT
  13. 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)

4
chris

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.

3
Aaron Digulla
1
numéro6

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":

  • Changez la version en 1.1, validez, marquez cette version et poussez-la.
  • Changez à nouveau la version en 1.2-SNAPSHOT (ou 1.1.1-SNAPSHOT, 2.0-SNAPSHOT… vous pouvez choisir la version suivante), validez et poussez-la.

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.

0
Benoit Courtine