Una de las primeras cosas que he hecho en mi nuevo trabajo es instalar un sistema de control de versiones para tener todos los proyectos centralizados. Porque parece mentira que teniendo proyectos en PHP de más de 150 MB, lo tengan en un directorio compartido donde todos trabajan. Pero bueno, para eso estoy yo, por lo menos dejar mi semillita, como en el anterior.
Sistemas de control de versiones hay muchos, entre ellos está el más conocido y usado que es CVS. Pero este sistema está ya bastante obsoleto y, como le he usado en una de mis anteriores empresas, sé que para proyectos grandes se eterniza al actualizar y al hacer commit. Por eso mi decisión fue poner Subversion, un sistema que tiene todas las características de CVS pero que es bastante más avanzado en cuanto a integridad de los datos y velocidad de actualización.
Instalarlo en Ubuntu es fácil, basta con poner el comando correcto con apt-get o usar Synaptic, el front-end de Gnome para apt-get:
root@localhost ~ $ apt-get install subversion
Después de esto, mediante la utilidad de Subversion svnadmin, se crean los repositorios en el lugar deseado y se administran haciendo copias de seguridad, verificándolos, etc. Con svn se accede a los repositorios ya para trabajar con los distintos proyectos. La ayuda de estos comandos es bastante extensa, así que no creo que haya problema para manejarlos.
El problema de esto es ¿cómo sabe la utilidad svn dónde están los repositorios y cómo acceder a ellos? Pues bien, existen dos maneras: la primera es configurando el servidor Apache con mod_dav para acceder a los mismos y la segunda es mediante su propio servidor, svnserve. He elegido la segunda opción para tenerlo todo mejor organizado (Apache sólo para Web). Iniciar svnserve es fácil:
root ~ $ /usr/bin/svnserve -d -T -r /ruta/repositorio
Una vez realizados estos pasos tendremos un servidor Subversion sirviendo un repositorio. A este repositorio se puede acceder mediante el comando svn, mediante TortoiseSVN en Windows, o mediante Subclipse, un plugin para Eclipse que añade las funcionalidades de Subversion a este IDE. Nosotros usamos esta última opción.
Pero ¿qué pasa cuando reiniciamos el sistema? El servidor de Subversion no está activo. Hay que iniciarlo a mano y, claro, es un poco tedioso. Buscando en la documentación de Subversion no viene ningún script de como iniciarlo automáticamente y, realmente, es una carencia importante, así que, buscando por la red me encontré unos cuantos y de ellos hice el siguiente:
#! /bin/sh -e
#### BEGIN INIT INFO
# Provides: svnserve
# Required-Start: $syslog $time $local_fs $remote_fs
# Required-Stop: $syslog $time $local_fs $remote_fs
# Default-Start: 2 3 4 5
# Default-Stop: S 0 1 6
# Short-Description: Subversion repository server
# Description: Ubuntu init script for the
# Subversion repository server
### END INIT INFO
set -e
PATH=/bin:/usr/bin:/sbin:/usr/sbin
DAEMON=/usr/bin/svnserve
REPOS=/var/svnroot
test -x $DAEMON || exit 0
. /lib/lsb/init-functions
case "$1" in
start)
log_daemon_msg "Starting Subversion server" "svnserve"
sudo -u svn $DAEMON -d -T -r $REPOS
log_end_msg $?
;;
stop)
log_daemon_msg "Stopping Subversion server" "svnserve"
killall $DAEMON
log_end_msg $?
;;
force-reload|restart)
$0 stop
$0 start
;;
*)
echo "Usage: $0 {start|stop|restart|force-reload}"
exit 1
;;
esac
exit 0
Este script se debe guardar en un archivo llamado svnserve (o como se quiera, la verdad) en el directorio /etc/init.d/. Desde ahí se deben crear enlaces simbólicos a todos los directorios de inicio de los runlevels de linux, esto es /etc/rc?.d/ sustituyendo la ? por un número del 0 al 6 y una S. Esto se puede hacer a mano aunque tiene una nomenclatura específica para saber si arrancar o parar, pero se puede hacer de forma automática con un script de Debian y Ubuntu llamado update-rc.d dando el siguiente resultado:
root /etc/init.d $ update-rc.d svnserve defaults
Adding system startup for /etc/init.d/svnserve ...
/etc/rc0.d/K20svnserve -> ../init.d/svnserve
/etc/rc1.d/K20svnserve -> ../init.d/svnserve
/etc/rc2.d/S20svnserve -> ../init.d/svnserve
/etc/rc3.d/S20svnserve -> ../init.d/svnserve
/etc/rc4.d/S20svnserve -> ../init.d/svnserve
/etc/rc5.d/S20svnserve -> ../init.d/svnserve
/etc/rc6.d/K20svnserve -> ../init.d/svnserve
Con esto se toman las opciones por defecto (inicio en los runlevels 2, 3, 4, y 5 y parada en el 0, 1 y 6 con un número de orden de inicio de 20) aunque se pueden modificar pasando otras opciones al comando.
Y llegados a este punto ya tenemos nuestro servidor Subversion corriendo cada vez que se inicie la máquina en el repositorio indicado. Hay que decir que dentro de este repositorio se pueden crear otros, basta con crear subdirectorios debajo de la ruta principal y mediante la utilidad svnadmin crear los repositorios correspondientes. El servidor svnserve los reconocerá sin necesidad de reiniciar ni cambiar ningún parámetro en la configuración.
A partir de ahora sólo tengo que conseguir una cosa bastante más compleja que todo lo anterior: que lo usen. A ver si con un poco de paciencia…