El dia de compilació que estàvem cansats de perdre
Tota biblioteca de Git en tot llenguatge acaba demanant-te les mateixes quatre coses: OpenSSL, libssh2, libcurl i perl per compilar-les. No perquè el teu…
Tota biblioteca de Git en tot llenguatge acaba demanant-te les mateixes quatre coses: OpenSSL, libssh2, libcurl i perl per compilar-les. No perquè el teu programa les necessiti, sinó perquè els transports de libgit2 sí.
Què es va treure
libgit2 hi continua —és una bona implementació d'objectes, refs i índex, i reescriure això seria vanitat—. El que se n'ha anat és la seva xarxa: està vendoritzada i compilada amb GIT_HTTPS=0 GIT_SSH=0, així que les parts que arrosseguen la cadena de dependències en C simplement no es compilen.
L'HTTPS és reqwest sobre rustls. L'SSH és russh sobre aws-lc-rs. Tots dos en Rust, tots dos entren per cargo, i cap necessita un paquet del sistema.
Què compra això
Compilar torii des del codi font necessita un compilador de C i res més. Ni openssl-dev, ni libssh2-dev, ni pkg-config, ni perl. Sobre el target musl amb la feature static el resultat no enllaça cap biblioteca en temps d'execució, que és el que li permet córrer a Alpine, a scratch i a una imatge busybox on no hi ha res instal·lat.
Els binaris ja construïts hereten la mateixa propietat: zero dependències en temps d'execució no és una xifra de màrqueting a la portada, és la consequència d'aquesta decisió.
Què va costar
Dues implementacions de transport que el món no porta quinze anys martellejant, i seria deshonest fingir que això surt de franc.
La cadena d'autenticació SSH és agent, després ed25519, després RSA, amb verificació de host contra known_hosts i confiança al primer ús per a un host desconegut. Queden dos forats i mereixen dir-se clars: una clau privada xifrada necessita un agent, perquè encara no hi ha pregunta de passphrase, i els àlies de ~/.ssh/config no es parsegen, així que el nom de host real és el que funciona.
La validació de push contra Bitbucket, Gitea, Forgejo i Sourcehut continua sent raonada i no provada d'extrem a extrem. Parlen el mateix Smart HTTP i el mateix SSH, així que hauria de funcionar; aquest «hauria» treballa de debò dins la frase, i hi ha tests d'integració contra un servidor git local a la llista.
El que no va resoldre
Hi ha una fallada que aquest canvi va fer més probable, no menys. La cadena de cripto que arrossega russh té un arbre genèric profund, i monomorfitzar-lo pot desbordar la pila de 8 MB per defecte de rustc:
error: rustc interrupted by SIGSEGV, printing backtrace
... LlvmCodegenBackend ... compile_codegen_unit ...Això no és una fallada del crate, i no és res que el crate pugui arreglar. L'apedacçat és donar-li a rustc més pila i menys paral·lelisme:
RUST_MIN_STACK=67108864 cargo install gitorii --locked -j 1La CI del mateix projecte també s'ho va menjar, en un runner Arch autoallotjat, i hi va dedicar una tarda abans d'assentar-se en una pila de 32 MB. Quan un entorn de compilació et baralla amb aquesta precisió, apunta el número que ho va acabar: el comentari de la capçalera de .gitlab-ci.yml és aquesta nota.