Testar grátis
7 min leitura Guide 326 of 877

Automatizando Gerenciamento de Branch

Gerenciamento manual de branch é propenso a erro e consome tempo. Fluxos de trabalho automatizados de branch garantem nomeação consistente, limpam branches obsoletos e reforçam padrões de equipe. Este guia cobre estratégias práticas de automação para gerenciamento de branch.

Tipos de Automação de Branch

AutomaçãoBenefícioEsforço
Validação de nomeaçãoConsistênciaBaixo
Auto-delete mergedRepo limpoBaixo
Limpeza obsoletoMenos clutterMédio
Regras de proteçãoPortões de qualidadeBaixo
CI por tipo de branchTestes certosMédio

Nomeação de Branch

Reforçando Convenções

AUTOMAÇÃO DE NOMEAÇÃO DE BRANCH
═══════════════════════════════

PADRÃO DE NOMEAÇÃO:
─────────────────────────────────────
Formato padrão:
├── type/ticket-description
├── Exemplos:
│   ├── feature/AUTH-123-login-flow
│   ├── bugfix/BUG-456-null-pointer
│   ├── hotfix/PROD-789-payment-fix
│   └── chore/DEP-001-update-deps
└── Consistente, parseável

OPÇÕES DE VALIDAÇÃO:
─────────────────────────────────────
1. Hook pre-commit:
   #!/bin/bash
   branch=$(git rev-parse --abbrev-ref HEAD)
   pattern="^(feature|bugfix|hotfix|chore)\/[A-Z]+-[0-9]+-"
   if [[ ! $branch =~ $pattern ]]; then
     echo "Nome de branch inválido: $branch"
     exit 1
   fi

2. Verificação CI:
   - name: Validar nome de branch
     run: |
       if [[ ! "$GITHUB_HEAD_REF" =~ ^(feature|bugfix|hotfix)/ ]]; then
         echo "Nome de branch inválido"
         exit 1
       fi

3. Hook pre-receive (lado servidor):
   ├── Bloqueia branches inválidos no push
   └── Reforço mais forte

LINK PARA TAREFAS:
─────────────────────────────────────
Extraia ticket do branch:
├── Parse nome do branch
├── Link PR para issue automaticamente
├── Atualize status de tarefa
├── Feche tarefa no merge
└── Rastreabilidade completa

Auto-Limpeza

Gerenciando Ciclo de Vida de Branch

AUTOMAÇÃO DE LIMPEZA DE BRANCH
══════════════════════════════

AUTO-DELETE NO MERGE:
─────────────────────────────────────
Configuração GitHub:
├── Settings → General
├── "Automatically delete head branches"
├── Enable ✓
├── Branch deletado quando PR merged
├── Sem limpeza manual
└── Repositório limpo

GitLab:
├── Settings → Repository
├── "Enable auto-delete merged branches"
└── Mesmo comportamento

LIMPEZA DE BRANCH OBSOLETO:
─────────────────────────────────────
Script para encontrar branches obsoletos:

# Encontre branches mais velhos que 30 dias
for branch in $(git branch -r --merged | grep -v main); do
  last_commit=$(git log -1 --format=%ci "$branch")
  days_old=$(( ($(date +%s) - $(date -d "$last_commit" +%s)) / 86400 ))
  if [ $days_old -gt 30 ]; then
    echo "Obsoleto: $branch ($days_old dias)"
  fi
done

LIMPEZA AGENDADA:
─────────────────────────────────────
GitHub Action:
name: Limpeza de Branch
on:
  schedule:
    - cron: '0 0 * * 0'  # Semanal
jobs:
  cleanup:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Deletar branches obsoletos
        run: |
          # Deletar branches merged mais velhos que 14 dias
          for branch in $(git branch -r --merged origin/main); do
            # Pular branches protegidos
            if [[ ! "$branch" =~ (main|develop|release) ]]; then
              git push origin --delete "${branch#origin/}"
            fi
          done

Proteção de Branch

Portões de Qualidade Automatizados

REGRAS DE PROTEÇÃO DE BRANCH
════════════════════════════

CONFIGURAÇÕES DE PROTEÇÃO GITHUB:
─────────────────────────────────────
Para branch main:
├── Require pull request before merging ✓
├── Require approvals: 1-2 ✓
├── Dismiss stale reviews ✓
├── Require status checks to pass ✓
│   ├── Build CI
│   ├── Testes
│   └── Lint
├── Require branches to be up to date ✓
├── Require signed commits (opcional)
├── Restrict pushes ✓
└── No force pushes ✓

