Home / Desenvolvimento / Você não tem problema de pipeline. Você tem problema de código que ninguém entende.

Você não tem problema de pipeline. Você tem problema de código que ninguém entende.

Diagrama isométrico de pipeline CI/CD com quinze etapas em colunas modulares, com setas indicando acoplamento, gates de validação e retry policies, paleta azul e turquesa, fundo branco azulado

TL;DR

  • Pipeline é documento vivo da lógica de deployment. Se o pipeline é complexo, é porque o software é complexo. Tratar pipeline como objeto autônomo é tratar sintoma como doença.
  • A maioria dos posts de DevOps mostra como adicionar etapas. Este mostra por que cada etapa que some é mais valiosa que cada etapa que entra.
  • Caso real: pipeline de 15 etapas para 23 microserviços, refatoração de código reduziu para 5 etapas. Mesma stack, mesmo time, menos falha, menos custo.
  • Gargalo real em produção é a combinação de código acoplado + falta de testes + medo de refatorar. Não é CI/CD.
  • Antes de aprovar próximo orçamento em pipeline: o deploy atual leva mais de 15 minutos? Cobertura de testes acima de 70%? Time opera sem cultura de herói? Qualquer “não” é motivo para parar e refatorar.

Você não tem problema de pipeline. Você tem problema de código que ninguém entende.


A startup fintech de médio porte investiu aproximadamente R$ 200.000 em pipeline de CI/CD “estado da arte” ao longo de 18 meses. O conjunto, vendido como CI/CD pipeline complexo de referência do setor, executava quinze etapas para promover um único commit. GitHub Actions como runner. ArgoCD 2.10 para sincronização contínua. Helm 3 com library charts. Auto-remediation configurada. Snyk para SCA. Trivy para scan de imagem. Datadog para APM. Oito ferramentas integradas, cada uma com promessa de resolver um gargalo específico de deploy.

Antes do investimento, o deploy em produção falhava uma vez por semana. O motivo era simples: alguém esquecia de atualizar o schema do banco ao promover uma migration, e a aplicação quebrava em runtime. Falha conhecida, falha debugável, falha com causa-raiz de cinco minutos para investigar.

Depois do investimento, o deploy em produção falha três vezes por semana. O motivo deixou de ser simples. O pipeline tem quinze etapas encadeadas, cada uma com dependência da anterior, cada uma com retry policy, cada uma com state parcial que pode ou não ser limpo quando algo falha. Quando o deploy quebra, o engenheiro sênior precisa ler logs de quatro ferramentas diferentes para entender em qual das quinze etapas o pipeline travou, qual é o estado do cluster Kubernetes, se o Helm chart foi atualizado em parte, se o ArgoCD detectou drift, e se a auto-remediation vai piorar a situação antes de corrigir. O tempo médio de recuperação (MTTR) é de 47 minutos por incidente. Dois SREs em rodízio permanente de on-call dedicados exclusivamente ao pipeline.

A ironia é didática. A empresa comprou automação para resolver instabilidade de deploy. Entregou mais instabilidade de deploy. O mercado de ferramenta trata CI/CD pipeline complexo como sinônimo de maturidade, mas maturidade é o que o DORA Report 2023 mede: frequência de deploy, lead time, change failure rate e MTTR. O pipeline dessa startup, em todos os quatro indicadores, piorou após o investimento.

A tese deste post é factual, não opinativa: pipeline é documento vivo da lógica de deployment. O que o pipeline executa, em que ordem, com quais validações, é a tradução operacional da complexidade que já existe no código. Tratar pipeline como objeto autônomo — adicionar ferramenta, configurar retry, escrever mais um step no YAML — é tratar sintoma como doença.

Pipeline é fotografia, não doença

O pipeline executa o que o código determina. Cada etapa de CI/CD existe porque algo no software exige validação, sincronização, transformação, ou rollback que o time de engenharia não confia no próprio código para entregar sozinho.

A relação é direta: complexidade no código provoca complexidade no pipeline. Não é correlação — é causação. Refatorar o código elimina a etapa. Adicionar ferramenta cobre a etapa com mais uma camada que também vai precisar de debug quando falhar.

O sintoma típico segue um padrão observável. O time investe seis meses em pipeline. O deploy passa a falhar três vezes mais do que antes. Ninguém consegue explicar em trinta segundos o que o argocd app sync --retry-limit 5 --self-heal --grpc-web --revision faz quando dispara. A documentação interna do pipeline tem quarenta páginas. O diagrama atualizado pela última vez há oito meses não corresponde ao YAML atual. Esse é o momento em que o pipeline virou a doença.

O DORA Report 2023 estabelece que elite performers deployam múltiplas vezes por dia com pipeline de alta confiança. O pipeline desses times não é o mais sofisticado do mercado — é o mais simples. Sofisticação segue simplicidade, não o contrário. A pergunta que separa elite de low performer raramente é “qual ferramenta”. É “quanto do deploy cabe na cabeça de um humano em cinco minutos de leitura”.

