Пра нас
У 1С мы распрацоўваем не толькі платформу
Уступленне
У якасці сістэмы зборкі Java-прыкладанняў часцей за ўсё мы выкарыстоўваем maven, і ў гэтым невялікім артыкуле хацелі б расказаць аб адной з праблем, з якой прыйшлося сутыкнуцца ў працэсе арганізацыі распрацоўкі, і аб падыходзе, які дазволіў гэтую праблему пераадолець.
Перадумовы і працоўны працэс
У сувязі са спецыфікай распрацоўкі ў нашых maven-праектах мы выкарыстоўваем дастаткова шмат модуляў, залежнасцяў і даччыных праектаў. Колькасць pom-файлаў у адным дрэве можа вылічацца дзясяткамі і нават сотнямі.
Здавалася б: нічога страшнага, адзін раз стварылі і забыліся. Калі трэба нешта памяняць ці дадаць ва ўсіх файлах адразу, існуе маса зручных прылад у рэдактарах і IDE. А якая самая распаўсюджаная рэгулярная змена pom.xml? Мяркуем, што змена версій праекту і залежнасцяў. Магчыма, нехта захоча з гэтым паспрачацца, але ў нас справа ідзе менавіта так. Чыннік крыецца ў тым, што нараўне з ядром мы раўналежна распрацоўваем шмат уласных бібліятэк, і для сталай узнаўляльнасці вынікаў зборкі і тэставанні выкарыстанне снэпшотаў не ўяўляецца нам зручным падыходам. Па гэтай прычыне і даводзіцца паднімаць нумар версіі ў праектах пры кожнай зборцы.
Таксама ў распрацоўніка час ад часу ўзнікае неабходнасць сабраць сваю галінку якой-небудзь бібліятэкі і праверыць яе працаздольнасць па ўсіх залежнасцях, для чаго ў іх усіх даводзіцца ўручную мяняць версію.
Першапачатковае рашэнне
З такімі частымі і шматлікімі зменамі версій працэс у рамках CI жадаецца спрасціць і аўтаматызаваць. Тут на дапамогу прыходзіць зручная агульнавядомая ўбудова. versions-maven-plugin - падключаем яго і запускаем
mvn -N versions:set -DnewVersion=2.0.1
і мавен усё як трэба зробіць: прабяжыць па іерархіі зверху данізу, усе версіі падменіць - прыгажосць! Цяпер засталося падняць pull-request, калегі змены адгледзяць, і можна хуценька ўлівацца ў trunk. Хуценька? Як бы ня так. Пара-тройка сотняў pom.xml на раўчу, і гэта не лічачы кода. У дадатак і ад merge-канфліктаў ніхто не застрахаваны пры такой вялікай колькасці змененых файлаў. Тут трэба заўважыць, што падчас CI змены версій адбываюцца аўтаматычна разам са зменай функцыянальнасці, а не неяк асобна.
новыя магчымасці
На некаторы час мы супакоіліся і, змірыўшыся, так і жылі, пакуль хлопцы з
mvn -Drevision=2.0.0 clean package
Значэнні сістэмных уласцівасцяў маюць перавагу перад значэннямі, вызначанымі ўўласцівасці>.
бацька
4.0.0
org.apache
apache
18
org.apache.maven.ci
ci-parent
First CI Friendly
${revision}${sha1}${changelist}
...
1.3.1
-SNAPSHOT
Нашчадак
4.0.0
org.apache.maven.ci
ci-parent
${revision}${sha1}${changelist}
org.apache.maven.ci
ci-child
...
Калі жадаецца сабраць версію 2.0.0-SNAPSHOT, то проста выкарыстоўваем
mvn -Drevision=2.0.0 clean package
Калі жадаецца зрабіць рэліз, то проста абнуляем SNAPSHOT
mvn -Dchangelist= clean package
*Прыклады вышэй узяты з
Суровая рэальнасць
Усё добра і выдатна, пара выпрабаваць пачуццё задавальнення, але не. Аказваецца, што для install і deploy гэты спосаб не падыдзе, паколькі ў апісаннях артэфактаў, якія публікуюцца ў рэпазітар, не будзе падмяняцца. ${revision} на яе значэнне і maven далей не зразумее пра што ўвогуле гаворка.
org.apache
apache
${revision}
Святло ў канцы тунэлю
Трэба шукаць вырашэнне праблемы. Сітуацыю мог бы выратаваць
Дадаем плягін у праект
org.codehaus.mojo
flatten-maven-plugin
1.1.0
true
resolveCiFriendliesOnly
flatten
process-resources
flatten
flatten.clean
clean
clean
Гатова!
Хэпі-энд
З гэтага часу нам, каб змяніць версію ўсяго праекта і даць ведаць аб гэтым усім залежнасцям, трэба ўсяго адрэдагаваць элементперагляд> у адным толькі каранёвым pom.xml. На рэўю прылятае не сотня-другая гэтых файлаў з аднолькавай зменай, а адзін. Ну і адпадае неабходнасць у выкарыстанні versions-maven-plugin.
Крыніца: habr.com