Cómo usar el servidor subversion para ejecutar automáticamente programas personalizados. Como ejemplo, la receta explica cómo actualizar una página web mantenida en un repositorio.

Introducción

Subversion tiene una ‘feature’ muy interesante que permite al administrador del repositorio incluir scripts o programas (llamados hooks) que se ejecutarán cuando los usuarios utilicen el repo. Lo más habitual es usar esto para enviar un correo a todos los miembros del equipo cada vez que alguien hace un ‘commit’, pero se puede hacer cualquier otra cosa, y no sólo para los ’commit’s

Preliminares

Vamos a suponer que en la máquina servidor tienes una cuenta pepe y en tu home tienes un directorio public_html con tu web. También supondremos que ese directorio está gestionado con subversion en un repositorio de esa misma máquina (algo como file://var/svn/pepeweb). De modo que se supone que puedes hacer cosas como:

pepe@servidor:~/public_html$ svn add nuevo.html
pepe@servidor:~/public_html$ svn ci

Pero lo que queremos es que puedas descargar ese mismo repo en cualquier otra máquina y que al hacer commit_, automáticamente se actualice el @publichtml@ del servidor. De ese modo ni siquiera es preciso que tengas cuenta en la máquina servidor.

hooks

Los eventos a los que se puede asociar un script son:

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

Nota: Los ficheros deben tener exactamente estos nombres.

El script post-commit

Tienes que crear un fichero hooks/post-commit en el repositorio (servidor), pero aquí hay dos posibilidades:

El repositorio está servido con svn+ssh

En este caso, el script se ejecutará con el UID del usuario, que es el propietario del directorio public_html. Un script tan simple como éste te sirve:

#!/bin/bash
svn up /home/pepe/public_html

Dale permiso de ejecución:

$ chmod +x post-commit

El repositorio está servido con Apache/DAV

En este caso el script lo ejecuta Apache y, por defecto, él no tiene permiso para escribir en tu public_html.

[Por hacer]

Listo!

Este script puede ser mucho más complejo y lo podrías utilizar para compilar la web si en lugar de HTMLs, lo que mantienes en el repo son fuentes XMLs. O podrías usar el hook pre-commit para asegurar que los ficheros que subes son sintácticamente correctos si es que incluyen código JavaScript o PHP. O pasar una batería de pruebas para comprobar que la web queda en un estado consistente después de los cambios. Las posibilidades son infinitas.

Seguridad

Si lo dejas tal como está, el directorio .svn será accesible por web. Así que si quieres evitarlo, añade algo como esto a la configuración de Apache:

<DirectoryMatch "^/.*/\.svn/">
    Order deny,allow
    Deny from all
</DirectoryMatch>

Permisos

Lo más importante es que te asegures que el usuario con el que se ejecuta el script tiene permisos para acceder a los directorios involucrados y para ejecutar los programas necesarios.

Depuración

Si tienes problemas y quieres saber qué está pasando en la ejecución del script, puedes intentar reproducir “a mano” la situación con los siguientes pasos. En la máquina donde esté el servidor subversion haz lo siguiente:

  • Conviértete en el usuario que va a acceder al repo. Si tienes configurado subversion con dav_svn el usuario será www-data. Si usas svn+ssh el usuario será el mismo con el que se hace la operación. Para la receta hemos supuesto este segundo caso.
# su pepe
  • Ve al directorio de hooks del repositorio correspondiente:
pepe@servidor:~$ cd /var/svn/pepeweb/hooks
  • Y ejecuta el script (post-commit en el ejemplo) con el siguiente comando:
pepe@server:/var/svn/pepeweb/hooks$ env - ./post-commit /var/svn/pepeweb

Lo que ocurra en ese momento es lo mismo que pasará cuando el script se ejecuta de forma automática.

Referencias



blog comments powered by Disqus