Ventajas de las ramas de función y Bamboo para CI

Al crear ramas, es más sencillo publicar sobre la marcha, pero hay una trampa.

Sepideh Setayeshfar Sepideh Setayeshfar

No es ningún secreto que los desarrolladores necesitan libertad para hacer cambios y ejecutar pruebas sin miedo a estropear la línea de código principal. Y eso es justo lo que les permiten hacer las ramas, el elemento mágico con el que modificar, desarrollar y probar partes del código de forma aislada y en paralelo.

Gracias a Git y Mercurial, crear un gran número de ramas ha pasado de ser un imposible a una realidad, como hemos explicado en Cinco consejos para repositorios de Git compatibles con CI. Sin embargo, a pesar de todas las ventajas, el uso de ramas en una canalización de entrega continua puede crear dos problemas distintos:

Requisitos

Duración:

30 minutos

Público:

Usuario sin experiencia en la implementación continua y/o Bitbucket Pipelines

Requisito previo:

Pruébalo gratis

Duplicación y desajustes en las configuraciones de compilación

  • Cuando un desarrollador crea una rama, hay que clonar a mano unas cuantas configuraciones de compilación en el servidor de CI. Al ser un paso manual, algunos desarrolladores lo omiten y, en consecuencia, no se ejecutan pruebas cuando desarrollan la función. Aunque nos tomemos la molestia de copiar las configuraciones de CI para nuestras ramas de función, no es raro tener que hacer algún que otro ajuste. Luego, clonamos las configuraciones retocadas para la siguiente rama de función, hacemos más retoques todavía y, al final, la configuración de la compilación se desvía mucho de la configuración original desde la que se clonó, lo que causa dolores de cabeza para la administración (y desagradables sorpresas al fusionar la rama de nuevo con la rama principal).

Incertidumbre del estado de integración

  • A menos que fusionemos constantemente los cambios de la línea principal (me referiré a ella como "rama principal") en nuestra rama y ejecutemos las pruebas, siempre habrá incertidumbre sobre si nuestros cambios funcionan o no… al menos, hasta que la rama se fusione con la línea principal. Será inevitable que los cambios no funcionen como se esperaba y las ramas principales estarán contaminadas con código roto, ¡con lo que las ramas de función y la CI perderán todo el sentido!

Bamboo ha tratado y resuelto estas incidencias con una función que llamamos ramas de planes, sobre la que hablaremos más detalladamente. ¡Sigue leyendo!

Ramas de plan para ramas de función

Las ramas de plan son elementos del plan de compilación de Bamboo que corresponden a ramas del repositorio. Heredan toda la configuración definida por el plan principal, pero, en lugar de compilar con respecto a la rama principal, lo hacen con respecto a una rama. Una vez terminada correctamente la compilación de la rama, los cambios pueden fusionarse automáticamente desde la rama a la rama principal. Si lo prefieres, las compilaciones correctas de ramas pueden implementarse en un entorno de prueba con las funciones de implementación de Bamboo (esto lo explicamos en otro artículo).

Como puedes ver en la captura de pantalla siguiente, el plan llamado "A CI Tests" no solo compila la rama principal, sino también la rama de integración y unas cuantas ramas dedicadas a incidencias de Jira individuales (por ejemplo, BDEV-10045-bump-tomcat-plugin-5-1). Con Bamboo, es muy sencillo detectar qué planes tienen ramas, ya que muestran el símbolo de rama.

Captura de pantalla de ramas de plan del panel de compilación de Bamboo

Para configurar esto en un plan existente…

  • Inicia sesión como usuario con privilegios de administrador para ese plan.
  • Para ir a la pantalla de configuración, haz clic en el icono de lápiz en el panel de Bamboo o usa el menú de acciones de la pantalla de resultados de compilación.
  • En la pantalla de configuración, haz clic en la pestaña de ramas.

Desde aquí, podemos configurar Bamboo para que detecte automáticamente nuevas ramas en el repositorio y que cree la rama de plan correspondiente. Ten en cuenta que la detección automática de ramas solo está disponible para repositorios de Git, Mercurial y Subversion. Si utilizas otro sistema de control de versiones como TFS o Perforce, no te preocupes: también puedes crear una rama de plan a mano.

