O nástroji Gitolite se začalo více mluvit poté, co na něj přešel Kernel.org. Prvotním impulzem k přechodu bylo napadení serveru, po kterém se administrátoři rozhodli věci předělat – sebrali uživatelům plnohodnotné systémové účty a pustili je jen do Gitu. Použili k tomu právě Gitolite.
K čemu to je?
Gitolite je nástroj pro hostování gitovských repositářů na jednom serveru. Prakticky vám umožňuje na vašem serveru provozovat takový malý GitHub. Zařídí za vás vše potřebné, vytváří automaticky potřebné repositáře, přiděluje práva jednotlivým uživatelům a drží ochrannou ruku nad jejich účty.
Jak už bylo naznačeno výše, pro použití Gitolite není potřeba mít na serveru fyzické uživatelské účty pro každého, komu chcete dát přístup do některého repositáře. Všichni uživatelé využívají jeden společný účet a o rozlišení jednotlivých práv se pak stará logika Gitolite. Ta zajistí, aby každý příchozí uživatel pracoval jen se svými daty.
Jak to přesně funguje?
Na serveru je třeba mít SSH přístup a vytvořit nového uživatele, který bude sloužit jako „brána“ ke Git repositářům. Dejme tomu, že tohoto uživatele nazveme git
. V jeho domovském adresáři budou uloženy jak soubory Gitolite, tak i všechny konfigurační soubory a samotné repositáře všech projektů, které budeme hostovat.
Uživatelé se k repositáři (tedy k našemu účtu git) hlásí pomocí SSH klíčů. Pokud netušíte, co to je, přečtěte si článek Jak se přihlašovat na SSH bez zadávání hesla. K účtu git
tedy bude mít přístup třeba stovka reálných lidí pomocí svých klíčů, ale nikdo z nich se nedostane k shellu. K tomuto společnému účtu je možné přistupovat jen pomocí Gitu a na druhé straně bude odpovídat Gitolite. Ten se tváří jako jakási „Git reverzní proxy“ a řeší virtuální oddělení prostoru pro jednotlivé uživatele, jejich práva a podobné záležitosti.
Jak už bylo řečeno, celý Gitolite leží v uživatelském adresáři. Za chvíli si ukážeme, jak ho tam dostaneme. Technicky vzato se jedná o sadu perlovských skriptů, kterou si do domovského adresáře stáhneme, jak jinak než z Gitu. Není tedy třeba jej nijak do systému doinstalovávat, a tak nemusíme mít na serveru ani roota. Stáváme se však administrátorem gitovského repositáře.
Co budeme potřebovat?
Musíme vědět, jak funguje SSH (doporučuji seriál Pokročilé vlastnosti OpenSSH) a přihlašování pomocí klíčů. Také musíme samozřejmě ovládat Git. Těžko bychom mohli spravovat repositářový server bez (alespoň základní) znalosti tohoto verzovacího systému (tady zase doporučuji seriál Distribuovaná správa revizí s GIT nebo knihu Pro Git).
Na serveru pak budeme potřebovat nějaký unixový systém, Git alespoň verze 1.6.6, Perl alespoň 5.8.8, SSH přístup a uživatelský účet jménem git
(použít ovšem můžeme libovolné jméno). Uživatel pak bude potřebovat vlastního SSH klienta a také Git. Důležité je, aby byl schopen používat k přihlašování na server klíče.
Samotná instalace
Instalace probíhá stažením (respektive naklonováním) gitovského repositáře samotného Gitolite. Prostě si z GitHubu pořídíme kopii všeho, co nám tam autor nechal:
$ git clone git://github.com/sitaramc/gitolite
Ve vašem adresáři vznikl podadresář gitolite
, který obsahuje vše potřebné. Pro nás je teď nejdůležitější soubor src/gitolite
. Ten potřebujeme mít ideálně někde v $PATH
, abychom jej mohli jednoduše spouštět. Instalační skript předpokládá, že máte v domovském adresáři podadresář bin
, do kterého vede cesta. Vše za vás připraví:
$ gitolite/install -ln
Teď budeme potřebovat SSH klíč člověka, který bude správcem gitolite repositářů. Pravděpodobně to bude náš klíč, ovšem pozor: nesmí to být klíč, který má shellovský přístup do účtu git
. S tím nás Gitolite pošle k šípku. Musíme si tedy vytvořit další klíč, který použijeme jen pro přístup do Gitu (Gitolite). Ten pak předhodíme Gitolite jako administrační klíč:
$ gitolite setup -pk petr.pub
Ideální samozřejmě je, když se přímo k účtu git
nemůže přihlásit nikdo. Pak nemůže dojít ke konfliktu klíčů a nemusíme nic podobného řešit. Lepší tedy hned na začátku bude, když se do účtu přihlásíme z jiného účtu pomocí su
.
A to je vše. Teď se můžeme odhlásit ze shellu, už sem nikdy nebudeme muset. Tedy pokud nedojde k nějaké nouzové situaci, třeba že ztratíme svůj administrátorský SSH klíč. Pak si ho výše uvedeným příkazem budeme muset změnit. Všechno ostatní ovládání probíhá přes Git z naší lokální pracovní stanice.
Poznámka: V Debianu (a jistě i v jiných distribucích) je k dispozici balíček Gitolite. Jeho instalaci vlastně přeskočíme úvodní klonování repositáře Gitolite. Instalaci do uživatelského adresáře pak provádíme pomocí utility gl-setup
. S tímto postupem ale nemám zkušenosti.
Jeden Git vládne všem
Co by to bylo za gitovskou službu, která by se neovládala přes Git. Celá filosofie Gitolite využívá naplno výhod samotného Gitu. Veškerou konfiguraci a administraci tak provádíme ve svém lokálním repositáři a pushujeme ji na svůj server. Je to velmi elegantní a hlavně to umožňuje skutečně zrušit shellovský přístup k uživateli git
.
Nejprve si musíme ze svého serveru naklonovat administrátorský repositář:
$ git clone git@gitserver.firma.cz:gitolite-admin
Teď můžete na serveru vytvářet další gitovské uživatele, vytvářet pro ně nové repositáře nebo přidělovat práva. Většina práce (kromě tvorby uživatelů) se provádí v souboru conf/gitolite.conf
. Je to poměrně jednoduchý textový soubor, ve kterém jsou konfigurační volby a jejich nastavení oddělena rovnítkem.
Uvedeme si konkrétní příklad. Nadefinujeme si uživatelské skupiny „vývojáři“ a „testeři“, vytvoříme jim projekty „projekt51“ a „zizkov“ a přidělíme nějaká práva. Do souboru tedy přidáme následující řádky:
@vyvojari = zdenek martin jakub mirek @testeri = jana ivan vitek repo projekt51 zizkov RW+ = michal RW = @vyvojari R = @testeri
Pár užitečných poznámek:
- skupina může být skupinou uživatelů nebo projektů, funguje to pro obojí
- existuje speciální skupina @all, která označuje všechny uživatele i všechny projekty
- existují celkem čtyři skupiny práv: R jen pro čtení, RW čtení i zápis, RW+ přidá mazání, – pro zákaz přístupu
Nezapomeňte po těchto změnách vždy vše commitnout a nakonec i pushnout na server. Tím se spustí příslušné skripty a změny se projeví.
$ git add gitolite.conf $ git commit $ git push
Důležité je také vytváření nových Gitolite uživatelů. Dejme tomu, že k nám přišel nový kolega Pavel, který se má zapojit do projektu jako vývojář. Pavel nám musí dodat svůj veřejný SSH klíč, který si na své pracovní stanici zkopírujeme v administrátorském repositáři do podadresáře keydir
a pojmenujeme ho pavel.pub
. Pak jej klasicky přidáme do Gitu a commitneme změnu:
$ git add pavel.pub $ git commit $ git push
Tím se nám automaticky Pavel přidal mezi uživatele. Teď už mu jen přidělíme nějaká práva k repositářům (asi ho přidáme do skupiny „vývojáři“) a opět commitneme soubor gitolite.conf
a můžeme obě změny pushnout na server:
$ git add gitolite.conf $ git commit $ git push
Pavel se teď se svým SSH klíčem dostane k oběma projektům a může si je ze svého pracovního počítače jeden z nich naklonovat a začít na něm pracovat:
pavel$ git clone git@gitserver.firma.cz:projekt51
Důležité je, že mu nefunguje přístup na shell. Když se pokusí připojit, dostane se ale k důležitým informacím o tom, jaká verze Gitolite na serveru běží a hlavně ke kterým repositářům má jaká práva.
pavel$ ssh git@gitserver.firma.cz hello pavel, this is gitolite v3.03-42-g53543ee running on git 1.7.10 the gitolite config gives you the following access: RW projekt51 RW zizkov Connection to gitserver.firma.cz closed.
Další informace
Podrobná dokumentace je dostupná na webu projektu kde jinde než na GitHubu. Tam jsou dostupné také různé příklady, celý gitovský repositář vývoje a další podrobnosti. Dočtete se tam například, jak migrovat celý Gitolite nebo jak do něj přidat už existující gitovský repositář. Hezké gitění.