Gitolite: pořiďte si vlastní GitHub

Petr Krčmář 2. 7. 2012

Git je velmi užitečný a neuvěřitelně mocný správce revizí, který využívají mnohé velké projekty. Možná jste i vy uvažovali, že si pořídíte vlastní gitovský server pro mnoho uživatelů, ale zarazili jste se u toho, že byste jim museli vytvořit SSH účty a pustit je do shellu. Naštěstí to s Gitolite není nutné.

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:

widgety

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í.

Našli jste v článku chybu?
DigiZone.cz: Skylink Samsung EVO-S příští týden

Skylink Samsung EVO-S příští týden

Vitalia.cz: dTest odhalil ten nejlepší kečup

dTest odhalil ten nejlepší kečup

DigiZone.cz: Rapl: seriál, který vás smíří s ČT

Rapl: seriál, který vás smíří s ČT

120na80.cz: Co je padesátkrát sladší než cukr?

Co je padesátkrát sladší než cukr?

Lupa.cz: Hackeři mají data z půlmiliardy účtů Yahoo

Hackeři mají data z půlmiliardy účtů Yahoo

Lupa.cz: Aukro.cz mění majitele. Vrací se do českých rukou

Aukro.cz mění majitele. Vrací se do českých rukou

DigiZone.cz: Numan Two: rozhlasový přijímač s CD

Numan Two: rozhlasový přijímač s CD

Podnikatel.cz: Znáte už 5 novinek k #EET

Znáte už 5 novinek k #EET

Podnikatel.cz: Byla finanční manažerka, teď cvičí jógu

Byla finanční manažerka, teď cvičí jógu

Vitalia.cz: Test dětských svačinek: Tyhle ne!

Test dětských svačinek: Tyhle ne!

Podnikatel.cz: Dva měsíce na EET. Budou stačit?

Dva měsíce na EET. Budou stačit?

Vitalia.cz: Muž, který miluje příliš. Ženám neimponuje

Muž, který miluje příliš. Ženám neimponuje

DigiZone.cz: Parlamentní listy: kde končí PR...

Parlamentní listy: kde končí PR...

Podnikatel.cz: Instalatér, malíř a elektrikář. "Vymřou"?

Instalatér, malíř a elektrikář. "Vymřou"?

Vitalia.cz: Když všichni seli řepku, on vsadil na dýně

Když všichni seli řepku, on vsadil na dýně

Vitalia.cz: Jsou vegani a vyrábějí nemléko

Jsou vegani a vyrábějí nemléko

Vitalia.cz: Kterou dýni můžete jíst za syrova?

Kterou dýni můžete jíst za syrova?

DigiZone.cz: Mordparta: trochu podchlazený 87. revír

Mordparta: trochu podchlazený 87. revír

120na80.cz: Hrbatá prsa aneb mýty o implantátech

Hrbatá prsa aneb mýty o implantátech

DigiZone.cz: Ginx TV: pořad o počítačových hráčích

Ginx TV: pořad o počítačových hráčích