2011. augusztus 17., szerda

Gyárlátogatás: verziószám

Tipikus igény a szoftverekkel szemben, hogy meg tudják mondani a saját verziószámukat. Ez főleg azért kell, hogyha a kedves felhasználó meglát egy bogarat benne, meg tudja mondani, hogy melyik verzióban látta. Legalábbis hogy esélye legyen rá. Erre szedtem össze az általam eddig látott és használt megoldásokat, azzal együt hogy mi a tipikus elba**** velük kapcsolatban. Nemcsak hogy egyik sem tökéletes megoldás, de mindegyik szerintem elég töketlen. Persze a sajátját mindenki szereti :-)

Build script

Ez volt a leggyakoribb. Az ötlet annyi, hogy amikor buildelsz, akkor generáljon neked egy számot bele egy file-ba, amit valószinűleg besúvaszt utánna a classpath-ra. Ezt persze csak inkrementálgatni kell. Láttam olyat, hogy ez a file csak úgy "floating around" azaz akik release-t csináltak azok tudták a számozást, aztán volt olyan hogy visszakommitolták legalább időnként a verziókövetőbe. Ja még ezen belül is két különböző műfaj van, van aki verzió számot tart számon, van aki build számot. Szóval a kombinációk száma igen magas.
A tipikus elba:

  • Amikor nincs meg a file a classpathon, akkor valami törik
  • Elfelejted inkrementálni a build számot
  • Elfelejted a verziószámot bepakolni a verziókövetőbe, mielött tegelsz



Database, config

Olyat is láttam, hogy az emberek a konfigurációba, vagy gyakrabban az adatbázisba írják bele, hogy mennyi a szoftver verziószáma. Az egyébként tetszik, hogy az adatbázisban valahol benne legyen az, hogy milyen patcheket hajtottak végre rajta és milyen verzió satöbbi a jelenlegi schema, de akkor most az operátorra bíztuk, hogy felülbuherálja a verziószámot.
Elba:

  • Azon felül hogy anyukádat emlegetik közben, még rizikó tényező hogy az operátor valamikor visszacsinálja vagy átírja, vagy éppen ellenkezőleg: elfelejti átírni.
  • Az fenti elfelejtések simán ide is passzolnak

SVN-way


Ezt én találtam ki és hát primitív mint a szerzője: Csinálj egy osztályt pl Version néven, tegyél bele egy final static String mezőt, aminek az értéke legyen ennyi: "$HeadURL: http://svn.blf.hu/fubar/trunk/src/main/hu/blf/Version.java $", plusz egy metódust, ami fubar és az src közül kibányássza neked ami ott van: pl ennyi: StringUtils.substringBefore(StringUtils.substringAfter(version, "/fubar/"), "/src/"), ne felejtsd el a végén az svn property-k között a keywords-be beleírni azt hogy "HeadURL".
A build numebert nyilván hanyagolja. Csak azt adjuk oda bárkinek is, amit szépen betegeltünk.
Jó, a nyilvánvaló hátrányok elött felsorolnám hogy miért szerettem ezt:

  • Soha nem sikerült elszúrnom :) A Version osztály mindig valami értelmeset ad vissza. Pl azt hogy "trunk". A legdurvább elcseszés esetén semmit, de nem NullpointerException-t.
  • A release során simán meg lehet róla feledkezni. A release nálam ennyi: mvn release:prepare release:perform (így "howto release" manuált se írtam soha)
  • Ja és ez az egész substringes dolog csak a cicoma rajta, sima statikus text/html fileokkal is működhet, ha érti a felhasználód a HeadURL-t hogy mi az.
Akkor jöjjön a hátrány:
  • Totálisan SVN függő - azért volt ilyen a CVS-ben is, de arra már kiemlékszik
  • Az SVN-re meg most úgy fintorgunk mint a CVS-re úgy 6-7 évvel ezelött. Valahogy akkor jött ki az SVN, nem?
Még annyit a megoldás portolhatóságáról, hogy a git pl nemcsak hogy nem csinálja, de elvben is ellenzi. Linus Torvalds szerint írjál scriptet. Szerintem meg ... :-) Na mindegy, nekem ez nem tetszik, túlságosan könnyen elcseszhető. Meg bújja a git elba manuálját az, akinek nincs jobb szórakozása.

