Instalando Subversion y Websvn en Debian

2008-05-06 por Angel Abad, etiquetado como debian, servidor

Artículo traducido de: http://www.howtoforge.com/debian_subversion_websvn

Proposito de este howto

Este howto muestra como instalar y configurar Subversion y Websvn en un servidor Debian con las siguientes características:

  • Multiples repositorios Subversion
  • Acceso a los repositorios a través de WebDAV (https, http) y ssh
  • Acceso a traves de las cuentas de usuario de Linux y/o permisos de Apache
  • Websvn seguro (aplicación web php para visualizar el código fácilmente)
  • Coloreado de sintaxis en websvn con gnu enscript

No configuraré inetd con svnserve en este howto. Subversion será totalmente funcional sin el. Puede copiar/pegar la mayoría de este howto y le funcionará.

Paquetes que se asume que deben estar instalados

Este howto asume que PHP y Apache2 están instalados y configurados. La configuración de apache2 con SSL es opcional.

Instalando Subversion

Paquetes Subversion

Como root puede introducir los siguientes comandos para instalar los paquetes necesarios para el funcionamiento de Subversion:

# apt-get update
# apt-get install subversion
# apt-get install libapache2-svn

El paquete libapache2-svn instalará el módulo apache WebDav de subversion.

Creando y poblando los repositorios

Para trabajar con este howto crearemos dos repositorios:

# mkdir /var/svn-repos/
# svnadmin create --fs-type fsfs /var/svn-repos/project_zen
# svnadmin create --fs-type fsfs /var/svn-repos/project_wombat

Los directorios de los repositorios necesitan los permisos apropiados para apache y los demás usuarios. Crearé un grupo y le añadiré los usuarios (no haga copiar/pegar aquí). El usuario de apache no lo pondremos en el grupo, ya que lo encuentro algo inseguro.

# groupadd subversion
# addgroup john subversion
# addgroup bert subversion
# addgroup you subversion
...
# chown -R www-data:subversion /var/svn-repos/*
# chmod -R 770 /var/svn-repos/*

Ahora configuraremos la conexión ssh, en la máquina cliente introduzca los siguientes comandos:

$ mkdir ~/.ssh/
$ cd ~/.ssh/
$ ssh-keygen -t dsa
$ cat ~/.ssh/id_dsa.pub | ssh you@example.com "cat - >>
~/.ssh/authorized_keys"

El servidor ejemplo.com es donde tenemos instalado Subversion. Por facilidad de uso de ssh puede elegir no usar contraseña con tu clave o usar el agente para mantenerse autenticado. Sino, cada transacción entre la máquina del usuario y el servidor Subversion le obligará a introducir la contraseña (muy molesto). El uso del agente se puede hacer mediante:

$ ssh-agent
$ ssh-add
$ ssh usuario@ejemplo.com

Ya tenemos todo preparado para usar el repositorio. Lo puede usted probar con esto, hará un import y un checkout:

$ mkdir ~/TEMP/
$ echo "testing svn" > ~/TEMP/testing.txt
$ svn import -m "importing test over ssh+svn" ~/TEMP/ svn+ssh://example.com/var/svn-repos/project_zen/trunk
$ svn co svn+ssh://example.com/var/svn-repos/project_zen/trunk testcheckout

Como resultado debemos obtener el fichero testing.txt en un directorio llamado testcheckout. En el servidor puede observar los repositorios con svnlook.

# svnlook tree /var/lib/svn/project_zen/

Configurando el WebDAV de Subversion

Por lo general el módulo de apache viene configurado, de todas formas puede asegurarse con los siguientes comandos:

# a2enmod dav
# a2enmod dav_svn

La configuración se hace en el fichero /etc/apache2/mods-available/dav_svn.conf, pero primero debemos crear el fichero de acceso.

# htpasswd2 -c /etc/apache2/dav_svn.passwd usuario
# htpasswd2 -c /etc/apache2/dav_svn.passwd john
...

Este es el contenido de mi fichero /etc/apache2/mods-available/dav_svn.conf:

<Location /svn_zen>
DAV svn
SVNPath /var/svn-repos/project_zen
AuthType Basic
AuthName "Subversion Repository"
AuthUserFile /etc/apache2/dav_svn.passwd
Require valid-user
SSLRequireSSL
</Location>
<Location /svn_wombat>
DAV svn
SVNPath /var/svn-repos/project_wombat
AuthType Basic
AuthName "Subversion Repository"
AuthUserFile /etc/apache2/dav_svn.passwd
Require valid-user
SSLRequireSSL
</Location>

Puede comentar la linea SSLRequireSSL sino desea utilizar SSL, pero entonces deberá utilizar http en vez de https en los comandos siguientes. Deberemos reiniciar apache y probar desde la máquina cliente. Importaremos el mismo fichero de prueba en el proyecto wombat.

# /etc/init.d/apache2 restart
$ svn import -m "probando sobre https" https://ejemplo.com/svn_wombat ~/TEMP/

Usando un navegador web puede visitar https://ejemplo.com/svn_wombat y ver el nuevo archivo. Esta es una vista muy basica del repositorio, pero usando un front-end web como websvn obtendremos una navegación por el repositorio mucho más completa.

Instalando Websvn

Paquetes requeridos

Para echar a andar websvn necesitamos los siguientes paquetes, los dos te mostrarán pantallas de configuración (se explica en el siguiente párrafo):

