El día de hoy tuve que solucionar un problema bastante interesante, sincronizar un repositorio entre dos servidores SVN, de modo que en el otro servidor hubiese una réplica (copia) exacta y tras cada cambio en Servidor de Origen se replicase inmediatamente en el Servidor de Destino.

En este gráfico se resume la tarea:

sincronizando un repositorio con svnsync

sincronizando un repositorio con svnsync

Hay diversos métodos para lograr este resultado, pero el más rápido es teniendo acceso a ambos servidores, aquí va un resumen de los requisitos:

  • Servidor de origen con svn/apache
  • Servidor de destino con svn/apache
  • Conectividad entre el servidor de origen y destino al puerto 80
  • Herramientas SVN (svnsync, svnadmin, svn)

Como en el servidor de destino no estaba instalado el servidor SVN, lo hice yo mismo:

[opcional] Instalar un servidor SVN

En este caso, mi Servidor de Destino era Debian, por lo tanto realicé lo siguiente como root:

[shell]

apt-get install apache2 # El servidor web que correrá en el puerto 80 por default
apt-get install subversion # Subversion
apt-get install libapache2-svn # Módulo de Subversion para apache

[/shell]

Creamos un svndump en el servidor de origen:

[shell]svndump file:///srv/svn/REPO/MIREPO > repositorio_origen.dump

#comprimimos

tar czfv repositorio_origen.dump.tar.gz repositorio_origen.dump

#copiamos por scp

scp repositorio_origen.dump.tar.gz ip_servidor_destino:/tmp

[/shell]

Crear el repositorio vacío:

[shell]

svnadmin create /var/www/REPO/MIREPOSITORIO

#Descomprimir el dump generado en Servidor Origen

tar xfv /tmp/repositorio_origen.dump.tar.gz

#Llenar este repo con el dump original

svnadmin load /srv/svn/REPO/MIREPOSITORIO > /tmp/repositorio_origen.dump

[/shell]

Ahora ya tenemos una copia del repositorio original en el repositorio de destino.

Como no me interesaba publicar un virtual host de apache con un nombre, solo agregué un location en el 000-default de apache, además le incluimos autenticación http para que solo nosotros podamos acceder al repositorio.

Creamos un usuario y contraseña para apache, posteriormente lo llamaremos desde el virtual host.

[shell]

htpasswd -c /var/www/secrets/miusuario

[/shell]

Modificamos el archivo:

[shell]

vim /etc/apache2/sites-available/000-default.conf

[/shell]

Y agregamos:

[apache]
DAV svn
SVNAllowBulkUpdates Off
SVNPathAuthz off
SVNParentPath /srv/svn/LAI
Require valid-user
AuthType Basic
AuthName «Repositorio Destino – SVN Server(2)»
AuthUserFile /var/www/secret/passwords

[/apache]

Preparar el servidor de Destino

Crear un hook pre-revprop-change con este contenido en el repositorio de destino:

[shell]
#!/bin/sh
exit 0
[/shell]

Sincronizar desde el servidor de Origen

Teniendo listo el repositorio de destino hacemos

[shell]

#Si realizaron el paso opcional

#svnsync espera $DESTINO y $ORIGEN, cuidado.

svnsync sync –username miusuario –password mipassword http://ip_servidor_destino/REPO/MIREPOSITORIO file:///srv/svn/REPO/MIREPOSITORIO

#Si tienen errores, prueben con el paso opcional:

svnsync –allow-non-empty sync –username miusuario  –password mipassword http://ip_servidor_destino/REPO/MIREPOSITORIO file:///srv/svn/REPO/MIREPOSITORIO

#Si no realizaron el paso opcional

svnsync sync http://ip_servidor_destino/REPO/MIREPOSITORIO

[/shell]

Y para que sea automático, simplemente creen un hook post-commit en el Servidor de Origen con el siguiente contenido:

[shell]

svnsync sync –username miusuario –password mipassword http://ip_servidor_destino/REPO/MIREPOSITORIO file:///srv/svn/REPO/MIREPOSITORIO

[/shell]

De este modo, tendrán un repositorio sincronizado y cada vez que un desarrollador modifique algo en el repositorio de origen estará haciendo commit en dos servidores, en el original y la copia.