Facebook ha pubblicato il sistema di build Buck2

Facebook ha introdotto un nuovo sistema di compilazione, Buck2, volto a organizzare la compilazione di progetti da repository molto grandi, incluso codice in diversi linguaggi di programmazione. Le differenze principali tra la nuova implementazione e il sistema Buck precedentemente utilizzato su Facebook sono l'uso del linguaggio Rust al posto di Java e un aumento significativo dell'efficienza e della produttività del processo di assemblaggio (nei test interni nella stessa infrastruttura, Buck2 esegue l'assemblaggio compiti due volte più velocemente di Buck). Il codice è distribuito sotto la licenza Apache 2.0.

Il sistema non è vincolato all'assemblaggio di codice in linguaggi specifici e supporta immediatamente l'assemblaggio di progetti scritti nei linguaggi C++, Python, Rust, Kotlin, Erlang, Swift, Objective-C, Haskell e OCaml , utilizzato da Facebook. Il linguaggio Starlark, basato su Python (come Bazel), viene utilizzato per progettare componenti aggiuntivi, creare script e regole. Starlark consente di espandere le capacità del sistema di assemblaggio e di astrarre dai linguaggi specifici utilizzati nei progetti assemblati.

Le prestazioni elevate si ottengono attraverso la memorizzazione nella cache dei risultati, la parallelizzazione del lavoro e il supporto per l'esecuzione remota delle attività (Remote Build Execution). Nell'ambiente di assemblaggio viene utilizzato il concetto di "ermeticità": il codice assemblato viene tagliato fuori dal mondo esterno, nulla viene caricato dall'esterno durante il processo di assemblaggio e ripetute esecuzioni di lavoro su sistemi diversi portano allo stesso risultato ( assemblaggi ripetuti, ad esempio, il risultato dell'assemblaggio di un progetto sulla macchina dello sviluppatore sarà completamente identico alla build sul server di integrazione continua). La situazione di mancanza di dipendenza è percepita come un errore in Buck2.

Caratteristiche principali di Buck2:

  • Le regole per supportare i linguaggi di programmazione e il nucleo del sistema di assemblaggio sono completamente separate. Le regole utilizzano il linguaggio Starlark e il toolkit e l'implementazione di Starlark sono scritti in Rust.
  • Il sistema di assemblaggio utilizza un unico grafico delle dipendenze incrementali (senza divisione in fasi), che consente di aumentare la profondità di parallelizzazione del lavoro rispetto a Buck e Bazel ed evitare molti tipi di errori.
  • Il codice Buck2 pubblicato su GitHub e le regole per il supporto dei linguaggi di programmazione sono quasi identici alla versione interna utilizzata nell'infrastruttura di Facebook (le uniche differenze sono relative alle edizioni dei compilatori e dei server assembly utilizzati in Facebook).
  • Il sistema di assemblaggio è progettato pensando all'integrazione con sistemi di esecuzione di attività remote che consentono di eseguire lavori su server remoti. L'API di esecuzione remota è compatibile con Bazel e testata per la compatibilità con Buildbarn ed EngFlow.
  • Viene fornita l'integrazione con file system virtuali, in cui vengono presentati i contenuti dell'intero repository, ma in realtà il lavoro viene eseguito con una sezione locale corrente di parte del repository (lo sviluppatore vede l'intero repository, ma solo i file richiesti a cui si accede vengono estratti dal repository). Sono supportati VFS basati su EdenFS e Git LFS, utilizzati in Sapling.

Fonte: opennet.ru

Aggiungi un commento