# apt-get install enscript
# apt-get install websvn

Enscript no es obligatorio, pero es necesario para el coloreado de sintaxis en websvn.

Configuración

Enscript le preguntará por el tamaño del papel, esto es porque enscript es usado también para convertir ficheros ASCII a PostScript. Nosotros lo necesitamos para el coloreado de sintraxis.

Websvn nos preguntará que servidor queremos configurar, seleccionamos el nuestro y pulsamos intro.

La siguiente pantalla nos preguntará por el directorio del repositorio padre y por los directorios de repositorios específicos, esto determinará que repositorios serán visibles desde websvn. Nosotros sólo introduciremos el repositorio padre (/var/lib/svn), todos los repositorios creados en este directorio serán visibles mediante websvn. Si usted sólo quiere mostrar algunos repositorios específicos introduzca la ruta complete en la segunda pantalla y deje el directorio padre en blanco.

Como resultado de la configuracion el ficher /etc/websvn/svn_deb_conf.inc será creado. Puede volver a ejecutar las pantallas de configuración del paquete debian mediante dpkg-reconfigure. Aparte, el resto de la configuración de websvn está en el fichero /etc/websvn/config.inc. Este es el contenido de mi fichero con algunas extensiones para el coloreado de sintaxis.

< ?php
// --- LOOK AND FEEL ---
//
// Uncomment ONLY the display file that you want.
$config->setTemplatePath("$locwebsvnreal/templates/Standard/");
// $config->setTemplatePath("$locwebsvnreal/templates/BlueGrey/");
// $config->setTemplatePath("$locwebsvnreal/templates/Zinn/");

// $contentType[".c"] = "plain/text"; // Create a new association
// $contentType[".doc"] = "plain/text"; // Modify an existing one
unset($contentType[".sh"]); // Remove a default association -> .sh is regarded as a binary file by default, needs to be unset
// --- COLOURISATION ---
// Uncomment this line if you want to use Enscript to colourise your file listings
//
// You'll need Enscript version 1.6 or higher AND Sed installed to use this feature.
// Set the path above.
//
$config->useEnscript();
// Enscript need to be told what the contents of a file are so that it can be colourised
// correctly.  WebSVN includes a predefined list of mappings from file extension to Enscript
// file type (viewable in setup.inc).
//
// Here you should add and other extensions not already listed or redefine the default ones. eg:
//
// php is default correctly colourized
$extEnscript[".java"] = "java";
$extEnscript[".pl"] = "perl";
$extEnscript[".py"] = "python";
$extEnscript[".sql"] = "sql";
$extEnscript[".java"] = "java";
$extEnscript[".html"] = "html";
$extEnscript[".xml"] = "html";
$extEnscript[".thtml"] = "html";
$extEnscript[".tpl"] = "html";
$extEnscript[".sh"] = "bash";
// --- MISCELLANOUS ---
// Uncomment this if you don't have the right to use it.  Be warned that you may need it however!
set_time_limit(0);
// Comment this line to turn off caching of repo information.  This will slow down your browsing.
$config->setCachingOn();
// Number of spaces to expand tabs to in diff/listing view across all repositories
$config->expandTabsBy(8);
// To change the global option for individual repositories, uncomment and replicate
// the required line below (replacing 'myrep' for the name of the repository to be changed).
// $config->findRepository("myrep")->expandTabsBy(3); // Expand Tabs by 3 for repository 'myrep'
?>
<?php
if ( file_exists("/etc/websvn/svn_deb_conf.inc") ) {
include("/etc/websvn/svn_deb_conf.inc");
}
?>
Lo siguiente es configurar el virtualhost en apache para websvn. Un ejemplo usando SSL:
<VirtualHost *:443>
ServerAdmin webmaster@ejemplo.com
ServerName svn.ejemplo.com
DocumentRoot /var/www/websvn/
<Location />
Options FollowSymLinks
order allow,deny
allow from all
AuthType Basic
AuthName "Subversion Repository"
Require valid-user
AuthUserFile /etc/apache2/dav_svn.passwd
<IfModule mod_php4.c>
php_flag magic_quotes_gpc Off
php_flag track_vars On
</IfModule>
</Location>
SSLEngine on
SSLCertificateFile /etc/apache2/ssl/apache.pem
</VirtualHost>
Y un ejemplo sin SSL:
<VirtualHost *:80>
ServerAdmin webmaster@ejemplo.com
ServerName svn.ejemplo.com
DocumentRoot /var/www/websvn/
<Location />
Options FollowSymLinks
AllowOverride None
order allow,deny
allow from all
AuthType Basic
AuthName "Subversion Repository"
Require valid-user
AuthUserFile /etc/apache2/dav_svn.passwd
<IfModule mod_php4.c>
php_flag magic_quotes_gpc Off
php_flag track_vars On
</IfModule>
</Location>
</VirtualHost>

N.T.: Fijese en el mod_php4.c puede que usted esté utilizando otra versión diferente.

Reinicie apache y eche un vistazo al resultado en https://svn.ejemplo.com/.

Enlaces de interes sobre Subversion

Más información

Clientes subversion

Espero que este howto te haya sido útil. Esta no es una configuracion perfecta, pero espero que te ayude a utilizar Subversion. Por favor, siente con toda libertad para enviar comentarios y correcciones.