Explore o modelo de filial Git para entrega contínua

Concluído

A entrega bem-sucedida de software depende de uma estratégia de ramificação que equilibre velocidade, qualidade e gerenciamento de riscos. O objetivo é enviar melhorias rapidamente, mantendo a estabilidade da produção.

Equilíbrio Estratégico: Velocidade vs. Qualidade

Um modelo de ramificação eficaz deve encontrar o equilíbrio certo:

  • Minimize a sobrecarga do processo para acelerar o tempo de entrada no mercado.
  • Mantenha portões de qualidade para evitar que os defeitos cheguem à produção.
  • Habilite o desenvolvimento paralelo para escalabilidade da equipe.
  • Suporte a implantação rápida de hotfix para problemas críticos.

Embora existam inúmeras estratégias de ramificação Git, a abordagem mais eficaz combina padrões comprovados com as necessidades específicas da sua equipe. As equipes corporativas modernas normalmente adotam um modelo de desenvolvimento leve e baseado em tronco, centrado em ramificações de recursos e solicitações pull.

Princípio Fundamental: Sempre Pronto Ramo Principal

Esta unidade ensina a implementar um modelo de ramificação pronto para entrega contínua usando ramificações de funcionalidades e pull requests para manter sempre implantável a ramificação principal.

Estrutura de estratégia de ramificação empresarial

Os seguintes princípios estabelecem uma base sólida para a entrega contínua:

Estabilidade do ramo principal

  • Única fonte de verdade: O ramo principal é o caminho exclusivo para lançamentos de produção.
  • Prontidão para produção: A ramificação principal deve estar sempre em um estado implantável.
  • Proteção de ramificação: implemente políticas abrangentes de ramificação para evitar confirmações diretas.
  • Alterações fechadas: Todas as modificações fluem exclusivamente através de solicitações pull.
  • Acompanhamento de lançamento: marque todas as versões de produção com tags semânticas do Git.

Disciplina da Ramificação de Funcionalidades

  • Desenvolvimento isolado: crie ramificações dedicadas para todos os recursos e correções de bugs.
  • Integração de sinalizadores de recursos: gerencie recursos de longa execução com alternâncias de recursos para reduzir a vida útil das ramificações.
  • Nomenclatura estratégica: use convenções de nomenclatura descritivas que reflitam o valor comercial.
  • Fluxo de trabalho de solicitação pull: mescle para o principal exclusivamente por meio de solicitações pull revisadas.

Estratégia de ramificação de lançamento

  • Preparação dedicada: crie ramificações de versão a partir de pontos de integração de funções estáveis.
  • Garantia de qualidade: Realizar testes completos e estabilização em ramificações de liberação.
  • Fortalecimento de produção: Aplique correções finais de bugs e otimizações de desempenho.
  • Rastreamento de marcos: marque marcos de lançamento significativos para rastreabilidade.

Convenções de nomenclatura para escala

# Bug fixes
bugfix/[ticket-id]-description
bugfix/AUTH-123-login-timeout

# Feature development
features/[area]/[feature-name]
features/authentication/oauth-integration
features/api/rate-limiting

# Hotfixes
hotfix/[severity]-description
hotfix/critical-payment-gateway

# Personal branches
users/[username]/[description]
users/john-doe/experimental-caching

Gestão de Pull Request

  • Revisão obrigatória do código: Sem exceções para fusões diretas à principal.
  • Validação automatizada: integre pipelines de CI/CD para portas de qualidade.
  • Métricas de desempenho: acompanhe e otimize o tempo de conclusão da solicitação pull.
  • Compartilhamento de conhecimento: use avaliações para aprendizado em equipe e aplicação de padrões.

Pré-requisitos e configuração

Ferramentas essenciais para fluxos de trabalho Git empresariais

Este exercício prático aproveita a abrangente cadeia de ferramentas de DevOps do Azure:

  • CLI do Azure: interface de linha de comando nativa da nuvem para serviços do Azure.
  • CLI do Azure DevOps: Extensão especializada para integração perfeita de ferramentas Git, CI/CD e Agile no Windows, Linux e macOS.

Configuração da CLI do Azure DevOps

A CLI do Azure DevOps fornece formatação de saída flexível (JSON, YAML, tabela, TSV) para dar suporte a vários cenários de automação. Configure seu formato preferido usando:

az devops configure --defaults output=table

Implementação Prática: Fluxo de Trabalho Git Empresarial

Este passo a passo abrangente demonstra ramificação de nível empresarial no Git para entrega contínua, abrangendo desenvolvimento de funcionalidades, implementação de correções rápidas e resolução de conflitos.

