h1

Comunicar Mantis y Subversion en Windows

7 enero 2010

Para empezar bien el año, en el trabajo me tocó una tarea de administración, consistente en comunicar nuestro servidor Subversion para desarrollo con el bugtracker Mantis, para que cuando se hiciese un commit con un mensaje de la forma “arreglada incidencia #1” se marcase automáticamente como resuelta en este último🙂
Desgraciadamente era sobre un servidor Windows y toda la información vi en Internet hace referencia a servidores Linux (excepto un script post-commit de SVN que no funcionaba xD) así que, para aquellos que lo vayan a sufrir en el futuro, espero que les sirva de guía. Los pasos son los siguientes:

Instalar Mantis y Subversion (lógico)

Espero que esto no suponga ninguna dificultad, si no hay 3000 tutoriales por la red😉 En mi caso, para el servidor de SVN utilicé el paquete de CollabNet, que crea automáticamente una carpeta para repositorios en C:\svn_repositories y el servicio de Windows asociado. También tenemos que crear un repositorio, en mi caso en C:\svn_repositories\repositorio-1 (originalidad al poder).

Crear una cuenta de usuario de Mantis

Dicha cuenta (por ejemplo “svn”) debe poder añadir mensajes a las incidencias y (opcionalmente) cerrarlas. Con asignarle el nivel de desarrollador es suficiente. Nota importante: ¡No olvidar asignarle los proyectos donde se quieran automatizar esta tarea!

Editar el archivo config_inc.php

Se encuentra en el directorio raíz de Mantis. Los cambios incluirán la cuenta creada en el punto 2, las expresiones regulares por las que se identifica que un mensaje se refiere a una incidencia y, si vamos a permitir que las marque automáticamente como resueltas, el estado y la resolución a las que se haya llegado. Serían algo tal que así:

# Cuenta que se conecta con Subversion
$g_source_control_account = 'svn';

# Expresión regular a encajar en los comentarios
# Ejemplo: incidencia #1
$g_source_control_regexp = '/\b(?:bug|issue|incidencia|fallo|error|problema)\s*[#]{0,1}(\d+)\b/i';

# Expresión regular a encajar para resolver una incidencia
# Ejemplo: resuelta incidencia #1
$g_source_control_fixed_regexp = '/\b(?:resuelto|resuelta|arreglado|arreglada|corregido|corregida)\s+(?:bug|issue|incidencia|fallo|error|problema)?\s*[#](\d+)\b/i';
# Estado tras resolver la incidencia: resuelta
$g_source_control_set_status_to = RESOLVED;
# Resolución trasresolver la incidencia: corregida
$g_source_control_set_resolution_to = FIXED;

Primera prueba

Para hacer una prueba inicial de su funcionamiento necesitaremos varias cosas:

  1. Crear una incidencia de prueba en el Mantis y acordarnos de su número🙂
  2. Crear un archivo de texto que contenga un falso mensaje de commit como “resuelta incidencia #1” (para esto era importante acordarse).
  3. Acceder de alguna forma a una consola del sistema, por ejemplo, conectándonos por escritorio remoto (¿por qué no SSH nativo?). Una vez en ella, como la entrada estándar de Windows apesta y no podemos introducir el texto directamente con el operador <<<, ejecutamos la orden
    C:\ruta\a\php.exe C:\ruta\a\mantis\scripts\checkin.php < C:\ruta\al\archivo\del\mensaje
    Si no encaja con la expresión regular, obtendremos un mensaje “Comment does not reference any issues” (“El comentario no hace referencia a ninguna incidencia”). En caso contrario, abrimos la incidencia en el Mantis y su estado debería haberse modificado, y haberse añadido el mensaje con el texto. Es importante tener en cuenta que en ciertas versiones de Mantis (para la final de 1.2 ya debería estar corregido) en esta situación solo se aceptan mensajes de una línea; si tiene varias no lo asociará a una incidencia.

Conexión con el servidor Subversion

Una vez comprobado que lo básico no explota, pasamos a conectarlo con el servidor Subversion. Para ello utilizaremos un archivo BAT que se ejecutará después de cada commit, lo que se denomina un hook de SVN (también hay hooks para antes de un commit, de un update, etc.). Este archivo debe guardarse en la carpeta hooks del repositorio, en mi caso en C:\svn_repositories\repositorio-1\hooks, con el nombre post-commit.bat.
El contenido del archivo será tal que así, sin olvidar sustituir las rutas de las variables PHP, CHECKIN y SVNLOOK a lo que correponda en el sistema de cada uno:

@ECHO on

SET REPOS=%1
SET REV=%2

SET PHP="C:\Program Files\PHP\php.exe"
SET CHECKIN="C:\Program Files\Apache Software Foundation\Apache2.2\htdocs\mantis\scripts\checkin.php"
SET SVNLOOK="C:\Program Files\CollabNet\Subversion Server\svnlook.exe"

SET LOGFILE=C:\Temp\log.txt
SET AUTHORFILE=C:\Temp\author.txt
SET OUTPUTFILE=C:\Temp\output.txt

%SVNLOOK% log -r %REV% %REPOS% > %LOGFILE%
%SVNLOOK% author -r %REV% %REPOS% > %AUTHORFILE%

TYPE %LOGFILE% > %OUTPUTFILE%

%PHP% %CHECKIN% < %OUTPUTFILE% >> %LOGFILE%
ECHO "Ejecutado post-commit de revisión %REV%" >> %LOGFILE%

@ECHO off

Tras copiar este archivo en la carpeta, debemos acordarnos de reiniciar el servidor SVN para que lo registre (perdí mucho tiempo por culpa de esto).
Como resultado, deberíamos obtener un archivo en C:\temp\output.txt con la salida del log de SVN para la última revisión, y otro en C:\temp\log.txt con, además de esta, la de checkin.php (vacía) y la cadena de confirmación de ejecución del post-commit. Extrañamente, si no incluía esta última salida el script terminaba con un error 255 sin ninguna salida, pero sin embargo la incidencia del Mantis se modificaba correctamente; simplemente está para evitar confundir al usuario. Si alguien sabe a qué puede deberse esto estaré encantada de leer comentarios al respecto😀

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: