Testar grátis
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                 │
└─────────────────────────────────────────────────────────────┘

Soluções Relacionadas