Etapa 1: Criação e desenvolvimento do ramo de funcionalidades

Crie uma ramificação de recurso seguindo as convenções de nomenclatura da empresa:

myWebApp

git checkout -b feature/myFeature-1

Saída:Alternado para uma nova ramificação 'feature/myFeature-1'.

Verifique o contexto da ramificação e o status da árvore de trabalho:

myWebApp

git branch

Saída:✓ feature/myFeature-1

  • principal*

Etapa 2: Implementação de recursos e controle de versão

Implemente as alterações de funcionalidades.

myWebApp

# Edit your source files
code Program.cs  # Or your preferred editor

Siga o ciclo de vida completo do commit:

myWebApp

git status

Saída:Recurso de ramificação/myFeature-1Alterações não preparadas para confirmação:

  • Modificado: Program.cs*

myWebApp

git add .
git commit -m "feat: implement myFeature-1 with enhanced error handling"

Saída:[feature/myFeature-1 70f67b2] feat: implementar myFeature-1 com tratamento de erros aprimorado1 arquivo alterado, 1 inserção (+)

Publicar no repositório remoto:

myWebApp

git push -u origin feature/myFeature-1

Saída:Para https://dev.azure.com/organization/teamproject/_git/MyWebApp

  • [new branch] feature/myFeature-1 -> feature/myFeature-1Branch feature/myFeature-1 configurado para rastrear o recurso de ramificação remota/myFeature-1 desde a origem.

Etapa 3: Configuração da CLI do Azure DevOps e criação de solicitação pull

Configure a CLI do Azure DevOps para sua organização e projeto. Substitua o nome da organização e do projeto:

az devops configure --defaults organization=https://dev.azure.com/organization project="project name"

Crie um novo pull request (usando a CLI do Azure DevOps) para rever as alterações na branch feature-1:

az repos pr create --title "Review Feature-1 before merging to main" --work-items 38 39 `
--description "#Merge feature-1 to main" `
--source-branch feature/myFeature-1 --target-branch main `
--repository myWebApp --open

Use a opção --open ao gerar o pull request para abri-lo em um navegador web depois de criado. O --deletesource-branch switch pode ser usado para excluir a ramificação após a conclusão da solicitação pull. Além disso, considere usar --auto-complete para concluir automaticamente quando todas as regras tiverem sido aprovadas e a ramificação de origem puder ser integrada na ramificação de destino.

Nota

Para obter mais informações sobre az repos pr create parameter, consulte Criar uma solicitação pull para revisar e mesclar código.

A equipe analisa conjuntamente as alterações de código e aprova a solicitação pull:

Captura de tela da solicitação pull com alterações de código aprovadas e concluídas.

A versão principal está pronta para ser lançada. A equipe marca a ramificação principal com o número da versão:

Captura de ecrã da criação de um exemplo de etiqueta.

Etapa 4: Desenvolvimento paralelo de funcionalidades

Comece a trabalhar na Funcionalidade 2. Crie uma ramificação remota da ramificação principal e faça o checkout localmente:

myWebApp

git push origin main:refs/heads/feature/myFeature-2

Output:Total 0 (delta 0), reutilizado 0 (delta 0) Para https://dev.azure.com/**organization**/**teamproject**/\_git/MyWebApp * [nova ramificação] origin/HEAD -> refs/heads/feature/myFeature-2.

myWebApp

git checkout feature/myFeature-2

Saída:Alterado para um novo ramo 'feature/myFeature-2'. O ramo feature/myFeature-2 foi configurado para rastrear o ramo remoto feature/myFeature-2 a partir da origem.

Modifique Program.cs alterando a mesma linha de comentário no código alterado no recurso-1:

```
public class Program
{
    // Editing the same line (file from feature-2 branch)
    public static void Main(string[] args)
    {
        BuildWebHost(args).Run();
    }

