Mi equipo actualmente utiliza un proceso de ramificación / implementación bastante simple que se ve así:
┌────────┐ ┌────┐ ┌──────┐
Environments: │ DEV │ │ QA │ │ PROD │
└────────┘ └────┘ └──────┘
▲ ▲ ▲
│ │ │
┌────────┐ ┌────┐ ┌──────┐
Builds: │ DEV │ │ QA │ │ PROD │
└────────┘ └────┘ └──────┘
▲ ▲ ▲
│ │ │
┌────────┐ ┌────┐ ┌──────┐
Branches: │ master │ │ qa │ │ prod │
└────────┘ └────┘ └──────┘
Cada entorno tiene su propia rama (usamos git ) y su propia compilación que usa esa rama. Cuando queremos promover de un entorno a otro, por ejemplo, desde DEV a QA, fusionamos la master
rama qa
y lanzamos una nueva compilación de QA (que luego se implementa automáticamente en el entorno de QA).
Estamos considerando pasar a un nuevo proceso que eliminaría tener una sucursal dedicada y construir para cada entorno. En cambio, una versión de lanzamiento única crearía un "paquete de implementación" que luego podría implementarse en cualquier entorno. Estamos imaginando que un flujo de trabajo típico se vería así:
┌────────┐ ┌────┐ ┌──────┐
Environments: │ DEV │ ──► │ QA │ ──► │ PROD │
└────────┘ └────┘ └──────┘
▲
\
┌───────────────┐
Builds: │ release build │
└───────────────┘
▲
│
┌────────┐ ┌─────────┐
Branches: │ master │ │ release │
└────────┘ └─────────┘
La promoción de un entorno a otro ya no se manejaría en el control de origen; más bien, simplemente tomamos los binarios ya construidos (el "paquete de implementación") y los colocamos en el nuevo entorno.
Este nuevo sistema nos permitiría implementar cualquier compilación en cualquier entorno, lo que tiene varias ventajas. Por ejemplo, es trivial probar las correcciones de errores de PROD en DEV y QA. Nuestro sistema actual no proporciona una manera fácil de hacer esto sin deshacer una rama, lo que obviamente nos gustaría evitar.
El mayor inconveniente de este nuevo sistema es que ya no tenemos una forma automática de rastrear qué código se encuentra en qué entorno. Si necesitamos hacer una corrección en PROD, ya no tenemos una rama dedicada sincronizada con la base de código de producción actual. Lo mismo ocurre con el control de calidad: si queremos impulsar un cambio rápido al control de calidad sin desenterrar el trabajo en curso master
, ya no tenemos una rama que refleje el estado actual del entorno de control de calidad.
¿Cómo podemos hacer un seguimiento de qué código hay en cada entorno?
Algunas opciones que estamos considerando:
- utilizando etiquetas git para realizar un seguimiento de qué confirmación se encuentra en qué entorno
- incrustando el git commit utilizado por la compilación en cada paquete de implementación