Facebook opublikował system kompilacji Buck2

Facebook wprowadził nowy system kompilacji Buck2, mający na celu organizację kompilacji projektów z bardzo dużych repozytoriów, obejmujących kod w różnych językach programowania. Kluczowe różnice pomiędzy nowym wdrożeniem a systemem Buck stosowanym wcześniej na Facebooku to użycie języka Rust zamiast Javy oraz znaczny wzrost wydajności i produktywności procesu montażu (w testach wewnętrznych w tej samej infrastrukturze Buck2 wykonuje montaż zadania dwa razy szybciej niż Buck). Kod rozpowszechniany jest na licencji Apache 2.0.

System nie jest powiązany z montażem kodu w konkretnych językach i od razu wspiera montaż projektów napisanych w językach C++, Python, Rust, Kotlin, Erlang, Swift, Objective-C, Haskell i OCaml , używany przez Facebooka. Do projektowania dodatków, budowania skryptów i reguł służy język Starlark, oparty na Pythonie (podobnie jak w Bazelu). Starlark pozwala rozszerzyć możliwości systemu montażowego i abstrahować od konkretnych języków używanych w montowanych projektach.

Wysoką wydajność osiąga się poprzez buforowanie wyników, równoległość pracy oraz obsługę zdalnej realizacji zadań (Remote Build Execution). W środowisku asemblerowym stosuje się pojęcie „hermetyczności” – zmontowany kod jest odcięty od świata zewnętrznego, podczas procesu montażu nic nie jest ładowane z zewnątrz, a wielokrotne wykonywanie pracy na różnych systemach prowadzi do tego samego rezultatu ( powtarzane asemblacje, np. wynik złożenia projektu na maszynie programisty będzie całkowicie identyczny z kompilacją na serwerze ciągłej integracji). Sytuacja braku zależności jest postrzegana jako błąd w Buck2.

Kluczowe cechy Buck2:

  • Zasady obsługi języków programowania i rdzeń systemu asemblera są całkowicie odrębne. Zasady korzystają z języka Starlark, a zestaw narzędzi i implementacja Starlark są napisane w języku Rust.
  • System montażu wykorzystuje pojedynczy graf zależności przyrostowych (bez podziału na etapy), co pozwala na zwiększenie głębokości zrównoleglenia pracy w porównaniu do Bucka i Bazela oraz uniknięcie wielu rodzajów błędów.
  • Kod Buck2 opublikowany na GitHubie oraz zasady obsługi języków programowania są niemal identyczne z wersją wewnętrzną wykorzystywaną w infrastrukturze Facebooka (jedyne różnice dotyczą wydań kompilatorów i serwerów asemblerowych wykorzystywanych w Facebooku).
  • System montażowy został zaprojektowany z myślą o integracji z systemami zdalnego wykonywania zadań, które umożliwiają prowadzenie prac na zdalnych serwerach. Interfejs API zdalnego wykonywania jest kompatybilny z Bazel i przetestowany pod kątem kompatybilności z Buildbarn i EngFlow.
  • Zapewniona jest integracja z wirtualnymi systemami plików, w których prezentowana jest zawartość całego repozytorium, ale tak naprawdę praca odbywa się na bieżącym lokalnym wycinku części repozytorium (programista widzi całe repozytorium, ale tylko wymagane pliki do których uzyskuje się dostęp, są pobierane z repozytorium). Obsługiwane są VFS oparte na EdenFS i Git LFS, które są używane w Sapling.

Źródło: opennet.ru

Dodaj komentarz