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ção | Benefício | Esforço |
|---|---|---|
| Validação de nomeação | Consistência | Baixo |
| Auto-delete merged | Repo limpo | Baixo |
| Limpeza obsoleto | Menos clutter | Médio |
| Regras de proteção | Portões de qualidade | Baixo |
| CI por tipo de branch | Testes certos | Mé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
- Reforce nomeação — Padrões consistentes, parseáveis
- Auto-delete merged — Repositório limpo
- Proteja main — Portões de qualidade
- Link para tarefas — Rastreabilidade completa
- 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