9 min leitura • Guide 759 of 877
Gerenciamento de Feature Flags com GitScrum
Feature flags desacoplam implantação de lançamento. GitScrum ajuda equipes a rastrear recursos controlados por flags e coordenar lançamentos de forma eficaz.
Conceitos Básicos de Feature Flags
O que as Flags Possibilitam
CASOS DE USO DE FEATURE FLAGS:
┌─────────────────────────────────────────────────────────────┐
│ │
│ LANÇAMENTO GRADUAL: │
│ Implantar para 1% → 10% → 50% → 100% │
│ Monitorar métricas em cada estágio │
│ Reverter instantaneamente se houver problemas │
│ │
│ DARK LAUNCHING: │
│ Código implantado mas oculto dos usuários │
│ Permite testes de integração em produção │
│ Sem risco para usuários │
│ │
│ TESTES A/B: │
│ 50% veem versão A, 50% veem versão B │
│ Medir qual performa melhor │
│ Decisões baseadas em dados │
│ │
│ KILL SWITCH: │
│ Desabilitar recurso problemático instantaneamente │
│ Nenhuma implantação necessária │
│ Minutos vs horas para responder │
│ │
│ ACESSO BETA: │
│ Habilitar para usuários/clientes específicos │
│ Coletar feedback antes do lançamento amplo │
│ Controle de acesso a recursos premium │
│ │
│ CONTROLES OPERACIONAIS: │
│ Habilitar/desabilitar recursos caros sob carga │
│ Degradação graceful │
│ Circuit breakers │
│ │
│ DESENVOLVIMENTO TRUNK-BASED: │
│ Recursos incompletos atrás de flags │
│ Merge para main frequentemente │
│ Sem branches de longa duração para features │
└─────────────────────────────────────────────────────────────┘
Tipos de Flags
Categorizando Flags
TIPOS DE FEATURE FLAGS:
┌─────────────────────────────────────────────────────────────┐
│ │
│ FLAGS DE LANÇAMENTO (Curto prazo): │
│ ─────────────────────────────── │
│ Propósito: Controlar lançamento de novo recurso │
│ Vida útil: Dias a semanas │
│ Exemplo: new_dashboard_enabled │
│ │
│ Criar → Lançar → Remover │
│ DEVEM ser removidos após lançamento 100% │
│ │
│ ─────────────────────────────────────────────────────────── │
│ │
│ FLAGS DE EXPERIMENTO (Curto prazo): │
│ ──────────────────────────────── │
│ Propósito: Testes A/B │
│ Vida útil: Duração do experimento │
│ Exemplo: checkout_flow_experiment │
│ │
│ Criar → Executar experimento → Escolher vencedor → Remover │
│ │
│ ─────────────────────────────────────────────────────────── │
│ │
│ FLAGS DE PERMISSÃO (Longo prazo): │
│ ─────────────────────────────── │
│ Propósito: Acesso/entitlement a recursos │
│ Vida útil: Permanente ou ciclo de vida do produto │
│ Exemplo: premium_analytics_enabled │
│ │
│ São essencialmente recursos do produto │
│ │
│ ─────────────────────────────────────────────────────────── │
│ │
│ FLAGS OPERACIONAIS (Longo prazo): │
│ ──────────────────────────────── │
│ Propósito: Controle de comportamento do sistema │
│ Vida útil: Permanente │
│ Exemplo: enable_caching, rate_limit_mode │
│ │
│ Usados para operações, não para recursos │
└─────────────────────────────────────────────────────────────┘
Ciclo de Vida das Flags
Criando Flags
WORKFLOW DE CRIAÇÃO DE FLAGS:
┌─────────────────────────────────────────────────────────────┐
│ │
│ QUANDO CRIAR FLAG: │
│ │
│ Durante desenvolvimento: │
│ • Novo recurso voltado ao usuário │
│ • Mudança arriscada │
│ • Dependência entre equipes │
│ • Recurso necessitando lançamento gradual │
│ │
│ ─────────────────────────────────────────────────────────── │
│ │
CONVENÇÃO DE NOMENCLATURA DE FLAGS: │
│ │
│ Formato: [escopo]_[recurso]_[tipo] │
│ │
│ Exemplos: │
│ • dashboard_new_charts_release │
│ • checkout_one_click_experiment │
│ • premium_analytics_permission │
│ • cache_disable_operational │
│ │
│ ─────────────────────────────────────────────────────────── │
│ │
│ TAREFA NO GITSCRUM: │
│ ┌─────────────────────────────────────────────────────────┐│
│ │ PROJ-123: Novos Gráficos do Dashboard ││
│ │ ││
│ │ Feature Flag: ││
│ │ Nome: dashboard_new_charts_release ││
│ │ Tipo: Flag de lançamento ││
│ │ Criado: 2024-01-15 ││
│ │ Proprietário: @alex ││
│ │ Limpeza devida: 2024-02-15 ││
│ │ ││
│ │ Plano de lançamento: ││
│ │ ☐ 5% - Testes internos ││
│ │ ☐ 20% - Clientes beta ││
│ │ ☐ 50% - Disponibilidade geral ││
│ │ ☐ 100% - Lançamento completo ││
│ │ ☐ Remover flag (limpeza) ││
│ └─────────────────────────────────────────────────────────┘│
└─────────────────────────────────────────────────────────────┘
Processo de Lançamento
ESTÁGIOS DE LANÇAMENTO DE RECURSOS:
┌─────────────────────────────────────────────────────────────┐
│ │
│ ESTÁGIO 1: INTERNO (0%) │
│ ────────────────────── │
│ Flag: DESLIGADO por padrão │
│ Acesso: Habilitado apenas para emails internos │
│ Propósito: QA e testes internos │
│ Duração: Até ter confiança │
│ │
│ ESTÁGIO 2: BETA (5-10%) │
│ ────────────────────── │
│ Flag: Habilitado para clientes selecionados │
│ Acesso: Usuários beta opt-in │
│ Propósito: Feedback inicial, descoberta de bugs │
│ Duração: 1-2 semanas │
│ Monitorar: Taxas de erro, feedback │
│ │
│ ESTÁGIO 3: GRADUAL (10% → 50%) │
│ ───────────────────────────── │
│ Flag: Lançamento percentual │
│ Acesso: Amostragem aleatória │
│ Propósito: Testes de escala │
│ Duração: Dias por estágio │
│ Monitorar: Performance, métricas │
│ │
│ ESTÁGIO 4: GERAL (50% → 100%) │
│ ────────────────────────────── │
│ Flag: Percentual crescente │
│ Acesso: Usuários restantes │
│ Propósito: Lançamento completo │
│ Duração: Dias │
│ Monitorar: Todas as métricas │
│ │
│ ESTÁGIO 5: LIMPEZA │
│ ──────────────── │
│ Flag: Remover completamente │
│ Código: Remover verificações de flag │
│ Propósito: Eliminar dívida técnica │
│ Timeline: Dentro de 30 dias do 100% │
└─────────────────────────────────────────────────────────────┘
Limpeza de Flags
Prevenindo Dívida de Flags
LIMPEZA DE FEATURE FLAGS:
┌─────────────────────────────────────────────────────────────┐
│ │
│ PROBLEMA DA DÍVIDA DE FLAGS: │
│ │
│ Semana 1: 5 flags │
│ Mês 1: 15 flags │
│ Mês 6: 47 flags (metade obsoleta) │
│ Ano 1: 100+ flags, ninguém sabe quais estão ativas │
│ │
│ ─────────────────────────────────────────────────────────── │
│ │
│ REGRAS DE LIMPEZA: │
│ │
│ 1. DEFINIR EXPIRAÇÃO NA CRIAÇÃO │
│ Todo flag de lançamento tem data de limpeza │
│ Padrão: 30 dias após lançamento 100% │
│ │
│ 2. RASTRAR NO GITSCRUM │
│ Tarefa de limpeza criada com o recurso │
│ Vinculada à tarefa original do recurso │
│ Atribuída ao proprietário do recurso │
│ │
│ 3. AUDITORIAS REGULARES │
│ Mensal: Revisar todos os flags │
│ Identificar: Flags em 100% por > 30 dias │
│ Ação: Criar tarefas de limpeza │
│ │
│ ─────────────────────────────────────────────────────────── │
│ │
│ TAREFA DE LIMPEZA: │
│ ┌─────────────────────────────────────────────────────────┐│
│ │ TECH-456: Remover flag dashboard_new_charts ││
│ │ ││
│ │ Recurso: Novos Gráficos do Dashboard (PROJ-123) ││
│ │ Flag em 100% desde: 2024-02-01 ││
│ │ Limpeza devida: 2024-03-01 ││
│ │ ││
│ │ Tarefas: ││
│ │ ☐ Remover flag da configuração ││
│ │ ☐ Remover verificações de flag do código ││
│ │ ☐ Deletar caminhos de código não usados ││
│ │ ☐ Atualizar testes ││
│ │ ☐ Implantar ││
│ └─────────────────────────────────────────────────────────┘│
└─────────────────────────────────────────────────────────────┘
Dashboard de Flags
Visibilidade e Rastreamento
VISÃO GERAL DO STATUS DE FEATURE FLAGS:
┌─────────────────────────────────────────────────────────────┐
│ DASHBOARD DE FEATURE FLAGS │
├─────────────────────────────────────────────────────────────┤
│ │
│ FLAGS ATIVOS: 12 │
│ │
│ POR STATUS: │
│ 🟢 Fazendo rollout: 3 │
│ 🟡 Em 100%: 4 (precisa limpeza) │
│ 🔵 Experimentos: 2 │
│ ⚪ Permanente: 3 │
│ │
│ ─────────────────────────────────────────────────────────── │
│ │
│ FLAG ROLLOUT DESDE AÇÃO │
│ ──────────────────────────── ───────── ─────── ──────── │
│ dashboard_new_charts 100% 14 dias Limpeza! │
│ checkout_redesign 50% 3 dias Monitorar│
│ search_v2 20% 7 dias Expandir │
│ mobile_nav_experiment 50%/50% 5 dias Executando│
│ premium_reports perm - - │
│ │
│ ─────────────────────────────────────────────────────────── │
│ │
│ PRECISA ATENÇÃO: │
│ │
│ ⚠️ dashboard_new_charts em 100% há 14 dias │
│ → Criar tarefa de limpeza │
│ │
│ ⚠️ payment_gateway_v2 em 100% há 45 dias │
│ → Atrasado para limpeza! │
│ │
│ [Ver todos os flags] [Criar novo flag] [Executar auditoria]│
└─────────────────────────────────────────────────────────────┘
Padrões de Implementação
Padrões de Código
PADRÕES DE CÓDIGO PARA FEATURE FLAGS:
┌─────────────────────────────────────────────────────────────┐
│ │
│ VERIFICAÇÃO SIMPLES: │
│ ┌─────────────────────────────────────────────────────────┐│
│ │ if (featureFlags.isEnabled('new_dashboard')) { ││
│ │ return <NewDashboard /> ││
│ │ } ││
│ │ return <OldDashboard /> ││
│ └─────────────────────────────────────────────────────────┘│
│ │
│ COM CONTEXTO: │
│ ┌─────────────────────────────────────────────────────────┐│
│ │ if (featureFlags.isEnabled('premium_feature', { ││
│ │ userId: user.id, ││
│ │ plan: user.plan ││
│ │ })) { ││
│ │ // Mostrar recurso premium ││
│ │ } ││
│ └─────────────────────────────────────────────────────────┘│
│ │
│ EVITAR: │
│ ┌─────────────────────────────────────────────────────────┐│
│ │ // ❌ Flags aninhados ││
│ │ if (flag1 && flag2 && !flag3) { ... } ││
│ │ ││
│ │ // ❌ Flags em loops ││
│ │ items.map(item => ││
│ │ featureFlags.isEnabled('x') ? ... : ... ││
│ │ ) ││
│ │ ││
│ │ // ❌ Verificação tardia de flag (efeitos colaterais ││
│ │ // já aconteceram) ││
│ │ processPayment(); ││
│ │ if (featureFlags.isEnabled('new_receipt')) { ... } ││
│ └─────────────────────────────────────────────────────────┘│
│ │
│ MELHORES PRÁTICAS: │
│ • Verificar cedo na requisição/componente │
│ • Manter lógica de flag simples │
│ • Cachear valores de flag por requisição │
│ • Logar avaliações de flag para debugging │
└─────────────────────────────────────────────────────────────┘