Subversion server side scripting (hooks)
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:
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:
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.
- Ve al directorio de hooks del repositorio correspondiente:
- Y ejecuta el script (
post-commit
en el ejemplo) con el siguiente comando:
Lo que ocurra en ese momento es lo mismo que pasará cuando el script se ejecuta de forma automática.