jueves, 23 de mayo de 2013

Lanzar Build de Jenkis con Hook de Subversion Edge

Jenkins es un servidor de integración continúa [1] y Subversion Edge [2] es un sistema de control de versiones (SVC) [3] . Ambos pueden trabajar juntos utilizando las funcionalidades API de acceso remoto [4].

Cuando se hace un commit en el SVC es recomendable ejecutar inmediatamente la construcción y las pruebas de las librerías en cuestión. Ciertamente es posible configurar Jenkins para que revise periódicamente si ha habido cambios, pero ¿Cuál es el intervalo de tiempo recomendable para esto?, depende... depende de al frecuencia con la cual el equipo de trabajo hace commits. Pero, y si suceden varios commits antes que se construyan las librerías, esto no permite detectar cualquier error de compilación o ejecución de pruebas a tiempo.

Por suerte, es posible utilizar los Hooks de Subversión [5] en especial post-commit, este se encuentra en la información del repositorio:



Seleccionamos el hook en cuestión y presionamos la opción editar y le agregamos este código:


set REPOS=%1
set TXN=%2

python C:\csvn\bin\call_jenkis.py <nombre del job en jenkins> <token del job> <nombre de usuario> <token del usuario> 1>&2

exit 0


Inicialmente los hooks tienen la extensión tmpl, debemos cambiar esa extensión a .bat y así subversión no lo ignoré y lo ejecute. Si este hook devuelve 1 (exit 1) subversion interpreta que hubo un error, si devuelve 0 (exit 0) la ejecución se realizó correctamente.

En la configuración del job en jenkins obtenemos estos datos:
Además también en jenkis obtenemos el nombre del usuario y el token del usuario:


Y ahora solo queda programar call_jenkins.py


# RestFul Jenkins Client
# autor: Honard Bravo

import urllib2
import base64
import sys

"""
Jenkins usa autenticacionn basica (basic authentication), sin embargo en lugar del password debe enviarse
un token (distinto al token generado por el job), este token se utiliza en lugar del pasword. El token es dado por jenkins en
configuración del usuario.
"""
if __name__ == "__main__":
    if len(sys.argv) < 5:
        print 'Debe especificarse los siguientes parametros (en este orden): job job_token username apiToken'
        exit(1)
    job = sys.argv[1]
    job_token= sys.argv[2]
    username = sys.argv[3]
    apiToken = sys.argv[4]
    base64string = base64.encodestring('%s:%s' % (username,apiToken))[:-1]
    auth_header = 'Basic %s' % base64string
    site= 'http://localhost/jenkins/job/'+job+'/build?token='+job_token
    hdr = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11',
       'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
       'Accept-Charset': 'ISO-8859-1,utf-8;q=0.7,*;q=0.3',
       'Accept-Encoding': 'none',
       'Accept-Language': 'en-US,en;q=0.8',
       'Connection': 'keep-alive',
       'Authorization': auth_header}
    req = urllib2.Request(site, headers=hdr)
    try:
        response = urllib2.urlopen(req)
        print 'Solicitud de build generada con exito'
    except urllib2.HTTPError, e:
        print 'Error: '
        print e.fp.read()
        print e
        print str(e.headers)
        exit(1)
    exit(0)


Colocar el archivo en C:\csvn\bin.

Y listo!

[1] http://www.martinfowler.com/articles/continuousIntegration.html
[2] http://www.collab.net/products/subversion
[3] http://es.wikipedia.org/wiki/Control_de_versiones
[4] https://wiki.jenkins-ci.org/display/JENKINS/Remote+access+API
[5] http://svnbook.red-bean.com/nightly/en/svn.reposadmin.create.html

No hay comentarios:

Publicar un comentario