Ennyi... részemről

De kiváncsi lennék a ti tapasztalataitokra, linkeljétek vagy írjátok ide nyugodtan! Köszi előre is!

10 megjegyzés:

tvk írta...

Nekem az a kedvenc megoldásom, hogy valami build script-be, vagy property fájlban ÉN írogatom a verziószámot kézzel release esetén.

Csak azért, mert szeretem őket elnevezgetni végül, ha már annyit dolgozok rajtuk.

Egyébként nagyon sok helyen találkozom azzal a problémával, hogy nincs kiírva sehova -még elrejtve sem- a verziószám. Erről lehet tudni, hogy felütötte a fejét a balfaszság a fejlesztőcsapatban.

Viczián István írta...

No, innentől számolva a következő harmadik bejegyzésem pont ugyanez lett volna, most húzhatom ki a listáról. :) Gratula!

Az nem megoldás, ha úgyis Maven van (release-ből látom), hogy a Maven a {project.version} változó értékét beírja egy fájlba, akár egy forrásba, akár egy property fájlba, amit valaki olvas? Nekem mindig a pom.xml-ben lévő verziószám az elsődleges, és nem az SCM. Aztán ott van a Build Number Maven Plugin is.

Kocka írta...

Elnezest :) Attol meg nyomjad, lehetne egy korrekt, tragar es szleng szavaktol mentes bejegyzes.

Szoval nekem is ez a maven metainfos dolog a kovetkezo otletem. Ez az info mar most is ott van a Meta-inf alatt. Ez talan meg egeszen elcseszhetetlen megoldas lehet egyebkent, mert alapbol a pom mindig ott van a meta-inf alatt. Egyetlen okbol idegenkedek tole: amikor jetty-vel startolom fel a projectet, akkor is megvan? Lehet hogy korrekt csomagolas es ilyesmi kell neki?

Mind1, keritek idot hogy kitapasztaljam ezt az egeszet. Majd osszd meg a tapasztalataidat!

tvk írta...

Maven jetty-run -nál nem helyettesítődik be a verziószám. (Nálam legalábbis az alap konfignál.) De ez nem túl fájdalmas dolog. Annyi, hogy amikor fejlesztek a verziószám placeholdert látom az alkalmazáson.

Viczián István írta...

Igen, próbáltam én is ilyent, még JAR-nál, és mikor kicsomagolva futtatod, nem fér hozzá.

De nem arra gondoltam, hogy a meta-ból olvasol, hanem az, hogy csinálsz egy version.properties állományt, és abba a Maven build közben helyettesíti be a szöveget.

Gábor írta...

Az SVN eseteben van egy lehetoseg meg: a revizioszam. Ez mindig az a szam lesz, amibol a release build letrejott.
Nyilvan maven meg ant eseteben vajakolni kell, hogy ez mukodjon, de ezt viszont meg lehet csinalni - relative egyszeruen - gitre is, kulonosebb scripteles nelkul.

Kocka írta...

Gabor, ha a legutobbi modositas verzioszamat akarod tudni, az nem biztos, hogy menni fog. Egy file-ba csak az annak a file-nak a legutobbi modositasat teszi bele az svn, szovl a teljes forraskod fara ez nem mukodik.

Gábor írta...

Arra ugy valoban nem. Viszont en pl. ugy csinalnam, hogy a release folyamatban gyartanam a changelogot az svn log alapjan, ezt eltennem, es ennek a revizioja adna ki a verzioszamot. Ekkor mindig a legujabb lesz meg.

De amugy, ha jol tudom, svn release eseteben amugy is van egy svn copy a tags konyvtarba, es szerintem az itt letrejovo mappa revizioja a latest lesz, nem?

Viczián István írta...

A Maven buildNumber plugin futtat egy "svn info" parancsot, az a teljes fára megmondja, hogy melyik revision-re update-eltél utoljára, és azt teszi build number-nek.

Gábor írta...

Most eljutottam ide is olvasasilag.

@Vician Istvan: igen, ez peldaul akar meg mukodhet is.
Git-nel meg lehet rev-parse -zal jatszani.