Consejo profesional: Probablemente no querrás compilar todas las ramas que crees. Si, en la convención de nomenclatura, todas las ramas que quieres probar comienzan por "feature-*", por ejemplo, puedes configurar Bamboo para que solo cree ramas de plan que coincidan con ese prefijo. (En la configuración, también puedes usar expresiones regulares).

Captura de pantalla de la gestión de ramas de la configuración de Bamboo

Como la mayoría de las ramas de función tienen una vida corta (de 3 a 4 días como máximo), puedes configurar el plan para que la rama y los resultados de compilación se eliminen de Bamboo después de un determinado número de días de inactividad. Puedes desactivar esta opción por rama, si deseas mantenerla durante un tiempo indefinido; en este caso, tendrás que eliminarla a mano. No te preocupes: ya elimines una rama de plan automáticamente o a mano, Bamboo no eliminará la rama de tu repositorio, lo decidirás tú. Dicho esto, deshabilitar la limpieza automática de algunas ramas es una buena opción para aquellos casos en los que podrías mantener una rama "estable" de larga duración de tu proyecto.

Construir cada rama por la vía fácil

Aunque recomendamos encarecidamente utilizar Git, también puedes crear una rama de plan para cualquier sistema de control de versiones compatible con Bamboo. Para crear una rama de plan a mano…

  • Ve a la pantalla de resultados de la compilación del plan y selecciona la opción de Configurar plan en el menú de Acciones.
  • Haz clic en la pestaña de ramas y, a continuación, en el botón para crear una rama.
  • En el caso de Git y Mercurial, se abrirá un cuadro de diálogo con todas las ramas disponibles del repositorio que aún no disponen de una rama de plan correspondiente en Bamboo.
  • Elige una rama y pulsa Crear.
  • Se pedirá a los usuarios de los repositorios centralizados de VCS que elijan un nombre, una descripción y la rama que desean utilizar (en el caso de Subversion, esta es la URL de la rama) antes de pulsar crear.
Captura de pantalla de la creación de rama de plan

Si quieres, ahora puedes deshabilitar la limpieza automática de la rama de plan actual y, en el caso de repositorios de DVCS (sistema de control de versiones distribuido), configurar una estrategia de fusión. Con las estrategias de fusión, Bamboo puede fusionar automáticamente código entre ramas en compilaciones correctas (luego lo veremos con más detalle). En este punto, también es posible anular la información de repositorio (si estás utilizando ramas de plan con Subversion, aquí puedes cambiar la URL SVN de tronco a rama) o anular las variables de compilación. Por ejemplo, puede que en la rama de plan quieras cambiar una variable que especifique si vas a implementar en producción.

Captura de pantalla de la configuración de ramas de la configuración de Bamboo

Como los pasos de compilación para compilaciones de plan principal y para compilaciones de rama de plan son exactamente los mismos, las configuraciones como desencadenadores y notificaciones se heredarán del plan principal. Sin embargo, puedes anular esas configuraciones (y otras) por rama en las configuraciones de cada rama de plan.

Fusión automática de ramas

Como no sabrás si todo funciona hasta que hayas fusionado los cambios con (o desde) la rama principal, Bamboo ofrece dos formas de hacerlo automáticamente en los repositorios del DVCS (sistema de control de versiones distribuido). Estas opciones son el "actualizador de ramas" y el "Gatekeeper," y puedes usar cualquiera de estos métodos en cualquier rama de plan. Antes de que se ejecute la compilación, Bamboo fusionará el estado más reciente de la rama principal en la rama si utilizas el actualizador de ramas, o bien extraerá la rama principal y fusionará los cambios desde la rama si utilizas el Gatekeeper. (Encontrarás más información sobre cómo elegir un modelo de fusión en la documentación de Bamboo.) A continuación, Bamboo pasa a ejecutar la compilación.

Captura de pantalla de fusión de ramas

Si la compilación es correcta y has habilitado la opción para enviar con resultados correctos, la fusión se confirma y se envía al repositorio automáticamente. Si utilizas el modelo del Gatekeeper, los cambios en una rama se envían a la rama principal. Si utilizas el modelo del actualizador de ramas, la rama de función se actualiza con los cambios que se producen en la rama principal.

Captura de pantalla de los detalles de integración de resultados de compilación de Bamboo

¡Esto sí que es integración continua!

Como ya he dicho, las ramas de plan pueden conectarse con proyectos de implementación y convertirse en parte de esa fase del ciclo de entrega continua. Sigue leyendo para obtener más información.