Iskustvo korištenja flatten-maven-plugin za pojednostavljenje verzioniranja u maven projektima

O nama

U 1C razvijamo ne samo platformu 1C: Poduzeće na C++ i JavaScript, već i aplikacije na Javi – posebno novo razvojno okruženje Alati za razvoj poduzeća na bazi Eclipse, a server je duboko integriran s platformom messengera – Sistemi interakcije.

Uvod

Kao sistem za gradnju Java aplikacija najčešće koristimo maven, i u ovom kratkom članku bismo željeli govoriti o jednom od problema s kojim smo se suočili u procesu organizacije razvoja, i o pristupu koji je omogućio rješavanje tog problema.

Pretpostavke i radni proces

Zbog specifičnosti razvoja u našim maven projektima koristimo relativno mnogo modula, ovisnosti i podprojekata. Broj pom datoteka u jednom stablu može se brojati u desecima, pa čak i stotinama.

Iskustvo korištenja flatten-maven-plugin za pojednostavljenje verzioniranja u maven projektima

Činilo bi se: ništa strašno, jednom stvoreno i zaboravljeno. Ako treba nešto promijeniti ili dodati u sve datoteke odjednom, postoji mnoštvo praktičnih alata u urednicima i IDE-ima. A koja je najčešća redovita promjena pom.xml? Smatramo da je to promjena verzija projekata i ovisnosti. Moguće je da se netko s tim ne slaže, ali kod nas je situacija upravo takva. Razlog leži u tome što paralelno s jezgrom razvijamo mnogo vlastitih biblioteka, a za stalnu reproduktivnost rezultata gradnje i testiranja, korištenje snaphotova nam se ne čini praktičnim pristupom. Zbog toga moramo podizati broj verzije u projektima pri svakoj gradnji.

Također, programer ponekad ima potrebu sastaviti svoju granu bilo koje biblioteke i provjeriti njenu funkcionalnost u svim ovisnostima, zbog čega se u njima svima mora ručno mijenjati verzija.

Prvotno rješenje

S tako čestim i višestrukim promjenama verzija, proces unutar CI želi se pojednostaviti i automatizirati. Ovdje pomaže praktični i poznati plugin versions-maven-plugin — povezujemo ga i pokrećemo

mvn -N versions:set -DnewVersion=2.0.1

i maven će učiniti sve kako treba: proći će kroz hijerarhiju od vrha do dna, sve verzije zamijeniti — ljepota! Sada je preostalo podići pull-request, kolege će pregledati promjene, i brzo se možemo uključiti u trunk. Brzo? Nije baš tako. Par stotina pom.xml u pregledu, a to ne uključuje kod. Osim toga, nitko nije imun na merge konflikte s tako velikim brojem promijenjenih datoteka. Ovde treba napomenuti da se tokom CI promene verzija automatski dešavaju zajedno sa promenom funkcionalnosti, a ne odvojeno.

Nove mogućnosti

Na neko vreme smo se smirili i, pomirivši se, tako smo živeli, dok dečki iz Maven Apache Project nisu uključili u maven, počevši od verzije 3.5.0-beta-1, podršku za takozvane "zamjenike" verzija (placeholders). Suština tih zamjenika je da pom.xml umesto konkretnog navođenja verzije projekta koriste promenljive ${revision}, ${sha1} i ${changelist}. Same vrednosti ovih svojstava se definišu ili u elementu <properties>, ili ih možemo definisati preko sistemskog svojstva

mvn -Drevision=2.0.0 clean package

Vrednosti sistemskih svojstava imaju prednost nad vrednostima definisanim u <properties>.

Roditelj
<project>
  <modelVersion>4.0.0<\/modelVersion>
  <parent>
    <groupId>org.apache<\/groupId>
    <artifactId>apache<\/artifactId>
    <version>18<\/version>
  <\/parent>
  <groupId>org.apache.maven.ci<\/groupId>
  <artifactId>ci-parent<\/artifactId>
  <name>First CI Friendly<\/name>
  <version>${revision}${sha1}${changelist}<\/version>
  …
  <properties>
    <revision>1.3.1<\/revision>
    <changelist>-SNAPSHOT<\/changelist>
    <sha1\/>
  <\/properties>
