Skip to main content
Configuración de Repositorios Espejo Subversion con svnsync

Configuración de Repositorios Espejo Subversion con svnsync

1 estrella2 estrellas3 estrellas4 estrellas5 estrellas (Ninguna valoración todavía)
Cargando…

En ocasiones es necesario e imprescindible utilizar un modelo distribuido de repositorios de código. Migraciones a otros repositorios, necesidades departamentales, generación de copias de seguridad de repositorios o limitaciones de uso del servidor de repositorios por parte de los proveedores en el cliente, pueden provocar que el repositorio de código a utilizar no sea único.

svn_1Algo habitual, es la limitación de acceso a los repositorios del cliente, por lo que los proveedores nos vemos obligados a trabajar en nuestros repositorios corporativos y, o bien a sincronizar el código cada cierto tiempo (vía VPN) o enviar la información en formato DUMP a cargar en el repositorio de entrega. La carga mediante DUMP resuelve muchos problemas (mantenimiento de histórico, auditoría, logs,…) pero imposibilita que el cliente tenga, siempre y en todo momento, disponible el código que se está desarrollando.

svn_02 Como posible solución, Subversion permite la configuración de un repositorio de proyecto de Subversion como espejo de un repositorio ubicado en otro servidor de Subversión. Aplicando esta solución, los proveedores accederán al repositorio “maestro” de subversión que estará configurado para darles acceso, mientras que el repositorio “espejo” de Subversion será sincronizado en cada operación “commit” realizada sobre el maestro.

Este post indica los pasos para crear un repositorio espejo en Subversion así como las tareas necesarias para automatizar la sincronización del repositorio espejo con el maestro.

  • Subversion Maestro: Repositorio vivo y en uso en modo lectura y escritura. Este repositorio será el “espejado” vía svnsync.
  • Subversion Espejo: Repositorio sólo de lectura que es sincronizado con el maestro vía svnsync.

svn_03

svnsync

Como parte del estándar Subversión existe la utilidad svnsync. Esta herramienta se describe como un programa que “provee toda la funcionalidad necesaria para mantener un repositorio, sólo de lectura, espejo de un repositorio de Subversion”.

Los repositorios espejo son utilizados para:

  • Ofrecer un Backup del repositorio. Beneficioso para solventar problemas debidos a fallos en el servicio o actualizaciones de software.
  • Proporcionar un repositorio de sólo lectura. En algunos casos puede ser interesante proporcionar un repositorio con acceso único de sólo lectura y, aunque se puede conseguir mediante la aplicación de políticas de permisos, svnsync es menos tedioso y fácil de mantener que la edición de archivos de autorización de Subversion.

Svnsync obtiene todas las revisiones realizadas de un repositorio desde una revisión dada y en relación con esa información, actualiza el repositorio aplicando todas las revisiones pendientes. Esto significa que al repositorio espejo le serán aplicados los mismos cambios que al repositorio maestro. Esta operación se consigue gracias a que Subversion mantiene,  mediante metadatos, el control de los cambios que son necesarios aplicar desde la revisión 0 del repositorio espejo.

Para que la operación funcione sin problemas es necesario cumplir unas reglas mínimas:

  • El usuario encargado de realizar la operación de sincronización necesita:
    • Permisos de lectura/escritura sobre todo el repositorio espejo.
    • Ser capaz de modificar las propiedades de revisión del repositorio.
  • El repositorio espejo necesita estar en modo sólo lectura para todos los usuarios excepto para el usuario sincronizador. El usuario sincronizador es sólo accesible por administradores de Subversion y es el configurado dentro del script post-commit, encargado de realizar la sincronización automática.
  • Antes de realizar la sincronización de un repositorio espejo con un repositorio maestro, el repositorio espejo deberá encontrarse en la revisión 0.

Subversion_blog_5Configuración

Los pasos e instrucciones indicados a continuación, han sido probados sobre servidores Subversion 1.8 instalados sobre máquinas Windows.

 

1. Crear un repositorio local

Este repositorio local será configurado como repositorio espejo, entendiendo que el repositorio maestro existe previamente:

svnadmin create [RUTA_NUEVO_REPO]

Ejemplo:

svnadmin create c:\csvn\data\repositories\mirrow_repo

La ruta  (c:\csvn\data\repositories) debe existir y será la ruta configurada para los repositorios de Subversion. Por defecto, el repositorio es creado en modo sólo lectura.

Importante: Para crear un repositorio espejo, éste debe estar en su revisión 0, esta limitación hace que sea más conveniente crear el repositorio desde 0 antes de sincronizarlo.   

 

2. Habilitar escritura en el repositorio

Editar el archivo  [RUTA_REPO_LOCAL]\conf\svnserve.conf