RULESETS (MAIS NOVO):
─────────────────────────────────────
GitHub Rulesets:
├── Aplicar para múltiplos branches
├── Pattern matching (release/*)
├── Bypass permissions
├── Controle mais granular
└── Organização-wide

BENEFÍCIOS:
─────────────────────────────────────
├── Qualidade consistente
├── Sem pushes acidentais para main
├── Reviews reforçados
├── Testes devem passar
├── Alinhamento de equipe
└── Reforço automatizado

CI Por Tipo de Branch

Fluxos de Trabalho Condicionais

PIPELINES CI CONDICIONAIS
═════════════════════════

CI BASEADO EM BRANCH:
─────────────────────────────────────
Pipelines diferentes por branch:

on:
  push:
    branches:
      - main
      - 'release/**'
      - 'feature/**'

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: npm test

  # Apenas em main
  deploy-staging:
    if: github.ref == 'refs/heads/main'
    needs: test
    runs-on: ubuntu-latest
    steps:
      - run: deploy-to-staging

  # Apenas em branches release
  deploy-production:
    if: startsWith(github.ref, 'refs/heads/release/')
    needs: test
    runs-on: ubuntu-latest
    steps:
      - run: deploy-to-prod

ESTRATÉGIA DE BRANCH FEATURE:
─────────────────────────────────────
Branches feature:
├── Execute: lint, testes unitários
├── Pule: testes integração, deploy
├── Feedback rápido
└── Uso menor de recurso

Branch main:
├── Execute: todos testes
├── Execute: scan segurança
├── Deploy: staging
└── Validação completa

Branches release:
├── Execute: todos testes + smoke
├── Deploy: produção
├── Tag release
└── Caminho produção completo

Notificações

Automação de Consciência

NOTIFICAÇÕES DE BRANCH
══════════════════════

ALERTAS DE BRANCH DE LONGA DURAÇÃO:
─────────────────────────────────────
Alerta quando branch é muito velho:

- name: Verificar idade de branch
  run: |
    branch="${{ github.head_ref }}"
    created=$(gh pr view ${{ github.event.pull_request.number }} \
              --json createdAt -q '.createdAt')
    days_old=$(( ($(date +%s) - $(date -d "$created" +%s)) / 86400 ))
    
    if [ $days_old -gt 7 ]; then
      gh pr comment ${{ github.event.pull_request.number }} \
        --body "⚠️ Este branch tem $days_old dias. Considere merge ou dividir."
    fi

DETECÇÃO DE CONFLITO DE MERGE:
─────────────────────────────────────
Verifique conflitos:
├── Verificação automatizada contra main
├── Alerta se conflitos detectados
├── Labels PR para status de conflito
├── Notificação Slack
└── Resolução precoce de conflito

LEMBRETES DE SYNC DE BRANCH:
─────────────────────────────────────
├── Notifique quando atrás de main
├── Sugira rebase/merge
├── Previna grande drift
└── Mantenha branches atuais

Integração GitScrum

Conexão Branch-Tarefa

RECURSOS DE BRANCH GITSCRUM
═══════════════════════════

LINKING AUTOMÁTICO:
─────────────────────────────────────
Nomeação de branch inclui ID de tarefa:
├── feature/GS-123-user-auth
├── GitScrum detecta GS-123
├── PR linked para tarefa
├── Atividade visível na tarefa
└── Rastreabilidade completa

ATUALIZAÇÕES DE STATUS:
─────────────────────────────────────
├── Branch criado → Tarefa "Em Progresso"
├── PR aberto → Tarefa "Em Revisão"
├── PR merged → Tarefa "Feito"
├── Fluxo de status automático
└── Sem atualizações manuais necessárias

VISIBILIDADE:
─────────────────────────────────────
No cartão de tarefa:
├── Veja branches ativos
├── Veja status PR
├── Veja status merge
├── Contexto de desenvolvimento
└── Imagem completa

Melhores Práticas

Para Automação de Branch

  1. Reforce nomeação — Padrões consistentes, parseáveis
  2. Auto-delete merged — Repositório limpo
  3. Proteja main — Portões de qualidade
  4. Link para tarefas — Rastreabilidade completa
  5. CI condicional — Testes certos para branches certos

Anti-Patterns

ERROS DE AUTOMAÇÃO DE BRANCH:
✗ Sem proteção de branch em main
✗ Apenas limpeza manual
✗ Nomeação inconsistente
✗ Branches de longa duração (semanas)
✗ Mesmo CI para todos branches
✗ Sem linkage de tarefa
✗ Branches nunca limpos
✗ Force push permitido em main

Soluções Relacionadas