Ejecutar ramas de funciones con Bitbucket Pipelines

Aprende a realizar la entrega continua con un flujo de trabajo de rama de funciones o Gitflow. 

Sten Pittet Sten Pittet

Tanto si usas Gitflow como si simplemente utilizas ramas de funciones con una rama maestra, con Bitbucket Pipelines te será muy sencillo adoptar la entrega continua (CD). No es necesario configurar un servidor de integración continua (CI) complejo, solo tienes que habilitar Pipelines y definir tus flujos de trabajo para ejecutar pruebas e implementaciones en tus ramas.

Bitbucket Pipeline

En este tutorial vamos a ver cómo puedes configurar Bitbucket Pipelines para ejecutar diferentes canalizaciones para diferentes ramas, y cómo proteger tus ramas de fusiones incorrectas.

Paso 1: Comienza con canalizaciones predeterminadas que se ejecutarán en ramas de funciones

Usar ramas de funciones es una manera excelente de evitar que la rama maestra se dañe a menudo. Los desarrolladores pueden trabajar en una mejora concreta en una rama independiente y fusionar sus cambios cuando su compilación tenga luz verde. Sin embargo, esta situación no significa que sea menos importante mantener la estabilidad de tus ramas de funciones. Para que la colaboración sea perfecta, es igual de importante mantener las ramas de funciones en buen estado. Las ramas de funciones sirven para saber qué cambios se han realizado para resolver una incidencia concreta y no deben tomarse como una oportunidad para retrasar la calidad.

Así, lo primero que hay que hacer al habilitar Bitbucket Pipelines es crear una canalización predeterminada que ejecute pruebas para cada rama. Hacerlo es tan sencillo como elegir una de las plantillas predeterminadas disponibles.

Configuración de canalización JavaScript predeterminada

Todas las plantillas específicas de lenguaje utilizan una canalización predeterminada con la palabra clave predeterminada que se ejecutará con cada nueva rama que se envíe. Para que la primera canalización se ejecute en la rama maestra, puedes incorporar el archivo de configuración bitbucket-pipelines.yml al repositorio.

Nuestra primera canalización ejecutada para una rama maestra

Puedes enviar una nueva rama con cambios en ella para verificar que la misma canalización se ejecuta en otra rama.

Paso 2: Añadir un nuevo canal para la rama principal

Si practicas la entrega continua, será muy probable que quieras que los cambios enviados a la rama principal se implementen de forma automática desde un entorno de ensayo. Para ello, añadiremos un nuevo canal de rama que implemente el código después de ejecutar las pruebas, y solo se ejecuta para la rama principal.

image: node:4.6.0
   pipelines:
   default:
     - step:
         script:
           - npm install
           - npm test
   branches:
     master:
       - step:
           script:
             - npm install
             - npm test
             - ./deploy.sh  

En la sección de ramas de la configuración de YML se define la canalización que queremos ejecutar cuando los cambios se envían a la rama maestra.

A partir de este momento, los envíos a una rama maestra desencadenarán una implementación después de haber compilado y probado la aplicación. Cualquier otra rama del repositorio simplemente compilará y probará los nuevos cambios.

Paso 3: Protege tus ramas de publicación

Después de llevar a cabo el segundo paso, cualquier desarrollador puede desencadenar una publicación a producción con tan solo fusionar sus cambios en la rama maestra. Es una situación arriesgada porque por error alguien podría implementar cambios que aún no están revisados. Por suerte, en Bitbucket puedes evitarlo fácilmente agregando permisos a tus ramas.

Ve a Configuración > Permisos de rama en tu repositorio.

Branch permissions

Añade un nuevo permiso de rama para la rama maestra y deja el permiso de escritura en blanco para que los desarrolladores no puedan hacer envíos directamente a la rama maestra. Luego, asígnate el permiso Fusionar mediante solicitud de incorporación de cambios.

Adding a branch permission

Antes de guardar el nuevo permiso de rama, añadiremos un control de fusión para asegurarnos de que no se autorizan fusiones a menos que haya como mínimo una compilación con luz verde. Para habilitar la función correspondiente, basta con expandir la sección de controles de fusión.

Adding a branch permission

Después de guardar, puedes comprobar que la rama está protegida correctamente. Ningún usuario o grupo debe tener derecho de escritura y la fusión se debe autorizar mediante una solicitud de incorporación de cambios para los miembros de confianza del equipo.

Paso 4: Utiliza la solicitud de incorporación de cambios para promover cambios en la producción

Al no poder enviar directamente a la rama maestra, tendrás que usar solicitudes de incorporación de cambios para implementar en producción. Una vez creada la solicitud de incorporación de cambios, solo hay que fusionar los cambios en la rama maestra para desencadenar la canalización de implementación.

Bitbucket pull request

Después de la fusión, puedes ir a la sección Pipelines del repositorio para ver la implementación en acción.

Bitbucket pipeline logs

Hemos visto los conceptos básicos de ejecutar ramas de funciones con Bitbucket Pipelines. Puedes adaptar este ejemplo a tus necesidades y crear tu propia canalización de entrega continua. También puedes obtener más información con nuestras guías sobre entrega continua e implementación continua.