MikoAndras.hu

Mikó András

Automatikus hook létrehozás minden új svn repository-ban

Egy alkalommal össze kellett kapcsolnom egy subversion szervert egy mantis-szal, hogy a hibajegyeknek megfelelő módosításokat az svn beküldésük után hozzájuk tudja csatolni. Ezt a post-commit hook segítségével oldottuk meg. Nagy előnye, hogy csak a repository-hoz kötődik, minden más összetevő szabadon frissíthető marad, viszont kézzel kell bemásolni minden új repo-ba.

A részletekben azt írom le, milyen gondolataim voltak, mi és miért vezetett a végül elfogadott megoldáshoz, hogy automatizálni tudjam ezt a lépést.

A kiindulási környezet

A probléma felmerülésekor egy mantis, egy subversion és egy usvn felület állt rendelkezésre készen telepítve.

Az usvn felületen létrehozott repo-ba beletettük a post-commit script-et, ami megfelelően felparaméterezve összeköttetést biztosít a mantis felé. Ezzel válik lehetővé, hogy egy-egy hibajegyhez tartozó módosítás svn-be való beküldése esetén a hibajegyhez is feljegyezzük a beküldött forráskód verziójának számát.

Egy új – második – repo-ban történt módosítások azonban nem akartak megjelenni a megfelelő mantis projekt bejegyzései mellett. Ezt a repo-t az usvn felületen hoztuk létre, minden egyéb – kézi – beavatkozástól mentesen.

Subversion hook-ok részletesen

Az svn lehetőséget biztosít minden repo-ba script-ek elhelyezésére, ami a megfelelő esemény hatására futtatásra kerül. Ha csak a forráskód új verziójának beküldését nézem, három eseményre tudunk script-et elhelyezni:

start-commit
pre-commit
post-commit

Bővebb leírást ezekről a Repository Creation and Configuration oldalon lehet találni (angolul).

Ezek alapján a sikeres beküldést választottuk ki, mivel ekkor biztos, hogy az új verziójú kód ténylegesen bekerült az adatbázisba, ezért megtehetjük a bejegyzést a megfelelő hibajegy mellé is.

A mi esetünkben az egyik pozitív tulajdonság negatív hatást fejt ki. Mivel minden repo-ban egymástól függetlenül lehet ilyen script-eket elhelyezni, hogy más és más feladatokat hajtsanak végre, nincs arra közvetlen mód, hogy egy subversion-szerver-szintű script-et adjunk meg, ami minden repo-ra ugyanúgy meghívásra kerül. Nekünk kell gondoskodnunk arról, hogy minden új repo-ba bekerüljön egy példány.

Variációk egy témára

A harmadik ötletem tűnt ténylegesen megvalósíthatónak és elfogadhatóan szépnek egyszerre. Az első kettőt azért írom le, hogy lehessen látni milyen gondolatok mentén jutottam el az elfogadott megoldásig.

Az új repository-k sablonját módosítani

Az első ötletem az volt, hogy azt a sablont kellene módosítani, ami alapján az svnadmin az új adatbázisokat hozza létre, így egy helyre kell feltenni a script-et és az svnadmin minden létrehozáskor azt is bemásolja majd. nagyjából, mint az /etc/skel működése új linux felhasználók létrehozásakor.

File-keresés alapján nem találtam meg ezt a sablont, ezért elkezdtem az svn forráskódjában keresni, valószínűsítve, hogy ott majd megtalálom az elérési útját. Egészen más dologra bukkantam.
A libsvn_repos/repos.c 284. sorában van a függvény, ami a hooks könyvtár és tartalmának létrehozásáért felel. A kódja megdöbbentő volt számomra. A forráskód tartalmazza a sablonokat, ezért nincsenek a file-rendszerben sehol.

A forráskód módosítását és ezáltal az svn újrafordítását egy rövid töprengés után kihúztam a lehetséges megoldások közül, mivel ez megtörné a további frissítés lehetőségét, és nekem kellene kézzel felvennem a módosításomat minden új svn verzióba.

Ítélet: nem megfelelő

Időzített ellenőrzés

A *nix alapú rendszereken elérhető lehetőség az időzített programok futtatása. A második ötletem ezen alapult. Elmélete: a repository-kat tartalmazó könyvtár időközönkénti figyelése, és amennyiben van új repo, abba bemásolni a post-commit script-et.

Itt viszont gondot jelent a figyelési időtartam kiválasztása.

  • milyen időközönként ellenőriztessem egy új repo létrejöttét?
  • mivel aránylag ritka az új repo létrehozási esemény, feleslegesen fut az idő nagy részében

Elég nehéz lett volna olyan időközt választani, ami egyformán gyors válaszra képes, valamint nem emészt fel feleslegesen túl sok erőforrást az új repo-k létrehozásai közötti időben.

Itélet: nem megfelelő

Esemény alapú ellenőrzés

Ekkor jutott eszembe, hogy van egy érdekes tulajdonsága a linux kernel-eknek: inotify. Röviden megfogalmazva: egy inode (file-bejegyzés) megváltozása esetén értesíti az erre a változásra feliratkozott programokat. Szerencsére nem kell kernel modult, vagy démont írni az események elkapására, ezt mások már megtették helyettünk. A csomag neve – ubuntu/debian alatt – incron.
A feltelepítése az ismert módokon történhet, ez kívül esik a jelen bejegyzés keretein.

Beállítás után minden keresett tulajdonsággal rendelkezik:

  • azonnal értesül egy új repo létrehozásáról
  • két új repo létrehozása között nem foglal erőforrást
  • beállítás után a rendszer minden eleme szabadon frissíthető marad (feltételezve, hogy az svn repo file-struktúrája ugyanolyan marad és továbbra is támogatja a post-commit elnevezésű script-et a megfelelő értelmezésben)

Ítélet: megfelelő

Pages: 1 2

, , , ,

Comments are currently closed.