    public static IWebHost BuildWebHost(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>()
            .Build();
```

Etapa 5: Cenário de Pull Request para Recurso 2 e Hotfix

Confirme as alterações localmente, envie-as por push para o repositório remoto e, em seguida, gere uma solicitação pull para mesclar as alterações do recurso/myFeature-2 para a ramificação principal:

az repos pr create --title "Review Feature-2 before merging to main" --work-items 40 42 `
--description "#Merge feature-2 to main" `
--source-branch feature/myFeature-2 --target-branch main `
--repository myWebApp --open

Um bug crítico é relatado na produção em relação à versão feature-1 com o pull request em andamento. Para investigar o problema, necessita fazer debugging em relação à versão do código atualmente implementado em produção. Para investigar o problema, crie uma nova ramificação fof usando a tag release_feature1:

myWebApp

git checkout -b fof/bug-1 release_feature1

Saída:Mudou para uma nova ramificação, 'fof/bug-1'.

Etapa 6: Implementação de hotfix crítico

Modifique Program.cs alterando a mesma linha de código que foi alterada na versão feature-1:

public class Program
{
    // Editing the same line (file from feature-FOF branch)
    public static void Main(string[] args)
    {
        BuildWebHost(args).Run();
    }

    public static IWebHost BuildWebHost(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>()
            .Build();

Prepare e confirme as alterações localmente e, em seguida, envie as alterações por push para o repositório remoto:

myWebApp

git add .
git commit -m "Adding FOF changes."
git push -u origin fof/bug-1

Saída:Para https://dev.azure.com/**organization**/**teamproject**/\_git/MyWebApp * [novo ramo] fof/bug-1 - Ramo fof/bug-1 configurado para rastrear ramo remoto fof/bug-1 de origem.

Etapa 7: Integração de hotfix e resolução de conflitos

Imediatamente após as alterações terem sido implementadas na produção, marque a ramificação fof\bug-1 com a tag release_bug-1 e, em seguida, gere uma solicitação pull para mesclar as alterações de fof/bug-1 de volta à principal:

az repos pr create --title "Review Bug-1 before merging to main" --work-items 100 `
--description "#Merge Bug-1 to main" `
--source-branch fof/Bug-1 --target-branch main `
--repository myWebApp --open

Como parte da solicitação pull, a ramificação é excluída. No entanto, você ainda pode fazer referência a todo o histórico usando a tag .

Com a correção do bug crítico fora do caminho, vamos rever o pull request da feature-2.

A página de ramificações deixa claro que a ramificação feature/myFeature-2 é uma mudança à frente da principal e duas alterações atrás da principal:

Captura de ecrã da página de filiais. O recurso myFeature dois ramos são uma mudança à frente do principal e duas mudanças atrás do principal.

Se você tentasse aprovar a solicitação pull, veria uma mensagem de erro informando sobre um conflito de mesclagem:

Captura de tela de conflitos de mesclagem da solicitação pull.

Resolver conflitos de fusão

Para resolver conflitos de mesclagem, você pode usar a interface Web do Azure DevOps ou resolvê-los localmente usando comandos Git. Para resolução local, primeiro atualize sua ramificação de recursos com as alterações mais recentes da principal:

```CMD
git checkout feature/myFeature-2
git fetch origin
git merge origin/main
```

Resolva os conflitos no seu editor preferido e, em seguida, conclua a mesclagem:

```CMD
git add .
git commit -m "Resolve merge conflicts between feature-2 and main"
git push origin feature/myFeature-2
```

Com os conflitos resolvidos, a solicitação pull pode ser concluída com êxito.

Neste ponto, você pode criar uma ramificação de versão com base na correção de bug crítico implementada na ramificação fof/bug-1 e mesclada na principal. Usando o comando git checkout, crie uma ramificação de liberação dedicada a partir da ramificação principal.

git checkout -b release/v1.1 main

Este comando cria uma nova ramificação chamada release/v1.1 com base na ramificação principal.

À medida que marcos significativos são alcançados durante o processo de lançamento, etiquete as versões no ramo de lançamento usando tags Git. As tags servem como marcadores para indicar versões específicas do software.

git tag -a v1.1 -m "Release version 1.1"

Este comando cria uma tag chamada v1.1 para marcar a versão de lançamento 1.1 na ramificação de lançamento.

Como funciona

Aprendemos como o modelo de ramificação Git oferece a flexibilidade de trabalhar em recursos em paralelo, criando uma ramificação para cada recurso.

O fluxo de trabalho de solicitação pull permite que você revise as alterações de código usando as políticas de ramificação.

As tags Git são uma ótima maneira de registrar marcos, como a versão do código liberada; oferecem uma maneira de criar ramificações a partir de tags.

Criamos uma ramificação a partir de uma tag de lançamento anterior para corrigir um bug crítico na produção.

A visualização de ramificações no portal da Web facilita a identificação de ramificações antes da principal. Além disso, força um conflito de mesclagem se quaisquer pull requests em andamento tentarem mesclar com o ramo principal sem resolver os conflitos de mesclagem.

Um modelo de ramificação enxuta permite criar ramificações de curta duração e empurrar as mudanças de qualidade para a produção mais rapidamente.