Vincent Driessen en su blog GitFlow- A successfull Branching Model, describe el casi proceso de facto que aplican muchos equipos de desarrollo para la gestión de ramas (aunque prefiero la explicación y gráficos de AtlassiangitFlow Workflow.)-.
En esta entrada, intento explicar por qué, al menos en mi caso, no es directa su aplicación en un proyecto de Salesforce y las consideraciones adicionales y conclusiones a las que he llegado.
Hago un repaso muy muy breve, de las premisas de gitFlow:
- The
master
branch stores the official release history - The
develop
branch serves as an integration branch for features - Each new feature should reside in its own branch. But, instead of branching off of
master
, feature branches use develop as their parent branch. When a feature is complete, it gets merged back intodevelop
- Features should never interact directly with
master
. - Once
develop
has acquired enough features for a release, you fork a release branch off ofdevelop
. Creating this branch starts the next release cycle, so no new features can be added after this point - Once it’s ready to ship, the release gets merged into
master
and tagged with a version number.

Liora Milbaum en SlideShare
¿Cómo mapeamos este proceso en un proyecto de Salesforce?
Supongamos un mapa de entornos de Sandboxes de un proyecto medianto tal que existen los entornos:
- Desarrollo
- Integración
- QA / User Acceptance Test
- Rendimiento / Formación / Pre-Producción
- Producción
Además supongamos que nuestro proyecto/cliente introduce las siguientes restricciones (son las que me impongo para asegurar unas premisas de calidad del proceso de Integracioón Continua – cada uno tendrá las suyas pero creo que estas pueden ser comunes a todos nuestros proyectos):
- No se puede realizar ningún trapaso a un entorno que no haya sido probado en un entorno anterior
- Esto implica introducir el concepto de dependencia de entornos. Los entornos 1-2-3-4-5, los consideramos dependientes en cascada, es decir, no es posible incorporar nuevas funcionalidades a un entorno posterior, que no haya sido incorporada y probada en un entorno anterior (aquí no entro en la cosnideración de correctivos urgentes, que siguen otro camino)
- Todos los despliegues de funcionalidades deben proceder de una rama de la herramienta de control de versiones (aka Bitbucket), no es posible modificar el entorno directamente mediante manipulación de Setup y solo se permiten cambios de objetos no soportados por la metadata
Existen otras como replicación de datos maestros, replicación de configuraciones y objetos que no soporta la metadata, pero alargan esta entrada demasiado.
En esta situación se observa que, con 2 ramas en el gitFlow Workflow (+ ramas Feature) y con 5 entornos, y los condicionantes expuestos, el procedimiento debe adaptarse.
Una solución (propuesta)
Mi propuesta de solución es:
- Cada Sandbox tiene una rama en Bitbucket.
- Solo la rama de Desarrollo puede recibir Commits mediante Push
- El resto de ramas solo pueden recibir operaciones de Merge procedente de la rama precedente (cascada cacofónica :-)), forzando así que toda nueva funcionalidad, ha sido al menos desplegada en el entorno anterior (y esperemos validada satisfactoriamente por los equipos resposanbles)
- La operación de Merge, provoca un trigger del sistema de integración contínua, que ejecuta deploy por diferencias (artículo más adelante)
- Por tanto, la rama master, que corresponde al entorno de Producción, solo puede recibir nuevas funcionalidades de la rama que pertenece al entorno de Rendimiento / Formación / Pre-Producción
- Debe existir la figura del Release Manager que se responsabilice de este procedimiento y de evitar llaneros solitarios.
Hay varios temas que quedan en el aire como: despliegue de metadatos no soportados por la Metadata API, despliegue de Datos maestros, ni he mencionado la gestión de Hot Fix, pero espero que con la entrada pueda ayudar a los que se plantean usar gitFlow y plantearse como adoptarlo.
Deja una respuesta