L'esperienza dell'utilizzo di flatten-maven-plugin per semplificare la gestione delle versioni nei progetti maven

Chi siamo

In 1C sviluppiamo non solo la piattaforma 1C: Enterprise con C++ e JavaScript, ma anche applicazioni in Java, in particolare un nuovo ambiente di sviluppo Strumenti di Sviluppo Aziendale basato su Eclipse e un server profondamente integrato con la piattaforma di messaggistica – Sistemi di Interazione.

Introduzione

Come sistema di build per le applicazioni Java, utilizziamo principalmente maven e in questo breve articolo vorremmo discutere una delle sfide incontrate nel processo di organizzazione dello sviluppo e il metodo che ci ha permesso di superare questo problema.

Prerequisiti e flusso di lavoro

A causa delle specificità dello sviluppo nei nostri progetti maven, utilizziamo un numero significativo di moduli, dipendenze e progetti secondari. Il numero di file pom in un albero può arrivare a contare decine e persino centinaia.

L'esperienza dell'utilizzo di flatten-maven-plugin per semplificare la gestione delle versioni nei progetti maven

Sembra semplice: una volta creato si può dimenticare. Se è necessario cambiare o aggiungere qualcosa in tutti i file contemporaneamente, ci sono molti strumenti utili negli editor e IDE. Qual è la modifica più comune al file pom.xml? Riteniamo sia la modifica delle versioni di progetto e dipendenze. Forse qualcuno vorrà contestare questa affermazione, ma per noi è così. La ragione è che, oltre al core, sviluppiamo parallelamente molte delle nostre librerie e, per garantire la riproducibilità costante dei risultati di compilazione e test, l'uso degli snapshot non ci sembra un approccio pratico. Per questo motivo dobbiamo aumentare il numero di versione nei progetti ad ogni build.

Inoltre, lo sviluppatore ha di tanto in tanto la necessità di costruire il proprio ramo di una libreria e testarne il funzionamento con tutte le dipendenze, per questo motivo è necessario modificare manualmente la versione in tutte.

Soluzione iniziale

Con queste frequenti e molteplici modifiche alle versioni, desideriamo semplificare e automatizzare il processo all'interno del CI. Qui entra in gioco un plugin di pubblico dominio molto utile. versions-maven-plugin — lo attiviamo e lo eseguiamo

mvn -N versions:set -DnewVersion=2.0.1

e Maven farà tutto come deve: passerà attraverso l'gerarchia dall'alto verso il basso, sostituirà tutte le versioni — è fantastico! Ora resta solo da fare un pull request, i colleghi lo esamineranno e si può rapidamente integrare nel trunk. Rapidamente? Non proprio. Un paio di centinaia pom.xml in revisione, e questo senza contare il codice. Inoltre, nessuno è al riparo da conflitti di merge con un numero così elevato di file modificati. Vale la pena notare che durante il processo CI le modifiche delle versioni avvengono automaticamente insieme alla modifica della funzionalità, e non separatamente.

Nuove funzionalità

Per un po' siamo stati tranquilli e, accettando la situazione, così abbiamo vissuto, finché i ragazzi del Maven Apache Project non hanno incluso in Maven, a partire dalla versione 3.5.0-beta-1, il supporto per quelli che vengono chiamati "sostituti" delle versioni (placeholders). L'essenza di questi sostituti è che invece di specificare una versione concreta del progetto si utilizzano variabili pom.xml ${revision} ${sha1}, ${changelist} e ${changelist}. I valori di queste proprietà sono definiti o nell'elemento <properties>, o possono essere definiti tramite una proprietà di sistema

mvn -Drevision=2.0.0 clean package

I valori delle proprietà di sistema prevalgono su quelli definiti in <properties>.

Genitore
<project>
  4.0.0
  <parent>
    org.apache
    apache
    18
  </parent>
  org.apache.maven.ci
  ci-parent
  First CI Friendly
  <version>${revision}${sha1}${changelist}</version>
  …
  <properties>
    <revision>1.3.1</revision>
    <changelist>-SNAPSHOT</changelist>
    <sha1
  </properties>
</project>

Discendente
<project>
  4.0.0
  <parent>
    org.apache.maven.ci
    ci-parent
    <version>${revision}${sha1}${changelist}</version>
  </parent>
  org.apache.maven.ci
  ci-child
   …
</project>

Se desideri compilare la versione 2.0.0-SNAPSHOT, basta usare

    mvn -Drevision=2.0.0 clean package

Se vuoi fare un rilascio, basta azzerare SNAPSHOT

    mvn -Dchangelist= clean package

*Gli esempi sopra sono presi da articolo sito del progetto Maven Apache

La dura realtà

Va tutto bene e fantastico, è il momento di provare un senso di soddisfazione, ma no. Si scopre che per install e deploy questo metodo non è praticabile, poiché nelle descrizioni degli artefatti pubblicati nel repository non sarà sostituito ${sha1} con il suo valore e Maven non capirà di cosa si tratta.

<parent>
    org.apache
    apache
    ${revision}
</parent>

Luce in fondo al tunnel

Devi cercare una soluzione al problema. La situazione potrebbe essere salvata da flatten-maven-plugin. Questo plugin consente di risolvere tutte le variabili nel pom, ma allo stesso tempo elimina un sacco di altre informazioni che sono necessarie solo durante la build e non servono per importare artefatti pubblicati in altri progetti. Inoltre, il plugin "appiattisce" tutte le dipendenze parent-child, e alla fine si ottengono pom piatti che includono tutto il necessario. Il problema era che elimina troppo "superfluo", il che non ci soddisfava affatto. Dopo aver studiato le informazioni sullo sviluppo di questo plugin, abbiamo scoperto che non eravamo gli unici nell'universo, e già nell'agosto 2018 nel repository del plugin su GitHub era stata creata una pull request con la richiesta di rendere possibile definire autonomamente come "rottamare" pom.xml. Gli sviluppatori hanno ascoltato le voci dei bisognosi, e già a dicembre, con il rilascio della nuova versione 1.1.0, nel flatten-maven-plugin è stata introdotta una nuova modalità resolveCiFriendliesOnly, che è arrivata come una manna dal cielo - lascia pom.xml com'è, tranne per l'elemento <version> e consente ${sha1}, ${changelist} e ${changelist}.

Aggiungiamo il plugin al progetto

<plugins>
  <plugin>
    org.codehaus.mojo
    flatten-maven-plugin
    1.1.0
    <configuration>
      true
      <flattenMode>resolveCiFriendliesOnly</flattenMode>
    </configuration>
    <executions>
      <execution>
        flatten
        process-resources
        <goals>
          flatten
        </goals>
      </execution>
      <execution>
        flatten.clean
        clean
        <goals>
          clean
        </goals>
      </execution>
    </executions>
  </plugin>
</plugins>

Fatto!

Felice fine

Da ora in poi, per modificare la versione dell'intero progetto e informare tutte le dipendenze, basta modificare l'elemento <revision> in un solo file radice. pom.xmlNon arriveranno un centinaio di questi file con la stessa modifica, ma uno solo. Inoltre, non sarà più necessario utilizzare versions-maven-plugin.

Fonte: habr.com

Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster