Git para Redmine con Smart HTTP

23 Feb

Siguiendo con Redmine, esta vez traemos cómo crear un repositorio Git para uno de nuestros proyectos y cómo acceder los repositorios desde Redmine, además explicaremos cómo acceder a los repositorios a través de Apache de una forma segura.

Cada vez que quisiéramos trabajar un nuevo proyecto con Git es necesario inicializar un nuevo repositorio, independiente de la forma que usemos para acceder a dicho repositorio. Con respecto al acceso al repositorio, algunas de las formas son:

  • Iniciar el git-daemon, es la forma más simple, se abre un puerto TCP que por defecto es el 9418 y se puede obtener el código mediante un comando como el siguiente:
null   
git clone git://tu-ip/repo dir_repo

el inconveniente es que es solo lectura, entonces si se clona el repositorio para hacer cambios y luego subirlos, esta opción no sirve.

  • Una segunda opción es acceder a través de SSH, es una forma segura y muy extendida actualmente, lo que nosotros hicimos una vez, fue crear un usuario para git, y todos subíamos con esa contraseña, es una forma válida, pero no es muy útil si hay un equipo grande de personas haciendo cambios. Lo otro es tener un usuario para cada persona del equipo.
  • Una tercera opción es a través del servidor Web sobre WebDAV, sin embargo hay problemas de rendimiento y la integridad del repositorio está a merced de todos los clientes que accedan al repositorio, entre otros problemas.
  • Otra opción que es la que queremos mostrar, necesita de una versión de git igual o superior a 1.6.6, a partir de la cual soporta Smart HTTP; una explicación de lo que es, la podemos encontrar en http://progit.org/2010/03/04/smart-http.html.

Lo inicial es instalar git en caso de no tenerlo instalado aunque es probable que el sistema lo haga por defecto al instalar el Sistema Operativo, en nuestro caso seguiremos trabajando sobre Fedora, que es el sistema donde describimos la instalación de Redmine:

null   
sudo yum -y install git

Vamos a crear los repositorios en el directorio /var/cache/, creamos los directorios repos/git, puedes usar los nombres y el lugar que mejor te parezca:

null   
cd /var/cache
sudo mkdir -p repos/git
sudo chown apache\: -R repos

Es necesario aplicar un parche para el soporte del protocolo Smart HTTP de Git, este agrega una nueva directiva de Apache llamada RedmineGitSmartHttp y habilita el nuevo modo de operación. Revisa http://www.redmine.org/issues/4905 para que evalúes la mejor opción, tampoco es una mala idea que respaldes el archivo Redmine.pm antes de aplicar el parche:

null   
cd /opt/redmine-1.1/extra/svn
sudo wget http://www.redmine.org/attachments/download/5092/LeeF-Redmine.pm.patch
sudo patch -p1 < LeeF-Redmine.pm.patch

Ahora copiamos el archivo Redmine.pm después de parcheado como sigue:

null   
sudo cp Redmine.pm /usr/lib/perl5/Apache2/

o si es un sistema con arquitectura de 64 bits:

null   
sudo cp Redmine.pm /usr/lib64/perl5/Apache2/

Ahora editamos el archivo de configuración de Apache /etc/httpd/conf/httpd.conf y anexamos lo siguiente:

null   
SetEnv GIT_PROJECT_ROOT /var/cache/repos/git
SetEnv GIT_HTTP_EXPORT_ALL
ScriptAlias /git/ /usr/libexec/git-core/git-http-backend/
 
PerlLoadModule Apache2::Redmine
 
<Location /git>
  RedmineGitSmartHttp yes
 
  Order deny,allow
  Allow from all
 
  PerlAccessHandler Apache::Authn::Redmine::access_handler
  PerlAuthenHandler Apache::Authn::Redmine::authen_handler
  AuthType Basic
  AuthName "Repositorio Git para Redmine"
  Require valid-user
 
  RedmineDSN "DBI:mysql:database=redmine;host=localhost"
  RedmineDbUser "redmine"
  RedmineDbPass "password"
</Location>

Como puedes ver, nos conectamos a la Base de Datos de Redmine, esto nos permite usar las mismas credenciales de acceso a Redmine para poder subir archivos al repositorio (ya mostraremos cuándo más adelante). Reiniciamos el servicio web:

null   
sudo service httpd restart

Y eso debería ser suficiente, pero si obtenemos un error diciendo: “Can’t locate Digest/SHA1.pm …” el servidor web no arrancará y debemos proceder así:

