Too Cool for Internet Explorer

Subversion hooks

Hora y Fecha: Febrero 6, 2007 @ 1:16 am Autor: Moisés Maciá
Categorías:
1,156 views

Subversion tiene una funcionalidad muy interesante que permite al administrador del repositorio incluir scripts o programas (llamados hooks) que se ejecutarán bajo determinadas circunstancias al hacer uso del repositorio. Se suelen utilizar estos hooks para tareas como enviar un correo a todos los miembros del equipo cada vez que alguien hace un commit o comprobar la distintas métricas del código antes de entrar al repositorio.

En este artículo describiré la administración y automatización de tareas de despliegue de aplicaciones utilizando el sistema de control de versiones Subversion.

Hooks

Un gancho es un programa activado por algún evento del repositorio, como la creación de una nueva revisión o la modificación de una propiedad no versionada. A cada gancho se le da suficiente información para que sepa de qué evento se trata, cuál es su objetivo, y el nombre de usuario de la persona que disparó el evento. Dependiendo de la salida del gancho o de estado de su salida, el programa de enganche puede continuar la acción, pararla, o suspenderla de alguna manera.

Hay una plantilla por cada gancho que implementa el repositorio Subversion, y examinando los contenidos de dichas plantillas de scripts, puede ver qué disparador ejecuta cada script y qué datos se le pasan. También se encuentran en muchas de estas plantillas ejemplos de cómo debería usar dicho script, conjuntamente con otros programas provistos por Subversion, para realizar tareas comunes y útiles. Para instalar realmente un gancho funcional, sólo necesitas colocar algún ejecutable o script en el directorio repos/hooks que pueda ser ejecutado con el nombre del gancho ( como start-commit o post-commit).

En plataformas Unix, esto significa proveer un script o programa (podría ser un shell script, un programa Python, un binario C compilado, o cualquier otra cosa) llamado exactamente igual que el nombre del gancho. Por supuesto, los ficheros de plantillas están presentes para algo más que sólo propósitos informativos—la manera más fácil de instalar un gancho en plataformas Unix es simplemente copiar el fichero de plantilla apropiado en un nuevo fichero sin la extensión .tmpl, personalizando los contenidos del gancho, y asegurándose de que el script sea ejecutable.

Actualmente hay cinco ganchos implementados por el repositorio Subversion:

  • start-commit
  • pre-commit
  • post-commit
  • pre-revprop-change
  • post-revprop-change

Hay información detallada del desempeño de cada uno de estos ganchos en la documentación de Subversion.

Escenario

Supongamos que estamos desarrollando una aplicación web y disponemos de dos entornos de despliegue claramente diferenciados: un entorno de pruebas y otro entono de producción. Lo que más nos interesa es que los cambios que envíen los desarrolladores se vean reflejados en el entorno de pruebas tan rápidamente como sea posible, de esta manera los beta-testers dispondrán siempre de una copia fresca del software para trabajar.

La idea de tener a una persona dedicada a conciliar los cambios de varios desarrolladores y mantener el entorno de pruebas actualizado continuamente y sin errores es ridículamente estúpida en su misma concepción (lo cual no impide que muchos proyectos se hagan de esta inteligente manera).

En definitiva lo que queremos conseguir con Subversion es automatizar el despliegue: que cada fichero modificado, borrado o incluido se suba mediante FTP y se vea reflejado al instante en el servidor de pruebas, delegando las decisiones sobre el repositorio, que por algo recibe el nombre de control de versiones, y aprovechando mejor el tiempo para ir a tomar un café o escribir artículos como este :)

Script

La labor del script consiste en ver que es lo que ha cambiado desde la última vez y subir los cambios a la cuenta FTP del servidor de pruebas. El gancho que mejor se adapta a esta funcionalidad es post-commit (se ejecuta al final de la transacción) y las operaciones que nos podemos encontrar son las siguientes:

  • Subir un fichero modificado o crear un fichero nuevo.
  • Eliminar un fichero.
  • Crear un directorio.
  • Eliminar un directorio (recursivamente).

A lo que hay que añadir la peculiar forma de trabajar del protocolo FTP (un directorio debe estar vacío antes de borrarlo y hay distinción entre archivos binarios y de texto).

El gancho post-commit nos proporciona la ruta del repositorio que ha cambiado y el número de revisión pero nos falta lo más importante, saber qué ficheros han cambiado. Para esto nos podemos ayudar de la propia librería de desarrollo de Subversion (si está disponible un port para el lenguaje que empleemos) o bien utilizar herramientas externas.

Lo más sensato es utilizar herramientas externas como svnlook o svnadmin y no perder el tiempo programando más de lo que realmente hace falta.

He utilizado PHP para programarlo; no es lo más habitual ya que todos los ejemplos que he encontrado estaban escritos en Python o en Perl (incluso en Ruby, válgame $DEITY lo ponen hasta en la sopa ;) ) pero doy fé de que funciona perfectamente, incluso más bien de lo que esperaba :)

SVN FTP synchronization post-commit hook v0.1

Reaprovechado la idea se puede construir un script que compile un ejecutable y lo deje empaquetado en un FTP, o bien generar la documentación del proyecto cada vez que este cambia. Las posibilidades son infinitas.

Con la emoción del momento programé algunos ganchos más, si hay interés los publicaré.





« Anterior post: Paginar una consulta desde la consola MySQL | Próximo post: Have you tried to turn it off and on again? »

6 Comentarios para “Subversion hooks”

penyaskito
18 de Febrero de 2007 a las 2:15 am    

Hay interés :)

Carlos
7 de Marzo de 2007 a las 12:42 am    

Claro que hay interés

[...] Para instalarlos sólo tenéis que seguir las indicaciones del anterior post sobre subversion hooks [...]

dani
29 de Julio de 2007 a las 1:43 pm    

Excelente artículo!!!!!

nicehobbit
16 de Enero de 2008 a las 10:55 pm    

Buenas, puede pasar que debido a estos hooks, el proceso de commit se torne mas lento??

actualmente tenemos ese problema :(

Moisés Maciá
16 de Enero de 2008 a las 11:35 pm    

Claro, si tienes muchos commits y/o muchos hooks es normal, piensa que por cada hook subversion debe hacer un fork para lanzarlo.

En mis repositorios hay muy poco trafico así que no te puedo indicar como mejorar el rendimiento.


Bad Behavior has blocked 384 access attempts in the last 7 days.