Como organizar projetos em um mono-repo

No primeiro post sobre mono-repo, tentei trazer de forma menos técnica, quais os benefícios e vantagens, assim como qual o fator determinante para o sucesso desse tipo de abordagem.

Nesse post, vamos falar um pouco sobre a organização dos projetos e packages dentro de um mono-repo.

Workspace

Embora uma das principais vantagens de um mono-repo seja facilidade no compartilhamento de código, é preciso determinar os limites desse compartilhamento, ou seja, precisamos definir um espaço onde somente algumas pessoas tem “autorização” para realizar mudanças.

Esse espaço, também conhecido como workspace, é o primeiro nível de separação dentro de um mono-repo, ou seja, uma pasta criada na raiz do repositório.

Existem várias formas de criar essa separação, sendo as três principais por:

  • produto: todos os micro-serviços referentes à um produto são armazenados juntos.
  • time: todos os produtos que são de responsabilidade do time são armazenados juntos.
  • domínio: todos os produtos de um determinado domínio da empresa são armazenados juntos.

Todas as abordagens tem vantagens e desvantagens. No entanto, como elas variam muito de empresa para empresa, não vou fazer esse comparativo aqui.

Shared

Como dito anteriormente, uma grande facilidade que temos dentro de um mono-repo é o compartilhamento de código.

Para que os packages comuns a todos os projetos não se misturem com as especificidades de cada um, é muito importante que esses packages sejam armazenados em um workspace compartilhado.

Esse workspace, quando pensamos em Go, normalmente leva o nome de pkg. Assim, packages para conexão com bancos de dados, filas, logs e etc… ficarão agrupadas nesse workspace, podendo ser utilizado por todos os projetos do mono-repo.

Permissionamento

De nada adianta ter toda essa separação que falamos até aqui, se todo mundo puder alterar/adicionar código em qualquer lugar, sem que os responsáveis sejam informados.

Por isso, é extremamente importante que um arquivo de CODEOWNERS ou semelhante a isso, seja criado e bem gerenciado.

Através desse arquivo, podemos colocar quem são os grupos responsáveis por cada workspace. Assim, caso haja uma contribuição cross, o time responsável poderá avaliar o impacto da mudança antes de aprová-la ou não.

Para o caso do pkg, idealmente, um grupo mais senior deverá ser o responsável pelas alterações dentro desse workspace. Isso não impede que outras pessoas façam mudanças e abram pull requests, apenas que essas mudanças serão revisadas por uma equipe mais senior.

Conclusão

Nesse segundo post da série sobre mono-repo, falamos sobre como criar os workspaces para que os times possam trabalhar mais a vontade em seus produtos.

Note que em nenhum momento eu falei sobre a estrutura de pastas dentro dos workspaces. Isso por que, a forma como os times trabalham dentro dos seus workspaces, não deve gerar nenhum impacto para o mono-repo.

No próximo post vamos falar sobre tooling.

Não deixe de se inscrever na nossa newsletter para receber os posts diretamente na sua caixa de entrada.

Até a próxima!


Se inscreva na nossa newsletter

* indicates required

Deixe uma resposta