Atualmente, minha equipe usa um processo de ramificação / implantação bastante simples, semelhante a este:
┌────────┐ ┌────┐ ┌──────┐
Environments: │ DEV │ │ QA │ │ PROD │
└────────┘ └────┘ └──────┘
▲ ▲ ▲
│ │ │
┌────────┐ ┌────┐ ┌──────┐
Builds: │ DEV │ │ QA │ │ PROD │
└────────┘ └────┘ └──────┘
▲ ▲ ▲
│ │ │
┌────────┐ ┌────┐ ┌──────┐
Branches: │ master │ │ qa │ │ prod │
└────────┘ └────┘ └──────┘
Cada ambiente tem sua própria ramificação (usamos git ) e sua própria compilação que usa essa ramificação. Quando queremos promover de um ambiente para outro, por exemplo, do DEV ao controle de qualidade, mesclamos a master
ramificação qa
e iniciamos uma nova compilação de controle de qualidade (que é implantada automaticamente no ambiente de controle de qualidade).
Estamos pensando em mudar para um novo processo que acabaria com uma filial dedicada e a construção para cada ambiente. Em vez disso, uma compilação de versão única criaria um "pacote de implantação" que poderia ser implantado em qualquer ambiente. Estamos imaginando que um fluxo de trabalho típico seria algo como isto:
┌────────┐ ┌────┐ ┌──────┐
Environments: │ DEV │ ──► │ QA │ ──► │ PROD │
└────────┘ └────┘ └──────┘
▲
\
┌───────────────┐
Builds: │ release build │
└───────────────┘
▲
│
┌────────┐ ┌─────────┐
Branches: │ master │ │ release │
└────────┘ └─────────┘
A promoção de um ambiente para outro não seria mais tratada no controle de origem; em vez disso, pegamos os binários já criados (o "pacote de implantação") e os lançamos no novo ambiente.
Esse novo sistema nos permitiria implantar qualquer build em qualquer ambiente, o que tem várias vantagens. Por exemplo, é trivial testar as correções de PROD no DEV e QA. Nosso sistema atual não fornece uma maneira fácil de fazer isso sem reverter uma ramificação, o que obviamente gostaríamos de evitar.
A maior desvantagem desse novo sistema é que não temos mais uma maneira automática de rastrear qual código está em qual ambiente. Se precisarmos corrigir o PROD, não teremos mais uma ramificação dedicada sincronizada com a base de código de produção atual. O mesmo vale para o controle de qualidade - se queremos fazer uma alteração rápida no controle de qualidade sem dragar o trabalho em andamento master
, não temos mais uma filial que reflete o estado atual do ambiente de controle de qualidade.
Como podemos acompanhar o código em cada ambiente?
Algumas opções que estamos considerando:
- utilizando tags git para acompanhar qual commit está em qual ambiente
- incorporando o commit git usado pela compilação em cada pacote de implantação