Siguiendo con el tema de integración continua en este tip explicaré como poder hacer la comunicación entre Subversion y Jenkins.
Principalmente existen dos maneras para que al momento de hacer un" commit" a subversion Jenkins pueda iniciar un JOB (actividad) que esté ligado a ese repositorio:
Jenkins como inicializador
El primero es el más nativo y es por medio de que Jenkins escaneará cada determinado tiempo si hubo algún cambio en el repositorio. Esto lo hacemos indicándole a Jenkins cuál es el repositorio donde obtendrá el código fuente y el tiempo que realizará cada inspección de cambio.
Una de las desventajas de este método es la carga constante que se está realizando, tanto del lado de Jenkins como de Subversion. Además, existe una latencia entre el momento que se subieron los cambios y el que le toma a Jenkins realizar la inspección.
Subversion como inicializador
El otro método es mucho más dinámico en tiempo real y eliminando la carga constante. Esto se logra mediante la instrucción que Subversion le da a Jenkins en el momento que algún repositorio sufrió una actualización.
Por lo tanto, en lugar que la comunicación sea desde Jenkins hacia Subversion preguntando si hubo modificación por cada repositorio configurado, en este método es desde Subversion hacia Jenkins dando la instrucción de que cierto repositorio sufrió una actualización para que Jenkins busque los JOBS que estén asociados para ejecutarlos. De esta manera se logra la sincronización en tiempo real.
Para lograr ésto, hay que configurar un POST-HOOK en cada repositorio de subversion, ademas de la configuración básica en jenkins donde se indica el repositorio y habilitando la casilla de "Poll SCM" para habilitar que Subversion sea el inicializador de ese JOB.
El hook lo que hace a grandes rasgos es explotar la funcionalidad que ofrece jenkins de buscar jobs asignados a cierto repositorio asi como su ejecución remota. Esta funcionalidad es mediante peticiones POST que ya Jenkins expone de fábrica. Asi que el hook es un llamado de CURL o WGET a esta funcionalidad.
De esta manera podemos eficientar la comunicación entre Subversion y Jenkins para la ejecución de trabajos al momento de actualizar un repositorio.
Este HOOK es el siguiente:
----- Inicia código
#!/bin/sh
JENKINS_SERVER=
{URL_SERVIDOR_JENKINS}
REPOS="$1"
REV="$2"
UUID=`svnlook uuid $REPOS`
/usr/bin/wget --header "Content-Type:text/plain;charset=UTF-8" --post-data "`svn
look changed --revision $REV $REPOS`" --output-document "-" --timeout=2 $JENKINS
_SERVER/subversion/${UUID}/notifyCommit?rev=$REV
----- Fin de código
Se deberá cambiar {URL_SERVIDOR_JENKINS}
por la dirección real del servido rde Jenkins. Ejemplo: http://servidorjenkins.com/
Este código deberá salvarse en un archivo llamado post-commit
y guardarse dentro la carpeta hooks/ que se encuentra en la carpeta del proyecto en los repositorios de Subversion.
Ejemplo:
/var/svn/MiProyecto/hooks/post-commit
Al ejecutar este script, Jenkins buscará JOBS que estén asociados a este proyecto (Mediante el Repository URL en la configuración del proyecto) y comenzará su ejecución (hay que seleccionar la casilla "Poll SCM" dentro de la configuración del proyecto en Jenkins)