Uso de implementaciones basadas en ramas en tu canal de entrega continua

Una de las preguntas que debemos resolver es la del destino de la entrega continua (y el origen, por cierto).

Sarah Goff-Dupont Sarah Goff-Dupont

Solemos utilizar términos como "canalización" para describir el flujo ininterrumpido de código que va desde el repositorio hasta los usuarios. Sin embargo, puesta sobre el papel, la canalización se parece más a una red, sobre todo si se utiliza un flujo de trabajo de creación de ramas y fusiones (lo que, dicho sea de paso, recomendamos encarecidamente).

Si estás desarrollando con una rama, conviene que tengas tu propia ruta de implementación para que los cambios puedan probarse a fondo antes de fusionarse con la rama principal, o incluso publicarse directamente a los clientes. Como verás, las herramientas de desarrollo de Atlassian soportan las implementaciones de ramas bastante bien.

Para empezar, vamos a revisar los tres casos de uso principales; después, repasaremos las integraciones entre Jira Software, Bitbucket y Bamboo que te servirán para la puesta en práctica.

Uso en implementaciones basadas en rama

En esencia, el motivo para integrar tu red de ramas en una canalización de entrega continua es la comodidad. Si compartes un entorno de pruebas con otros compañeros de equipo, es más fácil coordinar una cadencia de implementaciones que representan flujos de trabajo discretos que fusionar todos los flujos antes de implementar las pruebas y tener que volver a separarlos cuando haya que hacer los (inevitables) cambios.

Si tienes la suerte de tener varios entornos de prueba disponibles, aún lo tienes más fácil. Al igual que al publicar para clientes, a algunos equipos les gusta publicar directamente desde ramas y, luego, fusionar las actualizaciones desde la rama hasta la rama principal.

Desencadenamiento automático de implementaciones desde una rama de funciones

Usar ramas de funciones para historias de usuario y correcciones de errores es una manera excelente de enviar cambios a tu repositorio de Bitbucket (y permitir que CI los ejecute) sin someter al resto del equipo a compilaciones defectuosas y pruebas fallidas con el trabajo en progreso.

Si tu equipo prefiere lanzar desde la rama principal, probablemente querrás implementar ese código en entornos internos para realizar pruebas exploratorias y de aceptación. Aquí lo ideal es que haya un puñado de entornos de prueba en los que el equipo pueda implementar y que nadie tenga que esperar su turno para usar un único entorno compartido.

Con las implementaciones de rama de Bamboo, puedes configurar el desencadenador de implementación de cualquier entorno para implementar automáticamente los artefactos compilados en una rama determinada, ya sea a intervalos programados o con cada compilación de CI correcta de la rama. Incluso puedes combinar los dos tipos de desencadenador.

Captura de pantalla de un entorno de prueba

Supongamos que tienes un único entorno de pruebas de rendimiento que comparte todo el mundo. A lo largo del día, implementas la rama principal siempre que hay compilaciones correctas. Para la mayoría de los equipos aficionados a las ramas, las compilaciones de la rama principal suelen ser el resultado de la fusión de nuevo trabajo, por lo que te convendría comprobar el rendimiento desde el primer momento.

Por la noche, cuando el repositorio está inactivo, programas implementaciones desde la rama de cada desarrollador; lo haces a intervalos apropiados para que todos reciban feedback sobre el rendimiento de su trabajo al menos una vez al día. (Las tareas de implementación de Bamboo pueden concluir con una tarea Mavent, Ant o script que pone en marcha las pruebas de rendimiento). Al mismo tiempo, los desarrolladores pueden usar desencadenadores de implementación automática para enviar compilaciones a sus entornos de prueba individuales, siempre que su rama de funciones se compile correctamente.

Para configurar esto, puedes crear un proyecto de implementación discreta en Bamboo para tu rama de desarrollo o asociar tu rama a un entorno dentro de un proyecto de implementación, personalizando cómo se desencadenan las implementaciones en el entorno.

Captura de pantalla de creación de un proyecto de implementación

En la documentación de Bamboo encontrarás instrucciones detalladas sobre cómo asociar un proyecto de implementación con una rama y personalizar desencadenadores de implementación .

Publicar desde una rama de publicación

Para los equipos que prefieren poner el trabajo en progreso directamente en la línea de código principal, resulta más atractivo publicar desde una rama. Mientras que la rama principal o tronco se implementa en el entorno de prueba, las ramas de publicación son las que se implementan en el entorno de ensayo y, finalmente, en producción. Las ramas de publicación también pueden ser parte del concepto de Gitflow.

Captura de pantalla de Gitflow

Las ramas de publicación se cortan periódicamente y se envían cambios desde allí. Además, la mayoría de los equipos no quieren utilizar desencadenadores automatizados, sino que prefieren que sean personas quienes decidan cuándo y dónde implementar una rama de publicación. No es ningún problema.

Bamboo incorpora el concepto de "publicaciones", entidades dentro de Bamboo que encapsulan los artefactos más recientes construidos a partir de una rama determinada, además de todas las confirmaciones, resultados de pruebas e incidencias de Jira asociados con todas las compilaciones de esa rama desde la última vez que se creó una publicación. En esencia, una publicación es la suma de tus artefactos empaquetados con una gran cantidad de metadatos.

Todos deseamos que esos datos ricos y jugosos fluyan por tu canalización de entrega continua junto con los artefactos para que puedas trazarlos todos hasta la primera confirmación y la historia de usuario con la que empezó todo (creo que fue Geoffrey Chaucer el primero que dijo eso de "Todos los caminos llevan a Jira Software"). Entonces, teóricamente, es la versión lo que promueves a través de tus entornos, no solo una compilación. Lo verás reflejado en la interfaz de usuario de Bamboo.

