Simpal met NativeLink – turbocharge je builds zonder de koffie koud te laten worden

Er zijn projecten die op papier klein ogen, maar een kijkje onder de motorkap (en het nodige denkwerk om het concept te snappen) laat zien hoe je als developer met de juiste tools veel tijd en resources bespaart. NativeLink is er zo eentje en als (voor mij) eerste kennismaking heb ik er Simpal mee gemaakt. Aan de buitenkant een simpele rekenmachine (ToyCalc), maar ook een showcase van hoe je het buildproces slimmer en sneller maakt.

Met NativeLink van Trace Machina dus. De belofte vooraf: na een paar keer bouwen met NativeLink voelt lokaal compilen ineens alsof je terug bent in de tijd van dial-up internet, oef…

De façade: ToyCalc

ToyCalc zelf is niets meer dan een simpele calculator in Python. Het draait hier echter niet om het rekenen maar om de setup. De manier waarop dependencies, distributies en builds zijn geregeld, dat is waar de magie zit.

Simpal gebruikt Bazel, een serieus stuk gereedschap dat bekendstaat om z’n deterministische builds en herbruikbare artefacten. En precies daar haakt NativeLink slim op in.

De “cheat code”: NativeLink in je build

Kijk naar onderstaand stukje van build.sh. Hier zie je meteen dat NativeLink letterlijk een schakelaar is voor full remote execution of gewoon caching met een environment variable:

if [ "$USE_REMOTE_EXEC" = "1" ]; then

  echo "[INFO] Using full remote execution via NativeLink (--config=remote-exec)"

  BAZEL_FLAGS="--config=remote-exec"

else

  echo "[INFO] Using local execution with remote cache (default)"

fi

bazel build //:build_pyinstaller $BAZEL_FLAGS --verbose_failures

Oftewel:

Zet USE_REMOTE_EXEC=1 en je build gaat de cloud in, draait daar snel z’n rondje en komt terug met een keurig pakketje.

Laat je ‘m uit, dan gebruik je NativeLink “gewoon” als slimme cache.

Je hoeft verder niets te doen dan wel/niet kiezen voor de cloud build en ineens gaat het veeeel sneller.

NativeLink via Nix: een helper met smaak

De code is geschreven voor macOS waarbij NativeLink wordt geïntegreerd zodat je het via een shell-functie kunt gebruiken. Dus kan zijn dat je voor ander OS wat moet aanpassen.

NATIVELINK_HELPER='nativelink() {

  if [[ "$1" == "--help" || "$1" == "--version" ]]; then

    nix run github:TraceMachina/nativelink \

      --extra-experimental-features nix-command \

      --extra-experimental-features flakes -- "$@"

  else

    nix run github:TraceMachina/nativelink \

      --extra-experimental-features nix-command \

      --extra-experimental-features flakes \

      "$HOME/GitHub/taatuut/simpal/basic_cas.json5" "$@"

  fi

}'

Dat betekent dat je (na één keer je terminal opnieuw starten) je gewoon nativelink build kunt tikken zonder de extra flags.

Waarom is dit handig

Voorkomt “het werkt -alleen- op mijn machine” en versnelt het build proces.

Met NativeLink worden builds consistent, cachebaar en reproduceerbaar waarbij collega’s en de CI-server dezelfde artefacten gebruiken.

De snelheid krijg je ‘kado’ door gebruik maken van cloud infrastructuur en bovenal het feit dat NativeLink alleen dat opnieuw doet waar veranderingen in de code aan ten grondslag liggen. In mijn simpele calculator projectje zie je vooral verschil tussen eerste build en navolgende. Zonder veranderingen in de build (ja waarom dan builden, maar even als praktische verificatie van de theorie) gaat dan dus razendsnel, en ook bij wijzigingen is het sneller vanwege het hierboven genoemde: alleen doen wat nodig is. Echte winst ga je daar natuurlijk vooral mee halen in grote(re) projecten die vaak gebuild, getest en gereleased worden.

Wat heb ik nu weer geleerd

Je hebt niet per se een megaproject nodig hebt om met NativeLink te werken. Een kleine repo als ToyCalc is genoeg om het nut te laten zien. En als dit werkt voor deze demo, werkt het nog beter voor een enterprise-monorepo met 600 microservices.

Is remote de toekomst voor alle builds? Dat weet ik niet, maar voor enterprise projects met meerdere participanten is het zeker een valide optie zo te zien aan de bedrijven op de NativeLink website die er al mee bezig zijn.

NativeLink verandert hiermee een spelregel van software bouwen waardoor traaaage en inconsistente builds niet langer nodig zijn.

Geinteresseerd? Check de Simpal repo en lees meer over NativeLink en Trace Machina . Laat me vooral ook horen wat je ervan denkt!

Do Androids Dream of Electric Sheep?

I don’t know, maybe I should ask ChatGPT some time. What I do know is that I’ll soon have the possibility to build my own droid with the Viam Rover! Look at this mail…

And I already got me the Raspberry stuff I need with the Rover. I played a bit with the Viam robotics platform in the recent past and created and controlled a virtual robot. But way cooler to build a real one of course. Oh, for those who want to try Viam with a real robot right now, go to https://www.viam.com/resources/try-viam and take over a Rover in their robotics lab in New York for a while.

So from now on keeping my eyes on the mailbox while finding some inspiration. I have some help with that by the way.

Yes, these firespitting robots once aired on Wondere Wereld with Chriet Titulaer for those amongst us old enough to remember that crazy 80s show.

Even kort over de laatste DataEther blog post

Bij DataEther blijven we keihard werken aan de verdere ontwikkeling van de Data Fitness software, terwijl we tegelijkertijd een Proof of Concept ermee uitvoeren. Deze combinatie is een erg waardevolle leerschool waarbij we opgedane ervaringen uit de praktijk meteen toepassen in de volgende verbeterslagen van zowel de software als de analyses.

Een van de aandachtsgebieden nu de hoeveelheid data flink groeit, is efficient gebruik van resources van het cloud platform, en op peil houden of beter zelfs verbeteren van de performance.

Daar moeten we als ontwikkelteam zelf slim in zijn (lukt meestal aardig…), maar wat hulp is nooit weg. Het is daarom mooi om te zien dat de standaard mogelijkheden van het MongoDB Atlas application data platform zoals de Performance Advisor, ons ook snel verder helpen.

Op de DataEther site is daarover nu een blog post te vinden, zie https://www.dataether.nl/uncategorized/rounding-cape-horn/

#easyscalability #nodowntime #developerfriendly #performance

Teaser…

Now I’m back on the writing track I might as well just add a first teaser about another project I’m working on. It is not a home alone project, quite a bit more than that, and it includes some serious technological challenges.

Here is the teaser:

Curious to hear what you think of it. Feel free to post your ideas in the comments. There will be healthy rewards for whoever gets close to the actual concept, and also for best contribution.