Gestión de repositorios git con gitosis

Dentro de un entorno de desarrollo colaborativo, como puede ser el de una empresa que quiere que sus clientes puedan consultar el código mientras se desarrolla, a menudo interesa poder tener un control de acceso tanto de lectura como de escritura tus repositorios de código. Dentro del mundo Git, Gitosis nos ofrece una forma de crear estos controles de una forma más que fácil.

Gitosis es una herramienta que nos ofrece la posibilidad de controlar el acceso a los repositorios Git, pudiendo dar el acceso de lectura, escritura o negándolo de todas todas. Esto es muy interesante cuando, como en nuestro caso, damos acceso a un cliente al código de la aplicación mientras ésta se está desarrollando (le das acceso de sólo lectura y le niegas el acceso a cualquier otro repositorio de otros proyectos). Gitosis gestiona múltiples repositorios con una sola cuenta de usuario en el servidor, utilizando claves SSH para identificar a los usuarios. Por tanto, para los usuarios en cuestión, no será necesario que tengan una cuenta de usuario en el servidor, sino que se gestionará el control de acceso de forma completamente transparente a ellos.

Bueno, basta de rollos y vamos a pasar a la acción!

Instalar Gitosis

Nota: todos los ejemplos que veréis a continuación están hechos con Ubuntu y un servidor Debian, pero en principio sirven para cualquier distribución de Linux. Gitosis está escrito en Python, así que será necesario tenerlo instalado en vuestro sistema, además del paquete python-setuptools.

En primer lugar habrá que descargar Gitosis e instalarlo en vuestro servidor. Gitosis es un software gestionado con Git, así que descargarnoslo es tan sencillo como hacer:

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

Acabada la descarga, pasemos a hacer la instalación:

cd gitosis
python setup.py install

Después de esto, deberemos crear una cuenta de usuario en el servidor para que maneje todo el tema. El usuario lo llamaremos git y como directorio propio le daremos /home/git

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

Para continuar con la instalación, hay que disponer de un certificado de usuario propio en la máquina donde desarrollaremos nuestros proyectos. Si no dispone de ninguno, crearemos uno desde esta máquina con:

ssh-keygen -t rsa

La clave pública estará en $HOME/.ssh/id_rsa.pub. Copia este archivo en el servidor donde hayas instalado Gitosis (por ejemplo en el directorio /tmp). Una vez hecho esto, ejecuta desde el servidor el comando:

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

Con ello inicializamos Gitosis con nuestra clave. Para ver si ha ido bien, debería salir en pantalla el siguiente mensaje:

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

Antes de dar por terminadas las tareas en el servidor, deberemos modificar unos permisos de un hook para asegurar su correcta ejecución:

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

Una vez hecho esto, ya habremos terminado las tareas en el servidor. Entonces, abrimos un terminal en nuestra máquina de desarrollo y ejecutamos:

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

Ahora ya tenemos todo lo necesario para trabajar con Gitosis y crear nuevos repositorios para nuestros proyectos y añadir nuevos usuarios. Haremos los cambios en el fichero de configuración, haremos el commit y el push, y entonces el Gitosis, como por arte de magia, nos creará los nuevos repositorios, modificará los permisos, etc. de forma transparente y sin mayor esfuerzo.

Vamos a ver ejemplos de esto dos: crear repositorios y añadir nuevos usuarios.

Crear de nuevos repositorios

Antes de empezar, vamos al directorio donde hemos clonado el Gitosis y damos un vistazo al archivo de configuración por defecto, gitosis.conf:

[gitosis]

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

La línea de miembros es una combinación entre vuestro nombre de usuario y el nombre de vuestra máquina. Parece fácil ver cómo se crean los nuevos repositorios, no? Pues manos a la obra.

Para crear un nuevo repositorio, sólo hay que darle permisos de escritura y hacer un primer push. Empezamos escribiendo esto en nuestro archivo de configuración:

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

Acabamos de definir un nuevo grupo llamado "big_project_team" (es un nombre identificativo y ya está), con un miembro y que tiene permiso de escritura en el repositorio "big_project".

Llegados a este punto, debéis guardar los cambios, hacer commit y push.

git commit -a -m "Dar permisos de escritura en big_project a ramon"
git push

Con esto acabamos de dar permiso de escritura, pero todavía no hemos creado el repositorio en el servidor. Lo que hay que hacer es crearlo y hacer un push:

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

# hacemos lo que queramos y luego un git add y commit

git push origin master:refs/heads/master

Una vez hecho el push, se creará el repositorio automáticamente en el servidor y ya podemos empezar a utilizarlo como si de un repositorio normal se tratara.

Añadir nuevos usuarios a proyectos

Para terminar ya con este tema, sólo nos queda ver cómo podemos hacer para añadir nuevos usuarios a proyectos/repositorios, y darles diferentes niveles de acceso.

Queremos añadir un usuario y partimos de que disponemos de su clave pública que nos ha hecho llegar (por ejemplo, marta.pub y nombre marta@laptop). Entonces sólo hay que añadir la llave en el Gitosis y configurar el acceso:

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

Ahora hay que darle acceso, por ejemplo, al proyecto que hemos creado en el apartado anterior. Abrimos el archivo gitosis.conf y modificamos la sección pertinente:

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

Una vez hecho esto, sólo hay que hacer el commit y el push pertinente:

git commit -a -m "Dar permiso a Marta de escritura en el proyecto big_project"
git push

Y ya podrá hacer el clonado del repositorio desde su máquina ejecutando el comando:

git clone git@VUESTRO_SERVIDOR:big_project.git

Llegados a este punto, sólo me queda decir que lo probéis y si tenéis alguna duda y/o cuestión, dejad un comentario y así entre todos iremos aprendiendo. Yo en su momento me basé en este artículo para aprender a configurarlo y lo he seguido para confeccionar esta entrada.