Úvod
Na úvod vás musím upozornit na poslední tři díly tohoto seriálu, které se věnovaly SCM nástroji Git, základům jeho používání a jeho nasazení na vlastní server, počínaje těmi nejjednoduššími způsoby (OpenSSH) až po víceuživatelské řešení s Gitosis v minulém díle. Projděte si první, druhý a třetí díl, abyste byli v obraze.
Gitolite představuje z řešení zde probíraných nejsofistikovanější nástroj pro víceuživatelský přístup k centralizovanému Git repozitáři. Oproti Gitosis umí omezit právo zápisu na konkrétní větve (branches), respektive reference (refs). Můžete kontrolovat i to, zda má uživatel právo provést „rewind“, tedy „odčinění“ commitů nebo jiné změny historie.
Je třeba si dát pozor na jednu věc. Gitolite neumí omezit read-only přístup na úroveň jednotlivých větví. Konkrétnímu uživateli tedy můžete zakázat read-only přístup k celému repozitáři, ale nikoliv ke konkrétním větvím. Je to dáno tím, že Git neumí rozlišit mezi jednotlivými větvemi, pokud provádí čtení. Tento problém spolu s alternativami řešení je podrobně popsán v dokumentaci.
Instalace
Instalace Gitolite v Debianu je jako už tradičně velmi jednoduchá, neboť stačí nainstalovat příslušný balíček z oficiálních repozitářů:
aptitude install gitolite
Pokud při instalaci nedojde k vytvoření správcovského repozitáře, což se alespoň v mém případě nestalo, je třeba jej inicializovat ručně. Naštěstí je k tomu připraven nástroj gl-setup
. Ten musíte spustit s právy uživatele gitolite
, pod kterým bude Gitolite pracovat. Tento nástroj vyžaduje jeden parametr, a tím je cesta k souboru s veřejným SSH klíčem, který bude využíván pro přístup ke správcovskému repozitáři.
Tady pozor – jelikož tento nástroj musí běžet s právy uživatele gitolite
, je třeba, aby k umístění souboru s klíčem měl tento uživatel přístup, čehož lze docílit např. zkopírováním souboru s veřejným SSH klíčem do /tmp
. Následně stačí provést:
su gitolite -c 'gl-setup /tmp/uzivatel.pub'
Uživatelé Gitosis mají uživatelská jména shodná se jménem souboru s veřejným SSH klíčem. Proto je vhodné při provádění příkazu výše jméno souboru přizpůsobit, abyste pak neskončili s uživatelem "id_rsa
". Vše jde však samozřejmě později upravit.
Základní konfigurace
V tuto chvíli byste měli být schopní naklonovat konfigurační repozitář:
git clone gitolite@server.example.org:gitolite-admin
Repozitář by měl obsahovat dva adresáře: adresář conf
s konfiguračním souborem (gitolite.conf
) a adresář keydir
obsahující soubory s SSH klíči. Přidání nového uživatele tedy vyžaduje přidání jeho SSH klíče do adresáře keydir
v podobě souboru se jménem ve tvaru uzivatel.pub
a následné přidání příslušných práv v conf/gitolite.conf
.
Uživatelé a skupiny
Skupiny se od uživatelů liší v tom, že jsou uvozeny zavináčem. Výchozí skupinou je skupina @all
, zahrnující všechny uživatele. Ostatní skupiny můžete snadno nadefinovat:
@vyvojari = michal ludek jana @spravci = root admin @personal = @vyvojari @spravci
Skupina se samozřejmě může skládat z více skupin (viz definice skupiny @personal
) a uživatelé mohou patřit do různých skupin. V systému oprávnění je možné konkrétní právo přiřadit uživateli, skupině, nebo obojímu.
Systém oprávnění
Základní práva, která můžete přiřadit jednotlivým uživatelům a skupinám, mají následující podobu:
Oprávnění | Význam |
---|---|
| read-only přístup |
| právo provést |
| totéž co |
| odepřít přístup |
Příklad definice nového repozitáře tedy může vypadat takto:
repo projekt RW+ = michal @spravci RW = ludek jana R = pepa
Podstatnou změnou oproti Gitosisu není však pouze zjemnění práv, ale také možnost příslušná práva aplikovat na konkrétní větve, resp. na konkrétní reference (refs). Názorněji to bude vypadat na příkladu:
repo projekt RW master$ = michal @spravci RW refs/heads/master$ = michal @spravci
Mezi oprávněním a rovnítkem může být regulární výraz, který definuje konkrétní referenci, k níž má dotyčný daný přístup. Neuvedete-li na začátku výrazu refs/
, doplní si Gitolite interně na začátek refs/heads/
– oba zápisy oprávnění v příkladu výše jsou tedy ekvivalentní. Znalci regulárních výrazů určitě tuší, že dolar na konci značí konec řádku, tj. výše uvedený zápis povolí uživateli michal
zápis do větve master
, ale už ne do větve nazvané např. mastermind
. Pokud by tam dolar na konci nebyl, měl by právo zápisu i k větvi mastermind
. Pokud vám regulární výrazy nic neříkají, bylo by dobré se na ně podívat. Pod článkem naleznete několik odkazů, které by vám měly tuto problematiku osvětlit.
Pokud mezi oprávněním a rovnítkem nic neuvedete, bude se příslušné oprávnění vztahovat na celý repozitář se všemi větvemi.
Podobně lze zacházet i s tagy – je možné uživatelům povolit nebo nepovolit přiřazovat tagy jako takové nebo tagy v určitém tvaru.
repo projekt RW refs/tags/rc[0-9] = michal - refs/tags/rc[0-9] = ludek RW refs/tags = ludek
Zde je uživateli michal
uděleno právo vytvářet tagy ve tvaru rc[číslo]
, je tedy možné vytvořit tag rc1
, rc10
, ale také rc1a
. Uživatel ludek
má oprávnění vytvářet libovolně pojmenované tagy, ovšem s výjimkou tagů začínajících na rc[číslo]
. Budete-li zacházet s oprávněním pro odepření přístupu (mínusem), mějte na paměti, že záleží na pořadí prováděných pravidel. Kdybyste příklad výše otočili a dali prostřední řádek na konec, uživatel ludek
by mohl vytvářet jakékoliv tagy a přístup by mu nikdy odepřen nebyl.
Tolik k základům konfigurace Gitolite. Mnohé pokročilé vlastnosti Gitolite zde nezazněly, a (nejen) proto vám doporučuji podívat se na oficiální dokumentaci ke Gitolite, která je velmi podrobná a přívětivá, čtivě psaná a plná užitečných příkladů. Uživatelům Gitolite důrazně doporučuji si ji projít.
Workflow
Styl práce s Gitolite je velice podobný práci s Gitosis. Jakmile vytvoříte vhodnou půdu pro nový repozitář úpravou konfiguračních souborů, jejich commitem a nahráním (push) na server, stačí u místního repozitáře přidat vzdálený server:
git remote add origin gitolite@server.example.org:repositar.git
A následně provést push na server:
git push origin master:refs/heads/master
Tím by mělo dojít k vytvoření „master“ větve v repozitáři na serveru.
Na závěr zmíním ještě jeden tip – pokud se na server přihlásíte přes SSH, oznámí vám Gitolite, k čemu máte jaký přístup (Gitosis toto neumí):
ssh gitolite@server.example.org
hello admin, the gitolite version here is 1.5.4-2+squeeze1 (Debian)
the gitolite config gives you the following access:
R W gitolite-admin
R W projekt
@R @W testing