Dérivation de la version d’artefact maven de la twig git

Nous avons une exigence de stream de travail qui signifie essentiellement que nous devons avoir la version d’artefact d’un module définie en externe à partir de la twig actuelle de git.

Par exemple, si nous sums sur la twig principale de git, j’ai besoin de master-... et si nous sums sur la twig bugfixX, j’ai besoin de bugfixX-.... pour l’artefact généré pour ce fichier pom.xml.

J’ai déjà trouvé que https://github.com/koraktor/mavanagaiata peut fournir le hachage SHA-1 en tant que propriété et il ressort de la documentation qu’il peut également fournir la twig, alors peut-être que si elle pouvait être exécutée suffisamment tôt dans le processus que nous pourrions définir la propriété et simplement mettre ${our.version} dans le pom. Si cela est possible, j’aimerais beaucoup voir un pom.xml fonctionnel (et récompenser une prime de 500 points pour cela).

Si ce n’est pas le cas, je suppose que nous sums soit en prétraitement, soit en “git checkout”, nous faisons de la magie supplémentaire avec certains des hooks (que je n’ai pas encore essayés, le code de travail serait bien aussi).

Nous avons un pom de premier niveau, qui peut être exécuté pour générer un fichier de propriétés dans “..” avant de construire les modules où cette fonctionnalité est demandée.

Des suggestions sur la façon de résoudre ce problème?

En effet, Maven ne peut pas changer la version de son propre projet en une seule fois avec d’autres objectives. En plus, pour autant que je sache, Maven ne supporte pas les propriétés arbitraires dans la . Par conséquent, une exécution séparée est requirejse pour exécuter un objective qui modifiera la version du POM. Il existe différents plug-ins qui peuvent le faire – dans ce cas, on peut utiliser les versions:set objective à partir du plug-in de versionshttp://mojo.codehaus.org/versions-maven-plugin/set-mojo.html

Ainsi, on pourrait l’exécuter comme suit par exemple:

 mvn versions:set -DgenerateBackupPoms=false -DnewVersion=$branch-SNAPSHOT 

où la variable $branch doit contenir le nom actuel de la twig Git; il peut être extrait avec git rev-parse , comme ceci:

 branch=$(git rev-parse --abbrev-ref HEAD) 

Mais encore faut-il l’exécuter d’une manière ou d’une autre. Vous pouvez faire manuellement, mais c’est encombrant. Donc, je suppose que la solution la plus robuste serait d’aborder la question du côté de Git. C’est-à-dire un crochet Git. Voici le hook post-checkout complet de Git qui fera le travail (même code que ci-dessus avec un filtrage pour exécuter le hook uniquement lorsque la twig est extraite, pas les fichiers individuels uniquement):

 #!/bin/bash echo 'Will change the version in pom.xml files...' # check if the checkout was to checkout a branch if [ $3 != '1' ] then echo 'git checkout did not checkout a branch - quitting';exit fi # get current branch name branch=$(git rev-parse --abbrev-ref HEAD) version=$branch-SNAPSHOT # run maven versions plugin to set new version mvn versions:set -DgenerateBackupPoms=false -DnewVersion=$version echo 'Changed version in pom.xml files to $version' 

Placez ce contenu dans le fichier PROJECTDIR\.git\hooks\post-checkout . Notez que le fichier hook doit être exécutable pour l’exécuter ( chmod +x post-checkout ).

Quelques remarques sur les versions plug-in – elles sont assez flexibles et prennent en charge de nombreuses options et ont peu d’autres objectives, en fonction de la structure de votre projet (utilisez-vous des poms parents, les enfants ont-ils leurs propres versions)? parent, etc.). Ainsi, le hook ci-dessus peut être légèrement modifié pour vous permettre de prendre en charge des cas spécifiques en utilisant d’autres objectives du plug-in de versions ou en spécifiant des parameters supplémentaires.

Avantages:

  • Robuste
  • Pas besoin de changer quoi que ce soit dans les fichiers pom.xml pour que cela fonctionne
  • Cette “fonctionnalité” peut être désactivée simplement en désactivant le hook (supprimer ou rendre non exécutable) – encore une fois, aucune modification n’est requirejse dans le fichier pom.xml

Les inconvénients:

  • On ne peut pas forcer les autres à utiliser un hook – il doit être installé manuellement après le clonage du repo (ou vous pouvez fournir un script pour installer le hook si les utilisateurs supposés de Git ont peur de toucher le contenu du répertoire .git).

METTRE À JOUR