O Framework dos Três Sinais de que o pipeline está te traindo

Três sinais observáveis indicam que o pipeline virou a doença, não a cura.

Sinal 1: ninguém consegue explicar o pipeline em cinco minutos. Se o diagrama do CI/CD precisa de legenda, o software tem acoplamento que precisa de refatoração. O pipeline deveria ser legível pelo engenheiro júnior no primeiro dia de trabalho. Quando a leitura exige conhecimento tácito acumulado em anos, o acoplamento organizacional é tão grave quanto o acoplamento de código.

Sinal 2: cada incidente de deploy exige SRE sênior para resolver. Se a pipeline precisa de herói, o código tem dependência que precisa ser quebrada. Acoplamento de configuração entre microserviços, race conditions em Helm templates, secrets espalhados em três fontes diferentes, ordem de execução de migrations que muda conforme o estado do banco — tudo isso é sintoma, não causa. A senioridade requerida para debug é proxy de complexidade não gerenciada.

Sinal 3: adicionar uma feature exige editar o pipeline. A regra de ouro é direta: feature nova muda código. Se a feature também obriga mudança no pipeline, o código não tem abstração suficiente. O pipeline virou parte do domínio de negócio, que é o pior lugar que o pipeline pode estar. Pipeline é infraestrutura de deployment, não camada de aplicação.

Os três sinais têm a mesma raiz: o sistema é mais complexo do que o time consegue modelar mentalmente. A solução é reduzir a complexidade do sistema. Automação de mais alta ordem é multiplicador de complexidade existente, não redutor. A ferramenta sofisticada sobre código caótico entrega caos mais rápido, não ordem.

Os três vilões que fazem pipeline crescer sem parar

Três padrões de código são responsáveis por 80% do crescimento descontrolado de pipeline em produção.

Vilão 1: código acoplado entre microserviços. O “microserviço” compartilha schema de banco com outros cinco via shared database. O pipeline precisa rodar migrations em ordem, validar dependências circulares, garantir que os 23 deploys não colidam em janela de manutenção. Cada novo serviço adiciona três etapas ao pipeline. A solução é bounded contexts com um banco por serviço e comunicação event-driven. O pipeline encolhe 40% por conta própria quando o acoplamento some.

Vilão 2: configuração espalhada em múltiplas fontes. Variáveis de ambiente em .env, ConfigMap, Secret do Kubernetes, Helm values, feature flags no banco de dados. Cada ambiente lê de um lugar diferente. O pipeline precisa de precedence rules, validação de consistência, sincronização entre fontes. Adicionar uma variável nova exige editar quatro arquivos, validar que o Vault propagou, confirmar que o Helm renderizou corretamente. A solução é uma fonte de verdade única (Vault, AWS Secrets Manager, Doppler), lida no startup da aplicação. O pipeline encolhe mais 30% quando a configuração deixa de ser distribuída.

Vilão 3: testes que só rodam no CI porque o dev não confia neles localmente. O pipeline tem etapa dedicada de integration test que leva 22 minutos porque a suíte inteira precisa rodar contra banco real. O dev não roda localmente. O PR só é validado quando o CI termina. O feedback loop é de horas. A solução é testes rápidos o suficiente para rodar em 90 segundos no laptop, com a mesma cobertura. Paralelismo massivo, in-memory database para testes de integração, contrato de API testado por snapshot. O pipeline encolhe mais 20% quando o dev roda a suíte inteira no pnpm test antes de abrir PR.

A soma dos três vilões: encolhimento de 60-70% do pipeline sem perder nenhuma validação crítica. Não é otimização de CI/CD. É maturidade de engenharia de software refletida no CI/CD.

O caso real: quinze etapas viraram cinco porque o código mudou

A startup fintech mencionada na introdução dedicou quatro meses a um programa interno de refatoração. Dois engenheiros sênior, custo aproximado de R$ 280.000, zero dependência externa de consultoria.

Quatro mudanças no código:

  1. O monorepo foi convertido em workspaces com pnpm, isolado por pacote, com dependências declaradas no package.json raiz. Cada serviço passou a ter dependências explícitas em vez de herdar tudo do monorepo.
  2. As variáveis de ambiente foram centralizadas em Vault, lidas por um único ConfigMap gerado na inicialização do pod. Fim do hardcoded triplo entre .env, ConfigMap e Secret.
  3. Os Helm charts foram consolidados em uma library chart parametrizada, com values.yaml por ambiente. Sete Helm charts viraram um.
  4. As feature flags foram movidas para um serviço dedicado (Unleash), consumido via HTTP no startup da aplicação. Fim do feature-flags-configmap.yaml que era editado manualmente a cada flag nova.

