4 reglas para tu proceso de control de versiones

9:46 0 Comments

Al principio todo era plano.



Pero ahora, ¡afortunadamente!, ya no es así...



Antecedentes
Vale, ¿por qué estoy escribiendo esto? Esta semana tuve la oportunidad de ver dos estupendas presentaciones de OSCON 2008:

La primera es de Mark Shuttleworth (Canonical, Ubuntu), titulada Más allá del desarrollo ágil: Posibilitar la Siguiente Generación de Métodos de Desarrollo de Software, y que trata sobre diversos temas muy interesantes tales como Lean Software Development. Podéis ver una presentación aqui, merece la pena.

La que realmente me gustó fué la diapositiva 17 en la que dice:

Branching and Merging
Keep trunk pristine,
Keep features flowing,
Release on demand.


Que yo traduzco por:

Ramificación e integración
Mantener la línea principal impoluta,
Mantener la potencia de la herramienta en uso,
Crear versiones bajo demanda.


Y la diapositiva 20 dónde menciona:


Pre-Commit Testing
I see you knocking
but you can't come in.


Que viene a ser:

Probar antes de realizar commit
Veo que estás llamando
pero no puedes entrar.


Como veis se centran en un punto crítico que es pasar todo el juego de tests antes de hacer commit, algo que puede sonar opuesto a la integración continua, pero que en realidad es una evolución del modelo.

También me gustó Code Reviews for Fun and Profit de Alex Martelli (Google) que se puede encontrar aquí .

Menciona lo siguiente en la diapositiva 26:

idealmente, la CR (code review) debería de tener lugar ANTES
del commit/inclusión de cambios en la
base de código
-- mantener la línea principal/inteligente/consejo de calidad



Esto también parece interesante, ¿no?

E incide sobre el mismo tema: revisar, probar, comprobar que no se rompe nada antes de hacer commit a la línea principal.

Y de todo esto se me ocurrió este post (que primero publiqué en inglés)

Las reglas

Vale, vamos a intentar localizar las principales reglas para conseguir el mejor control de versiones posible en la era post-agile:

Regla 1: Mantener la rama principal incorrupta. ¡La rama principal es tu proyecto! No la uses como un trastero (lleno de cosas que no sirven) para dejar todos los cambios y nuevas características. ¡Utiliza las ramas para eso! (Ya, ya lo oigo: "acabaremos con miles de ramas!!", claaaro, ¡y eso no es un problema! Usa un control de versiones adecuado! :-P)

Regla 2: Aislar cambios en ramas. Es una consequencia de la Regla #1. Guarda cada cambio o característica nueva en su propia rama. Ayudará a mantener la rama principal limpia, y te dará toda la potencia del desarrollo paralelo real. También es muy bueno para cambiar de tarea y hacer un seguimiento de los cambios intermedios.

Nota: Asocia tu rama con una con una tarea en tu herramienta de control de tareas (Bugzilla, Mantis, Jira ...) para poder tener el ciclo completo.


Regla 3
: Guarda los cambios con cierta frecuencia, con más de la que lo haces ahora. Si desarrollas en la línea principal no harás commt cada 5 minutos, los cambios suelen tardar más en realizarse. Si tienes tu propia rama para la tarea puedes hacer commit tantas veces como quieras (¡aunque no compile!)... y luego tendrás un historial privado de los cambios.

Regla 4: Revisar los cambios antes de incluirlos en la línea principal. En el desarrollo en la rama principal (y en integración continua) se realizan las pruebas de tests después de que se hayan integrado los cambios. ¡No lo hagas! Sería demasiado tarde, el código ya está roto. Saca el máximo partido a tu herramienta de SCM, revisa los cambios antes de integrarlos.




La buena noticia es que hay herramientas que soportan este modelo, tanto en el ámbito comercial como en herramientas de código libre: plastic, accurev, git (bazaar?)...

La mala noticia es que algunas de las herramientas más utilizadas no soportan este modelo.

Llega una nueva era... ¡preparate!

0 comentarios:

Herramienta de Xmerge para gestionar refactors

13:27 0 Comments

Si has leido este blog anteriormente, probablemente te habrás dado cuenta de que de vez en cuando hablamos de gestión de ramas y de integraciones :-P

Pues hoy vamos a introducir la última idea que hemos tenido: el Xmerge (integración cruzada o cross-merging).

¿Y qué es la integración cruzada? Explicado de manera simple: es tan sólo una herramienta que ayuda a los desarrolladores a integrar el código que se ha movido y modificado en paralelo. Esto pasa muy a menudo al hacer un refactor del código, ¿no?

Vamos a verlo con un ejemplo: supongamos que tenemos un fichero inicial como el siguiente:



Ahora dos desarrolladores comienzan a hacer cambios en paralelo en este fichero (lo cual es una buena idea, para que no tengan que estar esperando el uno a que termine el otro... :-P):

El primer desarrollador hace sus cambios y el segundo mueve el código.





¿Qué pasará al intentar integrar los cambios?

Una herramienta de merge (o de integración) no detectará el código que se ha movido, pero verá que se ha quitado parte del código y que otra parte se ha añadido. Así que habrá que editar el código manualmente e ir copiando y pegando bloques de código. ¡Un dolor de cabeza!.