<\/project>

Potomak
<project>
  <modelVersion>4.0.0<\/modelVersion>
  <parent>
    <groupId>org.apache.maven.ci<\/groupId>
    <artifactId>ci-parent<\/artifactId>
    <version>${revision}${sha1}${changelist}<\/version>
  <\/parent>
  <groupId>org.apache.maven.ci<\/groupId>
  <artifactId>ci-child<\/artifactId>
   …
<\/project>

Ako želite da skupite verziju 2.0.0-SNAPSHOT, samo koristite

    mvn -Drevision=2.0.0 clean package

Ako želite da uradite izdanje, samo resetujte SNAPSHOT

    mvn -Dchangelist= clean package

*Primeri iznad su preuzeti sa članaka svejt Maven Apache Project

Surova stvarnost

Sve je dobro i lepo, vreme je da osetite zadovoljstvo, ali ne. Ispostavlja se da ovaj način nije pogodan za install i deploy, jer u opisima artefakata koji se objavljuju u repozitorijumu neće se zameniti ${revision} na njenu vrednost i maven dalje neće razumeti o čemu se uopšte radi.

<parent>
    <groupId>org.apache<\/groupId>
    <artifactId>apache<\/artifactId>
    <version>${revision}<\/version>
<\/parent>

Svetlost na kraju tunela

Treba potražiti rešenje problema. Situaciju bi moglo spasiti flatten-maven-plugin. Ovaj plugin omogućava sve varijable u pom, ali također izbacuje mnoštvo drugih informacija koje su potrebne samo prilikom izgradnje i nisu potrebne prilikom uvoza objavljenih artefakata u druge projekte. Također, plugin "izravnava" sve parent-child ovisnosti, i na kraju se dobivaju ravni pom-ovi koji uključuju sve što je potrebno. Neugodnost je bila u tome što izbacuje "suvišno" previše, što nas je potpuno smetalo. Nakon proučavanja informacija o razvoju ovog plugina, ispostavilo se da nismo jedini u ovoj situaciji, te je već u kolovozu 2018. na GitHubu u repozitoriju plugina stvoren pull-request s željom da se omogući samostalno određivanje kako "pokvariti" pom.xml. Razvijači su poslušali glasove onih kojima je to trebalo, i već u prosincu, s izlaskom nove verzije 1.1.0, u flatten-maven-plugin uveden je novi način resolveCiFriendliesOnly, koji je bio savršeno prilagođen – ostavlja pom.xml takvim kakav jest, osim elementa <version> i omogućava ${revision}, ${sha1} i ${changelist}.

Dodajemo plugin u projekat

<plugins>
  <plugin>
    <groupId>org.codehaus.mojo<\/groupId>
    <artifactId>flatten-maven-plugin<\/artifactId>
    <version>1.1.0<\/version>
    <configuration>
      <updatePomFile>true<\/updatePomFile>
      <flattenMode>resolveCiFriendliesOnly<\/flattenMode>
    <\/configuration>
    <executions>
      <execution>
        <id>flatten<\/id>
        <phase>process-resources<\/phase>
        <goals>
          <goal>flatten<\/goal>
        <\/goals>
      <\/execution>
      <execution>
        <id>flatten.clean<\/id>
        <phase>clean<\/phase>
        <goals>
          <goal>clean<\/goal>
        <\/goals>
      <\/execution>
    <\/executions>
  <\/plugin>
<\/plugins>

Gotovo!

Sretan završetak

Od sada, da bismo promijenili verziju čitavog projekta i obavijestili sve ovisnosti, potrebno je samo urediti element <revision> u samo jednom korijenskom pom.xml. Na recenziju stiže ne stotinu-dvije ovih datoteka s istom izmjenom, već jedna. Također, otpaodstava potreba za korištenjem versions-maven-plugin.

Izvor: habr.com

Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere 🔥 Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere | ProHoster