Ci-après, la version la plus compliquée du hook, qui définira non seulement la version sur le nom de la twig, mais préservera également le suffixe de l’ancienne version. Par exemple, sous l’ancienne version master-1.0-SNAPSHOT , le passage à la twig feature1 changera la version du projet en feature1-1.0-SNAPSHOT . Ce script bash souffre de peu de problèmes (nécessite des noms de twig sans symbole de tiret ( - ) dans le nom et ne prend que la version de la racine pom), mais peut donner une idée de la manière dont le hook peut être étendu: et les commandes bash, vous pouvez extraire et mettre à jour beaucoup d’informations dans le POM.

 #!/bin/bash echo 'Will change the version in pom.xml files...' # check if the checkout was to checkout a branch if [ $3 != '1' ] then echo 'git checkout did not checkout a branch - quitting';exit fi # get current branch name branch=$(git rev-parse --abbrev-ref HEAD) # get current version of the top level pom current_version=$(mvn help:evaluate -Dexpression=project.version | grep -v '\[.*') # extract version suffix suffix=$(echo $current_version | cut -d \- -f 2) # build new version version=$branch-$suffix # run maven versions plugin to set new version mvn versions:set -DgenerateBackupPoms=false -DnewVersion=$version echo 'Changed version in pom.xml files to $version' 

Désolé de relancer cette question et de publier très récemment une autre solution, mais il est possible de changer de manière dynamic la version de maven et d’utiliser certaines fonctionnalités de git, un peu comme le ferait git describe .

Le projet qui fait cela est jgitver-maven-plugin (avertissement, je suis l’auteur) , il utilise jgitver une bibliothèque basée sur jgit pour dériver la version du projet maven à partir des informations git.

entrer la description de l'image ici

Il est très facile à utiliser comme extension maven

 ...    fr.brouillard.oss jgitver-maven-plugin 0.1.0   ...  ... 

L’extension peut également être utilisée en tant qu’extension de plug-in, puis permet plus de configuration, par exemple si vous ne souhaitez pas utiliser SNAPSHOTS. Voir la page du projet pour une description des scénarios d’utilisation complète.

Il existe également un plug-in de gradation plus ou moins identique.


[edit 1] : réponse à Thorbjørn Ravn Andersen comment

Le plug-in ne modifie pas les fichiers pom d’origine ni les fichiers build.gradle.
Pour le plugin maven, les modifications sont effectuées à la fois en mémoire dans le modèle object maven et écrites dans un fichier temporaire dans le répertoire temp. Le calcul est basé sur les métadonnées git uniquement (balises, commits, …).
Cette non modification permet de ne pas polluer l’historique git. Lorsque vous êtes satisfait d’un commit git, mvn deploy git tag -a xyz et mvn deploy : c’est tout.
La version dans vos fichiers de projet est maintenant inutile et peut être définie sur 0 par exemple.

A ce jour, et grâce à IDEA-155733, seules les versions récentes d’EAP d’IntelliJ fonctionnent avec le plugin maven. Eclipse & Netbeans n’ont aucun problème.


Disclaimer: Je suis l’auteur

L’extension suivante du kernel maven gérera (virtuellement) la version dynamicment en fonction de la twig ou du tag actuel extrait. Vous pouvez configurer les modèles de version personnalisés comme vous le souhaitez.

https://github.com/qoomon/maven-branch-versioning-extension

Exemple de format de version entrer la description de l'image ici

S’il suffit de définir la balise git et les informations de version dans le nom du fichier d’artefact, vous pouvez utiliser maven-jgit-buildnumber-plugin :

  ${artifactId}-${git.buildnumber}   ru.concerteza.buildnumber maven-jgit-buildnumber-plugin 1.2.7   git-buildnumber  extract-buildnumber  prepare-package       

Avez-vous essayé d’utiliser ce plugin?: https://github.com/ktoso/maven-git-commit-id-plugin . Vous pouvez le configurer pour générer un fichier de propriétés avec toutes les informations pertinentes sur votre état repo:

  • twig
  • décrire
  • commitId
  • buildUserName
  • buildUserEmail
  • temps de construction
  • commitUserName
  • commitUserEmail
  • commitMessageShort
  • commitMessageFull
  • commitTime

Avez-vous vérifié le buildnumber-maven-plugin qui vous permet d’utiliser le numéro de révision de git. Mais vous aviez besoin de quelque chose de différent. De plus, je suggère de faire une chose comme:

  1.0.0-SNAPSHOT 1.0.0-SNAPSHOT 

être maître

sur une twig, vous pouvez simplement changer la version en

  1.0.0-BF-SNAPSHOT