Gestió de repositoris git amb gitosis

Dins d'un entorn de desenvolupament col·laboratiu, com pot ser el d'una empresa que vol que els seus clients puguin consultar el codi mentre es desenvolupa, sovint interessa poder tenir un control d'accés tant de lectura com d'escriptura als teus repositoris de codi. Dins del món git, Gitosis ens ofereix una forma de crear aquests controls d'una forma més que fàcil.

Gitosis és una eina que ens ofereix la possibilitat de controlar l'accés als nostres repositoris Git, podent donar l'accés de lectura, escriptura o bé negant-ne l'accés. Això és molt interessant quan, com és el nostre cas, dones accés a un client al codi de l'aplicació mentre aquesta s'està desenvolupant (li dones accés només de lectura i li negues l'accés a qualsevol altre repositori d'altres projectes). Gitosis gestiona múltiples repositoris amb un sol compte d'usuari al servidor, utilitzant claus SSH per a identificar als usuaris. Per tant, els usuaris en qüestió, no caldrà que tinguin cap compte d'usuari al servidor, sinó que es gestionarà el control d'accés de forma completament transparent a ells.

Prou de xerrameca i passem a l'acció!

Instal·lació de Gitosis

Nota: tots els exemples que veureu a continuació estan fets amb Ubuntu i un servidor Debian, però en principi serveixen per a qualsevol distribució de Linux. Gitosis està escrit en Python, així que caldrà que el tingueu instal·lat al vostre sistema, a més a més del paquet python-setuptools.

Primer de tot caldrà descarregar-vos el Gitosis i instal·lar-lo al vostre servidor. Gitosis és un programari gestionat amb git, així que descarregar-nos-el és tan senzill com fer:

git clone git://eagain.net/gitosis.git

Una vegada descarregat, podem passar a la instal·lació:

cd gitosis
python setup.py install

Després d'això, el que ens caldrà és crear un compte d'usuari al servidor perquè manegui tot el tema. L'usuari l'anomenarem git i com a directori propi li donarem /home/git

sudo adduser --system --shell /bin/sh --gecos 'git version control' --group --disabled-password --home /home/git git

Per continuar amb la instal·lació, cal disposar d'un certificat d'usuari propi a la màquina on desenvoluparem els nostres projectes. Si no en disposeu de cap, creeu-ne un des d'aquesta màquina amb:

ssh-keygen -t rsa

La clau pública estarà a $HOME/.ssh/id_rsa.pub. Copieu aquest fitxer al servidor on heu instal·lat el gitosis (per exemple al directori /tmp). Una vegada fet això, executeu des del servidor la comanda:

sudo -H -u git gitosis-init < /tmp/id_rsa.pub

Amb això inicialitzarem el gitosis amb la nostra clau. Per veure si ha anat bé, hauria de sortir a pantalla el seg:uent missatge:

Initialized empty Git repository in ./
Initialized empty Git repository in ./

Abans de donar per enllestides les tasques al servidor, modifiquem uns permisos d'un hook per assegurar la seva correcta execució:

sudo chmod 755 /home/git/repositories/gitosis-admin.git/hooks/post-update

Una vegada fet això, ja haurem acabat les tasques al servidor. Llavors, aneu a un terminal a la vostra màquina de desenvolupament i executeu:

git clone git@EL_VOSTRE_SERVIDOR:gitosis-admin.git
cd gitosis-admin

Ara ja tenim tot el necessari per a treballar amb gitosis i crear nous repositoris pels nostres projectes i afegir nous usuaris. Farem els canvis al fitxer de configuració, farem el commit i el push, i llavors el gitosis, com per art de màgia, ens crearà els nous repositoris, modificarà els permisos, etc. de forma transparent i sense més esforç.

Anem a veure exemples d'això dos: crear repositoris i afegir nous usuaris.

Creació de nous repositoris

Abans de començar, anem al directori on hem clonat el gitosis i donem-li un cop d'ull al fitxer de configuració per defecte, gitosis.conf:

[gitosis]

[group gitosis-admin]
writable = gitosis-admin
members = ramon@ramon-laptop

La línia de membres és una combinació entre el vostre nom d'usuari i el nom de la vostra màquina. Sembla fàcil veure com es creen els nous repositoris, no? Doncs som-hi.

Per crear un nou repositori, només cal donar-li permisos d'escriptura i fer un primer push. Comencem escrivint això al nostre fitxer de configuració:

[group big_project_team]
members = ramon@ramon-laptop
writable = big_project

Acabem de definir un nou grup anomenat "big_project_team"  (és un nom identificatiu i ja està), amb un membre i que té permís d'escriptura al repositori "big_project".

Deseu el canvi, feu commit i push.

git commit -a -m "Donar permís d'escriptura a big_project al ramon"
git push

Ara hem donar permís d'escriptura, però encara no hem creat el repositori. El que cal fer és crear-lo i fer un push:

mkdir big_project
cd big_project
git init
git remote add origin git@EL_VOSTRE_SERVIDOR:big_project.git

# feu el que vulgueu i llavors git add i commit

git push origin master:refs/heads/master

Una vegada fet el push, es crearà el repositori automàticament al servidor i ja el podeu començar a fer servir com si d'un repositori normal es tractés.

Afegint nous usuaris a projectes

Per acabar ja amb aquest tema, només ens queda veure com podem fer per afegir nous usuaris a projectes/repositoris, i donar-lis diferents nivells d'accés.

Volem afegir un usuari i partim del fet que disposem de la seva clau pública que ens ha fet arribar ( per exemple, marta.pub i nom marta@laptop). Llavors només cal afegir la clau al gitosis i configurar-ne l'accés:

cd gitosis-admin
cp /tmp/marta.pub keydir/
git add keydir/marta.pub

Ara cal donar-li accés, per exemple, al projecte que ja hem creat. Obrim el fitxer gitosis.conf i en modifiquem la secció pertinent:

[group big_project_team]
members = ramon@ramon-laptop marta@laptop
writable = big_project

Una vegada fet això, només cal fer-ne el commit i el push pertinent:

git commit -a -m "Donem permís a la Marta per escriure al projecte big_project"
git push

I ja podrà fer el clonat del repositori des de la seva màquina executant la comanda:

git clone git@EL_VOSTRE_SERVIDOR:big_project.git

Arribats a aquest punt, només em queda dir-vos que ho proveu i si teniu cap dubte i/o qüestió, deixeu un comentari i així entre tots anirem aprenent-ne. Jo en el seu moment em vaig basar en aquest article per aprendre a configurar-ho i l'he seguit per confeccionar aquesta entrada.