null   
sudo cpan -i Digest::SHA1

e intentamos reiniciar el servidor web nuevamente.

Ahora vamos a crear un repositorio para un proyecto en Redmine para probar lo que acabamos de configurar. Creamos un proyecto sobre Redmine, en nuestro caso lo llamaremos “Mi Proyecto” y en el campo identificador usaremos “miproyecto”, este campo es importante pues el nombre del identificador debe ser el nombre del directorio que contenga el repositorio:

null   
cd /var/cache/repos/git
sudo mkdir miproyecto
cd miproyecto
sudo git init
sudo git config --bool core.bare true
chown apache\: -R .

Ahora en el proyecto, vamos a “Configuración > Repositorio” sobre Redmine, en “SCM” escogemos Git  y en “Path to .git directory” escribimos /var/cache/repos/miproyecto/.git y guardamos, esto es lo que se necesita para conectar Redmine con el repositorio, pero aun no hay archivos en dicho repositorio, así que obtendremos un Error 404 al entrar a la pestaña “Repositorio” ubicada al lado de “Configuración”.

Para actualizar tu repositorio desde un equipo remoto, debes crear el mismo proyecto en el equipo remoto y subir las actualizaciones cada vez que consideres necesario:

null   
git clone http://napellido@tu-ip/git/miproyecto miproyecto

Esto inicializa un nuevo repositorio en el equipo remoto, si ya tienes archivos en el servidor se descargarán, sino te dirá que clonaste un proyecto vacío, napellido se supone que es tu usuario para conectarte a Redmine, a continuación deberás ingresar la contraseña.

Ahora sólo basta escribir un par de comandos y empezar a programar y actualizar nuestro repositorio:

null   
cd miproyecto
git config --global user.name "Nombre Apellido"
git config --global user.email "napellido@blogcito.info"

Esto es para que lo que se suba desde tu máquina aparezca colocado por vos.

null   
touch README
git add .
git commit -m "Comentario"
git push origin master

Hemos subido el archivo README con git push, en adelante bastará con usar “git push” solamente y no “git push origin master”, en este caso también se debe ingresar la contraseña.

El que “git push” suba los archivos satisfactoriamente depende de los permisos del repositorio, no olvides asignarle el directorio al usuario apache, al momento de crear el repositorio debe ser bare (sudo git config –bool core.bare), es decir, que es remoto, no local.

Y finalmente también depende de que hayas colocado la línea ”RedmineGitSmartHttp yes” en el archivo de configuración de Apache.

Esta pequeña guía pretende ser un simple manual de instalación, si quieres entender a fondo las razones para muchas de las cosas mencionadas, te invitamos a que mires los enlaces a continuación:

http://xmleye.wordpress.com/2010/02/24/smart-http-de-git-y-redmine/
http://permalink.gmane.org/gmane.comp.version-control.git/140453
http://www.redmine.org/projects/redmine/wiki/HowTo_configure_Redmine_for_advanced_git_integration
http://javierav.com/2009-09-crear-un-repositorio-git-remoto-a-traves-de-ssh.html
http://www.redmine.org/issues/4905

Anotaciones

Agregamos estas notas a partir de la interacción que hemos tenido con el sistema tal y como describe esta instalación, nos hemos encontrado algunas veces con que no podemos clonar un repositorio o que no podemos actualizar después de un commit (PUSH).

  • Lo primero que debemos recordar es que en la configuración de Apache nos conectamos a la Base de Datos de Redmine.
  • Si creamos un repositorio en un directorio cuyo nombre no es el identificador de ningún proyecto creado en Redmine, entonces no lo podremos clonar.
  • Si el proyecto es público podemos clonarlo sin autenticarnos, de lo contrario debemos usar nuestras credenciales de Redmine para clonarlo, no necesitamos estar asociados al proyecto.
  • Si necesitamos hacer push sobre los proyectos, debemos tener perfil como mínimo de Desarrollador, si tenemos el perfil de Jefe de Proyecto también podremos actualizar el repositorio, de lo contrario no será posible.
  • Nunca olvidemos que los directorios de los repositorios deben pertenecer al usuario que corre Apache, en el caso de Fedora, este es apache.

Acerca del autor

Christian Gutierrez ha escrito 22 publicaciones en este blog.

Theory is when you know something, but it doesn't work. Practice is when something works, but you don't know why. Programmers combine theory and practice: Nothing works and they don't know why. – Anonymous Developer

No hay comentarios aún.

Deja un comentario