Víceuživatelský Git server s Gitolite

Správa linuxového serveru: Víceuživatelský Git server s Gitolite

Minulý díl představil nástroj Gitosis, který umí zprostředkovat víceuživatelský přístup k centralizovanému Git repozitáři. Gitolite pracuje podobně jako Gitosis, avšak umožňuje ještě jemnější pravidla přístupu. Více se dozvíte v článku.

Ú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

R

read-only přístup

RW

právo provést push do existující větve a vytvořit novou větev

RW+

totéž co RW, avšak navíc právo přepisovat, resp. ničit (push -f)

-

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 rc1rc10, 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