Descomentar las líneas:

password-db = passwd
authz-db = authz

Estas líneas indican a Subversión cuál es el archivo de credenciales de usuario y de autorización de usuarios del repositorio.

Añadir el nuevo usuario

Editar el archivo [RUTA_REPO_LOCAL]\conf\passwd y añadir un nuevo usuario y contraseña: Ejemplo: svnsync_user = svnsync

Asignar al nuevo usuario permisos de lectura y escritura sobre el nuevo repositorio

Editar el archivo [RUTA_REPO_LOCAL]\conf\authz

[/]
svnsync_user = rw

 

3. Habilitar el cambio de la propiedad revision

Desde la consola de administración de Subversion (Lista de repositorios/Seleccionar Repositorio/ Info)  o desde fichero, acceder al archivo: pre-revprop-change.tmpl en [RUTA_REPO_LOCAL\hooks], hacer una copia y renombrar el archivo a pre-revprop-change.bat. Abrir el archivo .bat y editarlo dejando únicamente:

exit 0

 

4. Alta del usuario de sincronización en los servidores (espejo y maestro)

Se debe realizar el alta del usuario encargado de la sincronización. En el ejemplo se utiliza el usuario svnsync_user con contraseña svnsync, por lo que se debe der alta en el servidor de Subversion configurado como espejo y en el servidor de Subversión configurado como maestro.

 

5. Inicialización

La operación de inicialización permitirá asignar al repositorio espejo la dirección de sincronización hacia el repositorio maestro. Esta operación solo se realizará la primera vez:

svnsync init [LOCAL REPO PATH using file:// protocol] [REMOTE LOCAL PATH] --sync-username [USERNAME] --sync-password [PASSWORD] --trust-server-cert --non-interactive

Ejemplo:

svnsync init file:///RUTA_REPO_LOCAL https://ip_subversion_maestro:puerto/ruta_repositorio/ --sync-username svnsync_user --sync-password svnsync --source-username svnsync_user --source-password svnsync --trust-server-cert --non-interactive
Copied properties for revision 0.

 

6. Sincronización

svnsync sync [LOCAL REPO PATH].

Si el repositorio es grande esta operación tardará mucho tiempo. Desde ahora en adelante para sincronizar el repositorio espejo solo se tendrá que repetir este paso.

Ejemplo:

svnsync sync file:///[RUTA_REPO_LOCAL] --trust-server-cert --non-interactive

 

Solución de problemas

Según las guías de uso del comando sync: si el proceso de sincronización falla, la próxima vez que se realice una operación sync se obtendrá un error  “failed to get lock on destination repos, currently held by…”.

Para restablecer el repositorio tras el fallo, se recomienda ejecutar este comando:

svn propdel svn:sync-lock --revprop -r 0 [LOCAL REPO PATH]

 

Automatización

Una vez configurado el repositorio como espejo de otro, en el repositorio maestro se puede configurar una tarea post-commit que realice de forma automática la sincronización de los repositorios.

Desde Subversion maestro del repositorio a sincronizar, se debe renombrar el archivo post-commit a post-commit.bat y editar:

svnsync sync svn://machineB/repos --non-interactive --no-auth-cache --source-username machineAusername --source-password machineApassword --sync-username machineBusername --sync-password machineBpassword --trust-server-cert

Ejemplo:

svnsync sync https://ip_subversion_espejo:puerto/ruta_repositorio --non-interactive --no-auth-cache --source-username svnsync_user --source-password svnsync –sync-username svnsync_user --sync-password svnsync --trust-server-cert

 

Conclusiones

La configuración descrita se ha aplicado sobre servidores de Subversión Edge con versión 4.0.11 (Subversion 1.8)

La configuración de la tarea post-commit, ha permitido que el repositorio espejo se encuentre siempre actualizado al contenido del repositorio maestro.

Al aplicarse toda la configuración a nivel de repositorio de Subversion, el resto de repositorios ubicados en el servidor de Subversión, continúan funcionando de forma habitual.

Además, es posible eliminar la configuración en modo espejo, para comenzar a trabajar con el repositorio en modo maestro.

 

 

 

Carolina Guillén Romero

Carolina Guillén Romero

Consultor en Integración Continua/Área SQA. 9 años de experiencia Ingeniería Informática, Master en Tecnologías Web: Desarrollo de Aplicaciones y Servicios Web

Carolina Guillén Romero ha escrito 2 entradas


Carolina Guillén Romero

Carolina Guillén Romero

Consultor en Integración Continua/Área SQA. 9 años de experiencia Ingeniería Informática, Master en Tecnologías Web: Desarrollo de Aplicaciones y Servicios Web

Deja un comentario

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