Expérience de l'utilisation de flatten-maven-plugin pour simplifier la gestion des versions dans les projets Maven

Qui sommes-nous

Chez 1C, nous développons non seulement une plateforme 1C : Entreprise sur C ++ и JavaScript, mais aussi des applications Java - notamment le nouvel environnement de développement Outils de développement d'entreprise basé sur Eclipse et un serveur de messagerie profondément intégré à la plateforme - Systèmes d'interaction.

Entrée

Nous utilisons le plus souvent maven comme système de construction d'applications Java, et dans ce court article, nous aimerions parler de l'un des problèmes auxquels nous avons dû faire face dans le processus d'organisation du développement, et de l'approche qui nous a permis de surmonter ce problème. problème.

Conditions préalables et flux de travail

En raison des spécificités de développement de nos projets maven, nous utilisons beaucoup de modules, de dépendances et de projets enfants. Le nombre de fichiers pom dans une arborescence peut se chiffrer en dizaines, voire en centaines.

Expérience de l'utilisation de flatten-maven-plugin pour simplifier la gestion des versions dans les projets Maven

Il semblerait : ce n’est pas grave, ils l’ont créé une fois et l’ont oublié. Si vous devez modifier ou ajouter quelque chose dans tous les fichiers à la fois, il existe de nombreux outils pratiques dans les éditeurs et les IDE. Quelle est la modification régulière la plus courante apportée à pom.xml ? Nous pensons que les changements dans les versions et les dépendances du projet. Peut-être que quelqu'un voudra contester cela, mais c'est exactement notre situation. La raison réside dans le fait que, parallèlement au noyau, nous développons simultanément plusieurs de nos propres bibliothèques et que, pour la reproductibilité constante des résultats de construction et de test, l'utilisation d'instantanés ne nous semble pas une approche pratique. Pour cette raison, il est nécessaire d’augmenter le numéro de version dans les projets à chaque build.

De plus, de temps en temps, un développeur doit créer sa propre branche d'une bibliothèque et vérifier ses fonctionnalités par rapport à toutes les dépendances, pour lesquelles il doit modifier manuellement la version de chacune d'elles.

Solution initiale

Avec des changements de version aussi fréquents et multiples, je souhaite simplifier et automatiser le processus au sein de CI. C'est là qu'un plugin pratique et bien connu vient à la rescousse. versions-maven-plugin - connectez-le et lancez-le

mvn -N versions :set -DnewVersion=2.0.1

et Maven fera tout comme il se doit : il parcourra la hiérarchie de haut en bas, en remplaçant toutes les versions - beauté ! Il ne vous reste plus qu'à lancer une pull request, vos collègues examineront les modifications et vous pourrez rapidement rejoindre le tronc. Rapidement? Peu importe comment c'est. Quelques centaines pom.xml pour examen, et cela ne compte pas le code. De plus, personne n’est à l’abri de conflits de fusion avec un si grand nombre de fichiers modifiés. Il convient de noter ici que dans le processus CI, les changements de version se produisent automatiquement avec les changements de fonctionnalités, et non séparément.

Nouvelles fonctionnalités

Pendant un moment, nous nous sommes calmés et, résignés, nous avons vécu comme ça jusqu'à ce que les gars de Projet Maven Apache À partir de la version 3.5.0-beta-1, Maven n'incluait pas la prise en charge des « espaces réservés ». L'essence de ces substituts est que pom.xml au lieu d'une indication spécifique de la version du projet, des variables sont utilisées ${révision}, ${sha1} и ${liste de modifications}. Les valeurs de ces propriétés elles-mêmes sont définies soit dans l'élémentpropriétés>, ou ils peuvent être définis via une propriété système

mvn -Drevision=2.0.0 paquet propre

Les valeurs des propriétés système sont prioritaires sur les valeurs définies danspropriétés>.

Parent

  4.0.0
  
    org.apache
    apache
    18
  
  org.apache.maven.ci
  ci-parent
  Premier amical CI
  ${révision}${sha1}${changelist}
  ...
  
    1.3.1
    -INSTANTANÉ
    
  


Descendant

  4.0.0
  
    org.apache.maven.ci
    ci-parent
    ${révision}${sha1}${changelist}
  
  org.apache.maven.ci
  ci-enfant
   ...

Si vous souhaitez créer la version 2.0.0-SNAPSHOT, utilisez simplement

    mvn -Drevision=2.0.0 paquet propre

Si vous souhaitez publier une version, réinitialisez simplement SNAPSHOT

    mvn -Dchangelist= paquet propre

*Les exemples ci-dessus sont tirés de articles sur le site du projet Maven Apache

La dure réalité

Tout est bon et sain, il est temps d’éprouver un sentiment de satisfaction, mais non. Il s'avère que cette méthode ne fonctionnera pas pour l'installation et le déploiement, puisqu'elle ne sera pas remplacée dans les descriptions des artefacts publiés dans le référentiel. ${révision} sur sa signification et maven ne comprendra plus de quoi il s’agit.


    org.apache
    apache
    ${révision}

Une lumière au bout d'un tunnel

Nous devons chercher une solution au problème. J'aurais pu sauver la situation aplatir-maven-plugin. Ce plugin résout toutes les variables du pom, mais supprime en même temps de nombreuses autres informations qui ne sont nécessaires que lors de l'assemblage et qui ne sont pas nécessaires lors de l'importation d'artefacts publiés dans d'autres projets. Le plugin « redresse » également toutes les dépendances parent-enfant et, par conséquent, vous obtenez un pom plat qui comprend tout ce dont vous avez besoin. L’inconvénient était que cela supprimait trop de « extra », ce qui ne nous convenait pas du tout. Après avoir étudié les informations sur le développement de ce plugin, il s'est avéré que nous ne sommes pas seuls dans l'univers, et en août 2018, une pull-request a été créée sur Github dans le référentiel du plugin avec le désir de le rendre possible. pour déterminer par nous-mêmes comment « gâcher » pom.xml. Les développeurs ont écouté les voix de ceux qui souffrent, et déjà en décembre, avec la sortie de la nouvelle version 1.1.0, un nouveau mode, solveCiFriendliesOnly, est apparu dans le plugin flatten-maven, qui était plus adapté que jamais - il laisse pom.xml tel quel, à l'exception de l'élément et permet ${révision}, ${sha1} и ${liste de modifications}.

Ajout d'un plugin au projet


  
    org.codehaus.mojo
    aplatir-maven-plugin
    1.1.0
    
      vrai
      résoudreCiFriendliesOnly
    
    
      
        aplatir
        processus-ressources
        
          aplatir
        
      
      
        aplatir.nettoyer
        faire le ménage
        
          faire le ménage
        
      
    
  

Fait!

Fin heureuse

Désormais, afin de changer la version de l'ensemble du projet et d'en informer toutes les dépendances, il suffit d'éditer l'élémentrévision> juste à la racine pom.xml. Ce ne sont pas cent ou deux de ces fichiers présentant la même modification qui arrivent à l'examen, mais un seul. Eh bien, il n'est pas nécessaire d'utiliser versions-maven-plugin.

Source: habr.com

Ajouter un commentaire