Facebook introduzido lançou recentemente um novo sistema de compilação chamado "Buck2", que observa que é focado na construção de projetos a partir de repositórios muito grandes que incluem código em diferentes idiomas programação.
Diferenças entre a nova implementação e o sistema dinheirinho usado anteriormente por Facebook estão usando a linguagem Rust em vez de Java e um aumento significativo na eficiência e desempenho do processo de montagem (em testes internos na mesma infraestrutura, o Buck2 executa tarefas de montagem duas vezes mais rápido que o Buck).
Os sistemas de compilação ficam entre um desenvolvedor e seu código em execução, portanto, qualquer coisa que possamos fazer para tornar a experiência mais rápida ou mais produtiva afeta diretamente a eficácia de um desenvolvedor. O objetivo do Buck2 era manter o que amamos no Buck1 (o básico e os fluxos de trabalho), inspirar-se nas inovações pós-Buck1 (incluindo Bazel, Adapton e Shake) e focar na velocidade e permitir novas experiências.
Sobre o Buck2
Destaca-se que o sistema não está vinculado à criação de código em linguagens específicas e fora da caixa, suporta projetos de construtor escritos em C++, Python, Rust, Kotlin, Erlang, Swift, Objective-C, Haskell e OCaml usados pelo Facebook.
A linguagem Starlark, baseada em Python (como no Bazel), é usada para projetar plugins, criar scripts e regras. O Starlark permite estender os recursos do sistema de construção e abstrair das linguagens específicas usadas nos projetos que estão sendo construídos.
É mencionado que alto desempenho é alcançado armazenando em cache os resultados, paralelização de trabalho e suporte para execução remota de tarefas (Remote Build Execution).
O ambiente de construção usa o conceito de "hermeticidade": o código compilado é separado do mundo externo, nada é carregado de fora durante o processo de compilação e a execução repetida do trabalho em sistemas diferentes leva ao mesmo resultado (compilações repetidas, por exemplo, o resultado da compilação de um projeto no máquina do desenvolvedor será exatamente o mesmo que a compilação no servidor de integração contínua). A situação de falta de dependência é percebida no Buck2 como um bug.
Da parte do Principais recursos do Buck2, os seguintes se destacam:
- As regras para suportar linguagens de programação e o sistema de compilação principal são completamente separadas. As regras são escritas na linguagem Starlark, e o kit de ferramentas Starlark e a implementação são escritos em Rust.
- O sistema de compilação usa um único gráfico de dependência incremental (sem preparação), que permite aumentar a profundidade da paralelização do trabalho em comparação com Buck e Bazel e evitar muitos tipos de bugs.
- O código do Buck2 postado no GitHub e as regras de suporte à linguagem de programação são quase idênticas à versão interna utilizada na infraestrutura do Facebook (as únicas diferenças estão no link para as edições do compilador e build servers utilizados pelo Facebook).
- O sistema de compilação foi projetado para se integrar com sistemas de execução de trabalhos remotos que permitem executar trabalhos em servidores remotos. A API de execução remota é compatível com Bazel e foi testada para compatibilidade com Buildbarn e EngFlow.
- É fornecida integração com sistemas de arquivos virtuais, nos quais é apresentado o conteúdo de todo o repositório, mas na verdade o trabalho é realizado com a parte local real de uma parte do repositório (o desenvolvedor vê todo o repositório, mas apenas o que é obrigatório) os arquivos acessados são recuperados do repositório). VFS baseado em EdenFS e Git LFS são suportados, que são usados por Sapling.
Finalmente, para os interessados em conhecer melhor, devem saber que o código é distribuído sob a licença Apache 2.0 e podem consultar os detalhes no link a seguir.