Tecnologia

Por que a Block migrou 450 repositórios JVM para um único Monorepo?

A Block, Inc. revelou como superou o inferno das dependências ao consolidar 450 projetos JVM em um monorepo, reduzindo o dependency drift e otimizando CI.

R

· 5 min

Engenheiro de software analisando grafo de dependências complexo em monorepo JVM

Engenheiro de software analisando grafo de dependências complexo em monorepo JVM

A gestão de sistemas distribuídos em larga escala esconde um desafio silencioso, mas letal para a produtividade: o gerenciamento insustentável de dependências. A Block, Inc. (antiga Square) detalhou recentemente como migrou cerca de 450 repositórios baseados em JVM para uma estrutura de monorepo única, atendendo às demandas complexas das equipes do Cash App e da Square. O movimento marca uma mudança de paradigma: da fragmentação excessiva para a consistência atômica.

Para o desenvolvedor brasileiro que atua em grandes fintechs ou ecossistemas tech, o cenário de dependency drift é familiar. O custo de coordenação entre times e a necessidade de atualizar bibliotecas em múltiplos repositórios frequentemente supera o ganho de autonomia individual. A adoção do monorepo não foi apenas uma escolha arquitetural, mas uma estratégia de sobrevivência operacional.

O fim do inferno das dependências e o problema do drift

O dependency drift ocorre quando diferentes serviços dentro da mesma organização passam a utilizar versões distintas de bibliotecas compartilhadas. Em ambientes JVM, isso gera o famoso problema da dependência em diamante, onde uma aplicação requer duas bibliotecas que, por sua vez, exigem versões incompatíveis de uma terceira. No modelo de polyrepo, isso exige esforços de atualização manuais e coordenados que consomem semanas de trabalho.

Ao centralizar o código, a Block permitiu que as atualizações fossem atômicas. Uma alteração em uma biblioteca compartilhada agora é refletida em todos os serviços consumidores em um único commit. Isso garante que o branch principal esteja sempre em um estado consistente, eliminando surpresas de incompatibilidade em tempo de execução que antes só eram detectadas após o deploy.

Impacto Real: O ecossistema atual da Block sustenta cerca de 8.800 builds semanais, com um tempo de CI (P90) de aproximadamente 10 minutos, garantindo alta velocidade de entrega sem sacrificar a estabilidade.

Tabela Comparativa: Polyrepo vs. Monorepo

DesafioModelo Polyrepo (Anterior)Modelo Monorepo (Atual)
Atualização de LibsManual e fragmentadaAtômica em um único commit
Visibilidade de ErrosDescobertos em runtimeDescobertos no CI (Pull Request)
Consistência de VersãoAlta divergência (drift)Versão única global
Tempo de CILento no fluxo totalOtimizado via grafos

Arraste para o lado para ver toda a tabela.

Construindo grafos de dependência inteligentes

Um dos maiores receios ao migrar para um monorepo é o impacto no tempo de build. Com centenas de projetos no mesmo ambiente, o CI poderia facilmente se tornar um gargalo de horas. A estratégia da Block foi implementar grafos de dependência inteligentes. O sistema categoriza as alterações em três níveis: impacto direto, impacto indireto (upstream) ou mudança global.

Dessa forma, apenas os projetos afetados são reconstruídos. Mudanças irrelevantes, como ajustes em documentação ou serviços não consumidos, são ignoradas pelos checks de integração. Para times que utilizam Gradle, a lição aqui é o uso rigoroso de plugins de convenção para padronizar o comportamento de builds em larga escala.

UX do Desenvolvedor: Gerenciando a carga cognitiva

Trabalhar em um monorepo gigante exige suporte de ferramentas robustas. A Block desenvolveu um plugin customizado para o IntelliJ IDEA focado em produtividade. Em vez de carregar 450 projetos simultaneamente — o que degradaria qualquer máquina — o desenvolvedor carrega apenas os módulos necessários.

O plugin realiza um artifact swap: ele substitui referências de projeto por arquivos JAR publicados para dependências que não estão sendo editadas ativamente. Isso mantém a IDE ágil e o processo de configuração do Gradle rápido, permitindo que a equipe foque na lógica de negócio em vez de lutar contra a infraestrutura de desenvolvimento.

FAQ: Perguntas Frequentes sobre Monorepos

O que é dependency drift exatamente?

É o processo de divergência onde diferentes partes de um sistema utilizam versões variadas de uma biblioteca, gerando bugs, inconsistências e falhas de segurança difíceis de rastrear.

Por que a Block escolheu migrar para um monorepo?

Para eliminar a sobrecarga de coordenação entre times e garantir que alterações em bibliotecas compartilhadas sejam propagadas instantaneamente, mantendo a consistência do sistema.

Como o tempo de build é otimizado em um monorepo?

Através de grafos de dependência que identificam exatamente quais módulos foram afetados, permitindo que o CI realize builds incrementais, evitando o processamento desnecessário de toda a codebase.

Um monorepo é adequado para empresas menores?

Depende. Enquanto traz consistência, exige maturidade de ferramentas de build e CI. Para times pequenos, o custo de manutenção da infraestrutura pode superar os benefícios.

O que é o Artifact Swap mencionado pela Block?

É uma técnica que troca o código-fonte por artefatos (JARs) pré-compilados na IDE para evitar que o desenvolvedor precise compilar toda a árvore de dependências do monorepo ao realizar pequenas alterações.

Fonte: Casa do Dev — https://casado.dev/backend/block-unifica-450-repositorios-jvm-monorepo-dependency-drift

R

Sobre o autor

Editor-chefe

Usuário técnico criado para escrever conteúdos da redação.

Mais publicações em Tecnologia