Ir para o conteúdo principal

Proposta de padronização versionamento e deploys

Este documento trás uma propossta de versionamento de branches após deploys em produção, assim como auxiliar no fluxo ideal à ser utilizado no desenvolvimento de softwares.

O versionamento e o fluxo de branches são práticas fundamentais no desenvolvimento de softwares que visam aprimorar a colaboração, o controle de qualidade e a eficiência do processo de desenvolvimento. A importância dessas práticas pode ser resumida da seguinte forma:

Versionamento:

  1. Rastreabilidade: O versionamento permite rastrear alterações específicas no código-fonte ao longo do tempo. Isso é essencial para entender o histórico de desenvolvimento, identificar a origem de problemas e facilitar a auditoria.

  2. Colaboração: Equipes de desenvolvimento podem trabalhar em paralelo, cada uma em sua própria versão do código, e depois mesclar suas contribuições. Isso melhora a colaboração, evita conflitos e permite um desenvolvimento mais rápido.

  3. Gestão de Versões: O versionamento ajuda a controlar e distribuir diferentes versões do software. Isso é crucial para fornecer atualizações e correções de bugs aos usuários sem comprometer as versões existentes.

  4. Experimentação e Testes: Ramificações específicas podem ser criadas para testar novos recursos ou correções sem interferir na versão principal. Isso permite testes exaustivos antes de incorporar mudanças na versão estável.

  5. Rollback Eficiente: Se um problema é detectado em uma nova versão, é possível reverter facilmente para uma versão anterior usando o sistema de versionamento.

Fluxo de Branches:

  1. Isolamento de Mudanças: O uso de branches separados permite que diferentes recursos ou correções sejam desenvolvidos independentemente, isolando-os uns dos outros. Isso minimiza o risco de conflitos e mantém a estabilidade do código principal.

  2. Desenvolvimento Contínuo: O fluxo de branches suporta desenvolvimento contínuo, permitindo que a equipe trabalhe em várias funcionalidades ao mesmo tempo sem afetar a integridade do código principal.

  3. Testes e Validação: As ramificações facilitam a realização de testes dedicados para cada nova funcionalidade ou correção. Isso ajuda a identificar problemas precocemente e a garantir a qualidade do software.

  4. Ciclo de Feedback: O fluxo de branches permite a revisão de código e o fornecimento de feedback antes de mesclar as mudanças no ramo principal. Isso melhora a qualidade do código e a troca de conhecimento entre os membros da equipe.

  5. Deploy Gradual: A separação de funcionalidades em diferentes ramificações permite implantar novos recursos de forma gradual, evitando interrupções drásticas no sistema.

Em resumo, o versionamento e o fluxo de branches são práticas cruciais para o desenvolvimento de softwares eficiente e organizado, permitindo o controle preciso das mudanças, a colaboração harmoniosa entre desenvolvedores e a entrega de software de alta qualidade aos usuários. A imagem abaixo ilustra bem, o que seria um fluxo bem definido na solução de desenvolvimento de features em um sistema.

FLUXO DE BRANCHES:

image.png

Considerando a imagem acima, temos inicialmente uma branch de desenvolvimento da qual ramificará, para outras features. Mas observe, toda feature deve ir para a branch de desenvolvimento.

Ao final do ciclo, com todas as alterações que foram validadas nasce uma branch temporária onde serão compiladas todas as features feitas naquele ciclo, e com isso são deployadas no ambiente STAGING em seguida, deployadas no ambiente de PRODUÇÃO.

Os HOTFIX realizados diretamente no ambiente de PRODUÇÃO, devem ser mergeados na branch de DESENVOLVIMENTO e em seguida subidos para a branch de STAGING. Para que os ambientes anteriores possuam aquele HOTFIX realizado anteriormente.

VERSIONAMENTO:

O versionamento, consiste em versionar cada deploy/release criado naquele sistema após a compilação de features validadas pelo QA e Product Owner, basicamente seguimos o versionamento semântico. 

O versionamento semântico geralmente adere a um formato de número de versão composto por três números separados por pontos: MAJOR.MINOR.PATCH. Cada um desses números tem um significado específico:

  1. MAJOR: O número de versão "MAJOR" é incrementado quando há mudanças significativas que incluem funcionalidades novas ou alteradas de forma incompatível com versões anteriores. Isso indica que a nova versão pode exigir ajustes ou atualizações por parte dos usuários ou desenvolvedores que dependem do software.

  2. MINOR: O número de versão "MINOR" é incrementado quando novas funcionalidades são adicionadas de maneira compatível com versões anteriores, ou seja, sem quebras de compatibilidade. Geralmente, isso inclui adições que ampliam a funcionalidade existente.

  3. PATCH: O número de versão "PATCH" é incrementado quando são feitas correções de bugs ou ajustes menores que não afetam a funcionalidade geral ou a compatibilidade com versões anteriores.

Além desses três números, o versionamento semântico também pode incluir informações opcionais, como "pré-lançamentos" (pre-release) e "metadados" (metadata), que fornecem detalhes adicionais sobre a versão.

A importância do versionamento semântico reside na sua capacidade de fornecer uma estrutura clara e padronizada para comunicar as mudanças em um software. Isso facilita a tomada de decisões informadas sobre atualizações, ajuda a evitar quebras inesperadas em sistemas dependentes, simplifica a gerência de dependências e contribui para uma colaboração mais eficiente entre equipes de desenvolvimento. Em essência, o versionamento semântico ajuda a manter a ordem e a previsibilidade no ciclo de vida do software.

COMO APLICAMOS ISSO NO GITLAB?

Bom, para criarmos essa prática dentro do gitlab, imaginemos que ao fim de uma SPRINT, temos várias features para subir, após realizar o merge na branch de PRODUÇÃO, vamos criar uma tag para essa versão, seguindo o que o versionamento semântico nos diz.

image.png

E após isso, criaremos uma RELEASE no gitlab, para que saibamos qual era o código fonte na ocasião da release, para termos rastreabilidade do código fonte.

image.png