Captura de pantalla de publicaciones de entorno de ensayo del entorno Bamboo

Pero ahora, volvamos a los desencadenadores. Cuando las implementaciones se desencadenan automáticamente, como en el caso anterior, Bamboo crea una publicación automáticamente.

Las implementaciones "con pulsar un botón" son algo diferente. En este caso, creas la publicación (puedes hacerlo desde una pantalla de resultados de compilación o desde un proyecto de implementación), le das un nombre y seleccionas la compilación desde la que incorporar artefactos. Con la publicación disponible, puedes implementarla en cualquier entorno, incluso directamente en producción, si es lo que necesitas. Los equipos que adoptan esta estrategia suelen crear varias publicaciones (en realidad, candidatas a la publicación) antes de dar a una el sello de aprobación y que avance en la canalización.

Cuando llegue el momento de promover la publicación al entorno siguiente, ve a la pantalla de todos los proyectos de implementación, donde verás todos tus proyectos de implementación (obvio) y todos los entornos asociados a cada proyecto. Haz clic en el icono de implementación junto al entorno de destino y recorre el asistente de vista previa de implementación, seleccionando la opción Deploy an existing release (Implementar una publicación existente) (tal y como se describe con más detalle en el enlace).

Envío de actualizaciones a versiones compatibles

Si tu mundo no es SaaS, probablemente tengas que ofrecer compatibilidad para varias versiones de tu software al mismo tiempo y, de vez en cuando, enviar correcciones críticas, actualizaciones de seguridad de parches multifunción, etc. Esto supone mantener ramas de versión estables durante mucho tiempo (años, probablemente). Las compilaciones a partir de estas ramas suelen implementarse en una ubicación común, como un sitio web o un repositorio externo, donde los clientes pueden incorporar actualizaciones en las versiones que utilizan.

Captura de un workflow de varias versiones

Con estas ramas, la forma más sencilla de convertir compilaciones en publicaciones es con el botón Create release (Crear publicación) que se encuentra en la pantalla de resultados de la compilación que estás enviando. Por supuesto, puedes comenzar en la pantalla de todos los proyectos de implementación, como hemos dicho antes. Sin embargo, como te estás centrando en una compilación muy concreta que quieres enviar (y que no es necesariamente la compilación más reciente de esa rama), si empiezas en la pantalla de resultados de compilación te será más fácil asegurarte de que es la compilación correcta.

Juntando todas las piezas (una canalización de entrega continua cada vez)

Las implementaciones basadas en ramas son la extensión natural de las ramas de plan de Bamboo que, a su vez, son la extensión natural de los esquemas de ramificación que configures para el equipo en Bitbucket. Como he mostrado aquí y examinado a fondo

en otros artículos, hay varios modelos compatibles con CD para elegir.

El esquema de ramificación debe mostrar cómo tu equipo aborda y entrega el trabajo.

Vamos a repasar las distintas piezas:

  • Incidencias de Jira: recuerda que las claves de incidencia son mágicas. Inclúyelas en el nombre de tus ramas y en tus mensajes de confirmación para que todas las confirmaciones, compilaciones e implementaciones (¡incluso las solicitudes de incorporación de cambios!) remitan a la incidencia.
  • Ramas: ¿sabías que si conectas Bitbucket con Jira Software, todas las incidencias tienen un cómodo enlace Crear rama? ¿Y que, si usas ese enlace, la clave de incidencia se añadirá automáticamente al nombre de la rama? Te recomendamos crear una rama para cada incidencia en la que trabajes. Pruébalo en tu próximo sprint, aunque solo sea por diversión.
  • Ramas de plan: si habilitas la gestión automática de ramas, Bamboo detecta automáticamente nuevas ramas en tus repositorios de Git, Mercurial y Subversion. Cuando haces tu primera confirmación, Bamboo ya ha sometido la rama a prueba.
  • Proyectos de implementación: la fase de "entrega" de tu canalización de entrega continua. Asociarás un repositorio y uno o varios entornos con cada proyecto de implementación.
  • Entornos: representación de Bamboo de los entornos de tu red. Cada entorno se puede asociar con diferentes ramas, utilizar diferentes desencadenadores de implementación y usar diferentes pasos (denominados "tareas") para ejecutar una implementación correcta.
  • Publicación: artefactos empaquetados + metadatos. Al examinar una publicación determinada en Bamboo, podrás ver todas las incidencias de Jira (¡porque las claves de incidencia son mágicas!), confirmaciones, resultados de pruebas y artefactos que tenga asociados. Incluso puedes ver en qué entornos se ha implementado y marcarla como aprobada para su promoción a través de la canalización o como rechazada.

Todos los casos de uso que he cubierto aquí los aplica, al menos, un equipo de desarrollo en Atlassian. Algunos equipos incluso usan una combinación de ellos. No miento cuando digo que la transición desde un canal de entrega continua único (o ninguno) a una red de canales basados en ramas llevará más tiempo del que piensas, y pondrá de manifiesto algunos aspectos subóptimos de tus procesos actuales sobre los que deberás trabajar.

Pero no pasa nada, lo importante es que empieces y que nos cuentes cómo te va. Síguenos en la cuenta @Atlassian de Twitter o en el blog de Atlassian para conocer más herramientas de desarrollo, de Git y ágiles.