¿Y si la herramienta pudiera ayudar?

Lo mejor sería que detectara cuál ha sido el código que se ha movido, pero significaría que habría que realizar algún tipo de análisis sintáctico, que no es lo más sencillo de hacer ya que la herramienta se hace dependiente del lenguaje, etc (y esto es en lo que estamos trabajando en este momento, así que estad al loro...).

Pero, ¿y si tan sólo te dejara que encontraras el código que se ha movido y entonces la herramienta pudiera hacer el trabajo sucio? Te ahorrarías el cortar y pegar, ¿no?

Lo ideal sería tener algo como lo siguiente: que la herramienta detecte que "algo ha pasado", entonces indicaría que se debe de buscar el código que ha sido movido, entonces realiza un "sub-merge" sólo con los contribuidores afectados.



Se realiza el sub-merge, solucionando los conflictos potenciales y la herramienta cambiará tu selección por el código que se ha integrado.

Fácil, ¿no?

Estamos trabajando en una nueva versión de la herramienta de integración de Plastic y la podéis ver en acción en el siguiente vídeo:



¿Los siguientes pasos?

Estos son algunos:


  • ¿Qué pasa cuando el código se mueve a un fichero diferente? Estamos trabajando en ello.

  • Sistema que detecte de manera automática el código movido

  • Búsqueda de código movido en ficheros

    ¡Estad atentos!
  • 0 comentarios:

    Como utilizar Plastic SCM y DevTrack parte I

    11:02 0 Comments

    Como ya habréis visto en posts anteriores, Plastic SCM ofrecer la opción de ser utilizado integrado con diversas herramientas de control de tareas, ya que se integra con los sistemas más utilizados en el mercado, aquí podéis ver cuáles son estas herramientas. Una de ellas es DevTrack, de Tech Excel.
    En este post voy a explicar con ejemplos, como utilizar Plastic SCM integrado con DevTrack. Para comenzar tenemos que tener en cuenta que Plastic no sólo se integra con este sistema, sino que además proporciona diversas opciones para la integración. ¿Por qué se ofrecen diversas opciones? Pues simplemente para que cada organización pueda utilizar el modo que mejor se adapte a su patrón de trabajo; en este post vamos a ver la opción del modo de trabajo "Tarea en Rama".
    El primer paso para configurar la extensión de DevTrack por parte del desarrollador será copiar el fichero “devtrackextension.dll” en la carpeta dónde está instalado el cliente de Plastic SCM y añadir las siguientes líneas (rodeadas en rojo) para indicar al cliente que esta es la extensión que se va a usar:


    Y además habría que crear un fichero “devtrackextension.conf”, la apariencia por defecto del mismo es la siguiente:


    <devtrackextensionconfiguration>
    <dtlinkplusurl>http://192.168.1.237/LinkPlusWebService/WSDTIncident.asmx</

    dtlinkplusurl>

    <user>terry-j</user>

    <projectid>daveProject</projectid>
    <systemid>daveSystem</systemid>
    <branchprefix>issue</branchprefix>
    <dtbuginfobrowserurl>http://192.168.1.237/scripts/texcel/devtrack/b

    uginfo.dll</dtbuginfobrowserurl>
    </devtrackextensionconfiguration>


    Finalmente, debemos de asegurarnos de que el fichero devtrackextension.dll esté en la carpeta del cliente de Plastic SCM.


    Una vez que se ha configurado la extensión el primer paso para comenzar a trabajar será crear una nueva tarea en nuestro sistema de control de tareas, DevTrack en este caso. En DevTrack las tareas se pueden crear como defecto o como nuevas características, y además se pueden clasificar en diversas categorías.
    Al guardar la nueva tarea se puede ver el número que se le ha asignado, además se pueden realizar búsquedas por desarrollador, tipo de tarea, etc. En este caso vemos que se ha creado la tarea 107, y se puede indicar al sistema que envíe un email al desarrollador al que se le encarga esta tarea.


    Cuando el desarrollador asignado, en este caso, Terry, esté preparado para comenzar a trabajar en la tarea 107, irá a la vista de ramas para crear una nueva rama a la que pondrá el mismo nombre que la tarea creada en DevTrack e incluirá sus comentarios. También se puede incluir la base que tendrá la rama, que esta recordará cada vez que un usuario vaya a trabajar con ella; se puede ver más información de las ramas inteligentes de Plastic aquí.

    Después de que se haya creado la rama, yendo a la parte superior izquierda de la vista de ramas podemos ver la información extendida de las ramas, que muestra informacion de las tareas enlazadas de DevTrack al seleccionar una rama. En la siguiente imágen podemos ver que se selecciona la rama recién creada (/scm00107) y en la parte de la derecha podemos ver inmediatamente la información de la tarea 107 en DevTrack: título, comentarios, propietario,etc:

    Y una vez que se haya realizado la tarea, haciendo doble click en el diálogo o click en el botón de la extensión, podemos ir a las tareas en DevTrack, cambiar el estado o cualquier otra información de la tarea, que se refrescará en la información de Plastic:

    ¡Así de sencillo!

    0 comentarios: