Instalación de un servidor de subversion por Juanda Rodríguez


Publicado el dom 15 octubre 2017 por Juanda Rodríguez
Actualizado el mar 05 diciembre 2017 por Juanda Rodríguez
Categoría: tutoriales

Etiquetas: subversion tutorial http control versiones


Dificilmente concibo un proyecto de desarrollo de software con cierta complejidad, incluso aunque solo participe una persona, que tenga éxito sin utilizar algún sistema de control de versiones. Especialmente si el software llega a una versión estable en la que, con toda seguridad, habrá que corregir bugs y, además, se pretende desarrollar una nueva versión mientras la versión estable está en uso.

Por ello, el sistema de control de versiones es una herramienta imprescindible y básica en el toolbox de cualquier desarrollador de software.

Cierto es que "pillarle el rollo" a estos sistemas no es inmediato y suele suponer una barrera importante para el desarrollador novel. Pero todo el tiempo que se invierta en su conocimiento y en adquirir soltura con ellos bien utilizado está. No quepa duda de que se rentabilizará a la larga.

Subversion fué uno de los primeros sistemas de control de versiones open source y ha sido utilizado en muchos proyectos conocidísimos en el mundo del open source y el free software:

  • Apache Software Foundation
  • Django
  • Free Pascal
  • FreeBSD

Son algunos de ellos.

En este tutorial vamos a mostrar como instalar un completo servidor de subversion en una máquina con GNU Linux Ubuntu 16.04.

A un repositorio de subversion se puede acceder de 3 formas:

  1. Directamente a través del sistema de ficheros de la misma máquina. No adecuada para trabajar en equipo.
  2. Usando el demonio svnserve que usa un protocolo propio de subversion.
  3. Usando WebDAV con apache que es una extensión de HTTP que permite usar un servidor web como servidor de ficheros.

Veremos la 3ª forma de acceso ya que es muy sencilla de desplegar y mantener al utilizar un servicio muy conocido y ubicuo como es HTTP con apache y la extensión WebDAV. Además, al exponer el servicio en el puerto 80, con lo que se evitan problemas con los cortafuegos perimetrales, ya que el puerto 80 (o 443 si se usa servidor seguro), se evitan problemas con los cortafuegos perimetrales ya que esos puertos están generalmente abiertos en cualquier infraestructura. Además ofrece una manera directa de navegar por los repositorios utilizando cualquier navegador web.

La instalación que describimos es para realizarla en un servidor con GNU Linux Ubuntu 16.04. No obstante sigue siendo válida para cualquier otra distribución de GNU Linux sin más que cambiar las instrucciones de instalación apt-get por las correspondientes para la gestión de paquetes de la distribución que se use (yum para CentOS o Fedora, por ejemplo).

Comenzamos instalando el servidor web apache, subversion y el módulo subversion de apache, que en cualquier distribución de GNU Linux se encuentran como paquetes instalables.

apt-get install apache2
apt-get install subversion
apt-get install libapache2-svn

El módulo libapache2-svn es que el hace posible acceder a los repositorios de subversion a través de WebDAV.

Ahora creamos el grupo subversion y añadimos el usuario www-data que es con el que se ejecuta el servicio apache, al grupo subversion.

addgroup subversion
adduser www-data subversion

y editamos el fichero /etc/apache2/mods-available/dav_svn.conf para configurar el directorio donde se alojarán los repositorios de subversion y para proteger el acceso mediante autoriación básica HTTP. El fichero de usuarios con sus password también se indica en este fichero.

<Location /svn>
  DAV svn
  SVNParentPath /var/lib/svn
  SVNListParentPath On
  AuthType Basic
  AuthName "Subversion Repository"
  AuthUserFile /etc/apache2/dav_svn.passwd
  Require valid-user
</Location>

Y ya lo tenemos todo, solo nos faltan los usuarios que tendrán acceso a los repositorios y algún repositorio para trabajar.

La creación de usuarios se hace con la herramienta estándar de apache htpasspwd:

