[Java lista] verziokovetes
Gergely Hodicska
felho at avalon.aut.bme.hu
2008. Már. 6., Cs, 11:38:41 CET
Szia!
Kicsit hosszú lesz, de épp most dolgozgatom ki a saját felállásunk erre
a célra. A rendszer PHP, de szerintem Javas projektre is jó.
> Eddig cvs-t hasznaltunk sima parancssorbol, de mar nem nagyon tudjuk
> ezeket a dolgokat karban tartani.
Szerintem az SVN lényegesen jobb, mint a CVS (bár lsp válaszára még
kíváncsi leszek):
o a commitok atomiak (CVS bármikor maradhat inkozisztens állapotban).
o CVS nem kezeli rendesen a könyvtárakat.
o CVS-ben nem tudsz normálisan átnevezni valamit (mondjuk ez az SVN-ben
sem kerek)
o globális revision szám
o hatékonyabb binary kezelés
o lokálban van a BASE revision, sok funkcióhoz ezért nem kell a repóhoz
fordulni
o a dróton csak a változásokat zavarja át, ergó gyorsabb
o van még sok apróság is (repo fromátum is hatékonyabb, ahogy én tudom)
> 5. barmi mas javaslat, eszerevetel, kerdes.
A mi rendszerunkben szempont volt, hogy minden szinten lehessen
teszteket futtatni (ez most még nincs, ezért erről részletet nem tudok),
vagy akár CI szervert használni.
Én a következő felállást találtam ki:
SVN szintjén van trunk, stage, prelive. A trunkban van a projekt. A
stageben készülünk a következő releasre. A preliveban vannak a releasek
(visszamenőleg elérhető pár darab, leginkább csak azért, hogy ha
élesítéskor valamit benéznék, akkor egy mozdulattal vissza lehessen
állni), ha már tuti nem kell, akkor átmozgatjuk egy oldies mappába (vagy
akár törölhető is). Ezek mind elérhetők egy saját URL-en, így akár
funkcionális teszteket is lehet futtatni rajtuk.
Bármit amit commitolunk az SVN-be, az ki syncelődik a szerverekre. Ez
úgy néz ki (ill. fog kinézni), hogy van egy post commit handler, ami
elvégzi a szükséges beállítások (pl. chmod amire kell, stb.),
valószínűleg a többnyelvűsítéskor itt lesz egy build folyamat is, vagy
bármi egyebet, amire itt még szükség lehet, és ha ezzel megvan, akkor
rsync-kel kitolja a kész cuccot (ez mind trunk, stage, prelive szinten
megtörténik).
Ezenkívül van a szervereken egy live könyvtár. Itt szintén releasek
vannak, valamint egy current symlink, ez utóbbira van az éles rendszer
vhostja(i) felépítve. Ha egy adott release a prelive-ban jónak tűnik,
akkor minden szerveren átmásoljuk a live könyvtárba, majd ha minden
készen van, akkor mindenhol átzavarjuk a symlinket. Ez részben azért is
lett így, mert az átmozgatás időigényesebb lehet, míg a symlink
változtatás nagyon gyorsan megvan, így rövidebb (nagyon röivid) ideig
lesznek a szerverek esetlegesen inkozisztens állapotban.
A külön live prelive felállásra azért is szükség van, mert a bugfizeket
közvetlenül a release prelivebeli könyvtárában készítjük el, majd
commitoljuk, és akkor a prelive-on lehet még tesztelni, és ha oké, akkor
rsync a live-ba. Azért jobb ide a bugfix, mert ehhez a kódhoz
kapcsolódik, a trunk menetközben már el is térhet annyira, hogy ott a
hibának már nincs létjogosultsága, ha meg kell, akkor vissza kell
protolni a trunkba és a stage-be.
Egy dolgon még nem teljesen tiszta nálunk: trunk -> stage közti mozgás.
Ha csak simán a fejlesztők commitolják a kész, tesztelt cuccukat a
trunkba, akkor amikor mergelni akarunk a trunkból egy adott "feature"-t
a stage-be, akkor ez nem egy túl explicit dolog. Erre a terv (csak nem
tudom még, hogy adminisztrációs szinten mennyi lehet ennek az
overheadje, illetve milyen jó eszközök léteznek erre a célra), hogy
minden egyes feature úgy készül, hogy létrehozunk egy feature branch-et
a trunkból, és ott készül el. Ha úgy döntünk, hogy a feature kész, és
mehet a következő release-be, akkor ezt a feature branchet mergeljúk a
trunkba és a stage-be. Előtte ha kell, akkor a fejlesztő szinkronba
hozza a trunkkal.
Ebben az egészben még az is jó lehet, hogy a folyamatok nagy része
automatizálható, illetve a feature branch-ek használatával jó esetben a
merge-elés a stage-be is. Persze conflict esetén kézzel kell belenyúlni.
Amit nem tudok tapasztalat nélkül most megbecsülni, hogy menyi olyan
eset lehet, amikor két külön feature-höz hasonló dolgokra van szükség
"library" szintjén, és két fejlesztő mondjuk ugyanazt másképp csinálja
meg. Bár valószínűleg tervezés és kommunikációval ez megoldható (főleg a
mi szintünkön).
Érdekelne, hogy aki nagyobb helyen dolgozik, ott van-e valami hasonló,
vagy hogyan oldják ezt meg. Számomra ez a rendszer szimpinek tűnik, de
tapasztalat még nincs vele, illetve most csinálgatok hozzá majd
valamilyen admin felületet. Ezzel kapcsolatban ami még érdekes lehet,
hogy végül úgy döntöttem, hogy nem svn log paranccsal fogok bűvészkedni,
hanem a post commit handlerben mentek dolgokat DB-be, és állítok
státuszokat, és a "kifrissítő" admin ezen fog alapulni. Szépen ki lehet
listázni, hogy mondjuk a stage-ben milyen feature-ők vannak, adott
release-be milyen bugfizek kerültek be, sync-ek gombnyomásra, ilyesmi.
Üdv,
Felhő
További információk a(z) Javalist levelezőlistáról