O nama
U 1C razvijamo ne samo platformu na i , već i aplikacije na Javi – posebno novo razvojno okruženje na bazi Eclipse, a server je duboko integriran s platformom messengera – .
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.

Č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 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 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 . 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