O pipeline resultante tem cinco etapas. Oito etapas sumiram. Scan de vulnerabilidades, lint e build continuam rodando — foram absorvidos pelo pnpm test && pnpm build, que executa tudo em paralelo na fase de validação. Auto-remediation de drift do ArgoCD agora funciona porque o cluster é determinístico o suficiente para o controller raciocinar sobre o estado desejado.

O resultado financeiro é secundário ao resultado operacional. Deploys em produção caíram de três falhas por semana para 0,4 falhas por semana. MTTR caiu de 47 minutos para 9 minutos — sendo a maioria falha de rede transitória que o retry absorve. O time parou de ter medo de deployar às sextas-feiras.

Métricas DORA antes e depois da refatoração:

| Métrica | Antes | Depois | |—|—|—| | Deploys por dia | 2,3 | 8,1 | | Lead time para mudanças | 3,2 dias | 11 horas | | Change failure rate | 23% | 4,8% | | MTTR | 47 min | 9 min | | Etapas do pipeline | 15 | 5 |

A redução anualizada de custo é de aproximadamente R$ 90.000 em horas de SRE e R$ 110.000 em licenças renegociadas — a equipe retornou ao ArgoCD open source porque a complexidade que justificava a versão Enterprise simplesmente não existe mais. ROI em 18 meses. O ganho real, porém, é cultural: o time opera deploy contínuo sem cultura de herói, sem heróis, sem on-call concentrado.

O diagnóstico que antecede o próximo orçamento em pipeline

Três perguntas para responder antes de aprovar qualquer ferramenta nova de CI/CD.

Primeira pergunta: o deploy atual leva mais de 15 minutos do commit ao production? Se a resposta é sim, o problema é tempo de execução, não pipeline. Investir em cache de dependências (Nix, Bazel, Turborepo), paralelismo de testes, e imagens Docker pré-built com Buildkit economiza mais tempo que qualquer ferramenta de orquestração de pipeline. Adicionar Argo Workflows sobre build lento entrega workflow lento com mais uma camada de YAML para manter.

Segunda pergunta: a cobertura de testes está acima de 70% com testes que rodam em menos de 5 minutos? Se a resposta é não, a próxima ferramenta que entra vai herdar a dívida de confiança. O dev não confia no código, então pede validação no pipeline. O pipeline cresce, o tempo de execução cresce, o dev confia menos ainda. O ciclo se auto-reforça até quebrar.

Terceira pergunta: o time de feature opera o pipeline em produção, ou só os SREs? Se só os SREs operam, o pipeline virou especialidade concentrada. Especialidade é acoplamento organizacional. Refatorar o código transfere operação do pipeline para o time de feature, o on-call dilui, e o conhecimento se distribui.

Qualquer resposta “não” é motivo para adiar a compra de ferramenta. A próxima sprint é para refatoração de código, não para feature de pipeline. O time que refatora código antes de comprar ferramenta está apostando na causa. O time que compra ferramenta antes de refatorar está apostando no sintoma e acumulando dívida que vai cobrar juros na próxima crise de produção.

O post sobre Por que seu ERP está lento e não é culpa da infraestrutura argumenta a mesma lógica para banco de dados: ferramenta não substitui modelagem. O post sobre Docker e Kubernetes não são DevOps argumenta para orquestração: ferramenta não substitui maturidade de processo. O post sobre ORM não está salvando você argumenta para camada de dados: ferramenta não substitui compreensão de SQL. O padrão é o mesmo em toda camada: a ferramenta sofisticada sobre código caótico entrega caos mais rápido, não ordem.

O gargalo que ninguém quer admitir

A ferramenta é a parte fácil. Cultura, processo e observabilidade do código exigem anos de investimento. Pipeline sofisticado sem esse lastro é overhead que ninguém pediu.

O ponto de partida para qualquer diagnóstico sério: ler o código que vai para produção antes de ler o pipeline que leva o código para produção. Se a leitura do código leva mais de 30 minutos para um arquivo de 500 linhas, o pipeline não vai resolver. A pipeline vai amplificar a ilegibilidade, distribuir a confusão por mais lugares, e cobrar em downtime o que o código deveria cobrar em revisão de PR.

Stack sofisticada sem código legível é multiplicador de complexidade. Stack simples com código legível é multiplicador de velocidade. A escolha entre as duas é decisão de engenharia, não decisão de orçamento.

Seu gargalo não é CI/CD. É a combinação de código acoplado + falta de testes + medo de refatorar.

Quebrar o ciclo é decisão de refatoração, não de automação. A próxima sprint que decide comprar ferramenta de pipeline antes de pagar dívida de código está financiando o sintoma com dinheiro que deveria financiar a causa.


Esse post é parte da série sobre “ferramentas da moda que escondem problemas de maturidade”. O anterior, ORM não está salvando você, mostrou o mesmo padrão na camada de dados. O próximo da série vai tratar de feature flags: por que mais flags significa menos velocidade, e por que a solução é deletar flag, não gerenciar flag.

Marcado:

Deixe um Comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *