Servidor Subversion y svn+ssh en Mac OS

30 jun
30 junio, 2011

Siendo desarrollador y utilizando varios equipos, se hace prácticamente imprescindible montar algún sistema de control de versiones a nivel doméstico para poder trabajar con comodidad estés donde estés y con la seguridad de estar utilizando la última copia de trabajo.

Aunque existen más alternativas (últimamente se está poniendo bastante de moda Bazaar), quizá una de las más extendidas sea Subversion (SVN). En este caso es por la que he optado, principalmente porque estoy acostumbrado a utilizarlo y porque con Mac OS X ya vienen incluidos tanto el servidor como el cliente de SVN.

Inicialmente utilizaba el modo ‘daemon’ del servidor SVN, que se arranca simplemente con:

$ svnserve -d -r <directorio-raíz-de-los-repositorios>

De esta forma el servidor queda arrancado como un demonio sirviendo los repositorios que tengamos en la ruta que hemos especificado. Inicialmente fue la opción que utilizaba, creando incluso un StartupItem para que el servidor se iniciase cada vez que se arrancase el equipo.

Utilizando el servidor en este modo, podríamos acceder a un repositorio a través de:

$ svn co svn://<host>/<nombre-repositorio>

Para toda la gestión de permisos, existen una serie de ficheros en los que podemos configurar la autenticación, desde usar un fichero de pares usuario/contraseña hasta utilizar SASL. No profundizaré por aquí, puesto que este post va dedicado en parte a evitar todo eso.

Para evitar toda esa configuración en los repositorios de manera individual a través de ficheros y demás (y un poco también porque de esta otra forma es como está montado en el trabajo, jeje), he optado por cambiar de protocolo y utilizar también en casa Subversion a través de svn+ssh aprovechando que ya tengo el ssh perfectamente configurado para ir saltando de un equipo a otro.

Lo cierto es que con svn+ssh lo que realmente sucede es que se establece una conexión mediante SSH y después se arranca una instancia, por decirlo de alguna manera, ‘dedicada’ del svnserve para atender la petición en cuestión. De esta manera, un usuario que se autentique en el equipo por SSH (y que tenga permiso en las carpetas correspondientes), podrá acceder a los repositorios.

Hay una leve diferencia respecto a la utilización de svn+ssh:// frente a svn:// y es que, mientras que svn:// es gestionado por el servidor SVN, svn+ssh:// es gestionado, como ya he dicho antes, a través de una conexión SSH. Por lo tanto, mientras que antes hacíamos:

$ svn co svn://<host>/<nombre-repositorio>

Utilizando svn+ssh tendremos que hacer:

$ svn co svn://<host>/<ruta-absoluta-al-repositorio>

Estamos accediendo mediante SSH y lo que antes especificábamos con la opción -r de svnserve en este caso no está presente y es necesario especificar la ruta completa.

Por motivos de comodidad pero sobre todo de seguridad, no es conveniente que en las URIs de los repositorios aparezca la ruta completa. Para solucionar esto y, además, hacer que la forma de trabajar con svn+ssh:// sea exactamente igual que con svn:// haremos un pequeño truco.

Puesto que lo que está pasando es que tras la autenticación por SSH se ejecuta svnserve, lo que podemos hacer es modificar el ejecutable de manera que haga lo que nosotros queremos. Y me explico.

Para empezar le cambiamos el nombre al ejecutable de svnserve, que estará en /usr/bin

$ sudo mv /usr/bin/svnserve /usr/bin/svnserve.bin

Y a continuación, creamos un fichero /usr/bin/svnserve con el siguiente contenido, en el que especificaremos el comportamiento:

#!/bin/bash
/usr/bin/svnserve.bin -t -r /ruta/al/directorio/de/repositorios

Sólo nos falta guardar el fichero y darle permisos de ejecución:

$ sudo chmod 755 /usr/bin/svnserve

Con esto lo que conseguimos es que el ‘svnserve’ que se ejecutará con el svn+ssh será ese script que acabamos de escribir y que arranca el svnserve en modo túnel pero además especifica el directorio raíz de repositorios. De esta forma ya podremos hacer:

$ svn co svn+ssh://<host>/<nombre-repositorio>

0 replies

Leave a Reply

Want to join the discussion?
Feel free to contribute!

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *

Puedes usar las siguientes etiquetas y atributos HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>