htpasswd -c /etc/apache2/dav_svn.passwd juanda

Y la creación de repositorios con la herramienta svnadmin. Es importante que el usuario www-data tenga permisos de escritura sobre el repositorio para que los usuarios puedan enviar sus cambios y estos sean guardados en el repositorio.

svnadmin create /var/lib/svn/prueba
chown -R www-data /var/lib/svn/prueba

Y, por lo pronto solo el usuario juanda podrá comenzar a usar el servidor de subversion.

Por lo pronto todos los usuarios que se creen con htpasswd tendrán acceso a todos los repositorio. Pero podemos afinar esto un poco más y controlar el acceso por directorio. Para ello se usa el módulo de apache authz_svn, que lo hemos instalado con las instrucciones anteriores. Simplemente tenemos que configurarlo adecuadamente. Esto se hace sin más que añadir al fichero de configuración /etc/apache2/mods-available/dav_svn.conf, la línea AuthzSVNAccessFile /etc/apache2/auth_svn:

<Location /svn>
    DAV svn
    SVNParentPath /var/lib/svn
    SVNListParentPath On
    AuthType Basic
    AuthName "Subversion Repository"
    AuthUserFile /etc/apache2/dav_svn.passwd
    AuthzSVNAccessFile /etc/apache2/auth_svn
    Require valid-user
  </Location>

En dicha línea se hace referencia a un fichero que es el que contendrá las reglas de acceso a los directorios. Este archivo tiene la siguiente pinta:

[/]
* = r

[nombre_repo_1:/]
juanda = rw
jara = r

[nombre_repo_2:/trunk]
juanda = rw

No vamos a entrar a explicar con detalle la sintaxis de este fichero, puedes consultarla aquí. Pero como puedes ver es bastante intuitiva. El fichero de más arriba dice que todos los usuarios tienen acceso de lectura a todos los repositorios, que sobre el repositorio completo nombre_repo_1, juanda puede escribir y leer y jara solo leer. Y que sobre el directorio trunk del repositorio nombre_repo_2, juanda puede leer y escribir y los demás solo leer. En realidad la línea

jara = r

de la sección [nombre_repo_1:/] es innecesaria pues ya se ha dado acceso de lectura por defecto en las 2 primeras líneas, pero se ha añadido aquí para mostrar un poco más la sintaxis de este fichero de autorización.

Si se apunta con un navegador web a la url: http://mi.servidor-svn.es/svn podremos navegar por los repositorios creados y visualizar el contenido de sus archivos. No obstante el aspecto de la interfaz es muy pobre. Si queremos una interfaz algo más atractiva, podemos instalar la aplicación PHP websvn. Esta aplicación no se encuentra en el repositorio de Ubuntu 16.04, pero podemos instalarla a partir de sus fuentes:

apt-get install php libapache2-mod-php php-mcrypt
mkdir /var/www/html/
cd /var/www/html
wget http://websvn.tigris.org/files/documents/1380/49056/websvn-2.3.3.tar.gz
tar xvzf websvn-2.3.3.tar.gz
mv websvn-2.3.3 websvn
cd websvn
cp include/distconfig.php include/config.php

y editamos el fichero include/config.php para añadir al final la ubicación del directorio donde están los proyectos de subversion:

$config->parentPath("/var/lib/svn");

Protegemos el directorio /var/www/html/websvn tal y como hicimos con /var/lib/svn, usando autenticación básica HTTP. Para ello editamos el fichero /etc/apache2/sites-available/000-default.conf y añadimos dentro de la sección <VirtualHost>:

<Directory /var/www/html/websvn>
    AuthType Basic
    AuthName "Subversion Repository"
    AuthUserFile /etc/apache2/dav_svn.passwd
    Require valid-user
</Directory>

Y finalmente reiniciamos el servicio apache:

systemctl restart apache2

Et voilà! Ya tenemos un completo servidor de subversion para nuestro equipo de desarrollo.