Prečo používať build automation

Júl 2023

Za svoju kariéru som sa stretol s rôznym spôsobom ako buldovať dotnetovské projekty, od použitia Visual Studia, cez .bat súbory, Powershell a nakoniec som skončil pri build automation tooloch (konkrétne CakeNuke).

Späť by som sa už nevrátil. Prečo? Lebo tieto nástroje šetria čas a nervy.

Čo je to build automation tool

Pri vytvorení artefaktov projektu nejde len o to niečo skompilovať, treba s tým spraviť plno iných drobných vecí. To zahŕňa odstránenie starých artefaktov, kompiláciu závislých projektov, podpísanie binárok, konverziu dokumentácie do vhodného formátu, pridanie ďalších súborov do projektu (licencie, vygenerované SQL migrácie, konfiguráciu,…) a nakoniec vytvorenie balíčkov pre inštaláciu (zip, msi, deb,…) a nezabudnúť ju správne pomenovať.

K tomu celému je často v projekte viac výsledných inštalačných balíkov a nugetov. Taktiež je pred tým potrebné pustiť unit testy, či zaistiť rozdielne správanie pre release a prerelease build.

A práve tieto úlohy dokáže automatizovať build automation tool. Nie je to kompilátor, je o úroveň vyššie.

Znázornenie targetov v NUKE. Znázornenie závislostí medzi úlohami - NUKE (zdroj).

Prečo používať build automation

… pre .NET (aj v porovnaní so štandardami CI/CD pipelinami):

  • zdieľanie vedomostí v tíme a zastupiteľnosť kolegov,
  • build všetkých projektov sa spúšťa rovnako,
  • build funguje rovnako lokálne u vývojára ako na build serveri,
  • proces buildovania je možné odladiť lokálne (v gite nebude tisíc komitov pre úpravu YAML definície pipeline – do YAML proste breakpoint nedáš) ,
  • zníženie vendor-locku (nie je to napísané vo vendor špecifickej YAML pipeline), pri použití CI/CD je potrebný YAML jednoduchý (len spúšťa build automation tool), rovnakú definíciu je možné použiť na väčšinu projektov a napísať túto definíciu pre iného vendora nie je náročné,
  • pomocou targetov je možné spustiť rozne úlohy v CI/CD pipleine (napr. test, build, publish,…),
  • žiadne magické stringy, žiadne skryté požiadavky a menej prekvapení,
  • nie je to mágia, ale známy jazyk a knižnice a dokonca aj IDE.

V podstate celý proces buildovania (vrátane testov a uploadu artefaktov) sme presunuli z „ručnej roboty“ alebo YAML-u do programu, ktorému rozumieme.

Cake a NUKE

Cake (C# Make) a NUKE sú oba build automation tooly pre .NET a MS Build. Oba viac menej dokážu to isté a podobným spôsobom.

Čo majú spoločné:

  • pre inicializáciu používajú .NET global tool,
  • sú multiplatformové,
  • majú slušnú komunitu,
  • ide o DSL nad jazykom C# (závislosti, úlohy, cleanup, buildovanie, práca so súbormi, globing, version control, notifikácie,…),
  • vedia buildovať aj iné ako .NET projekty,
  • orientujú sa na úlohy (tasky/targety) so vzájomnými závislosťami,
  • ich funkcionalita ide rozšíriť pomocou nugetov (stále je to C#),
  • zdieľanie kódu je tiež možné pomocou nugetov,
  • majú podporu najznámejších test runnerov,
  • dokážu artefakty deploynúť a nasadiť (to sa často nepoužíva),
  • majú širokú podporu rozšírení a toolov (dotnet, MS Build, node.js, EsLint, upack, Docker, OpenCover, Sonarqube, git, Wix, Yarn,…),
  • majú dobre vyriešené logovanie.

Čo majú rozdielne:

  • Cake je napísaný ako „skript“ (v .cake súbore – vie s ním pracovať Visual Studio Code, plus je na to plugin),
  • NUKE používa .NET projekt priamo v solution (takže natívna podpora IDE),
  • ku rozšíriteľnosti pristupujú trochu inak,
  • príde mi, že Cake má viac extrených toolov/addonov,
  • Cake je vhodnejšie aj pre projekty s .Net Frameworkom,
  • NUKE dokaźe deklaratívne používať dotnet global tools,
  • NUKE dokáže parsovať .sln.csproj súbory,
  • NUKE vie generovať YAML súbory pre známe CI/CD riešenia.

Cake

Stránkahttps://cakebuild.net/
Ako začaťhttps://cakebuild.net/docs/getting-started/setting-up-a-new-scripting-project
Githubhttps://github.com/cake-build/cake
Integrácia na treťostranné baličkyhttps://cakebuild.net/extensions/
Ukážka použitiahttps://github.com/harrison314/PkcsExtensions/blob/master/build/build.cake

NUKE

Stránkahttps://nuke.build/
Ako začaťhttps://nuke.build/docs/getting-started/installation/
Githubhttps://github.com/nuke-build/nuke
Integrácia na treťostranné baličkyhttps://nuke.build/docs/common/cli-tools/
Ukážka použitiahttps://github.com/harrison314/Area52/blob/main/build/BuildProject/Build.cs

Ktorý si vybrať?

Typický príklad použitia týchto nástrojov je, že pri release builde sa spustia unit testy, do buildu sa vrazí git komit a nejaké premenné prostredia, výsledok sa zozipuje, dopíše sa verzia a niekde sa uploadne artefakt. Na čo bohate stačia oba tieto nástroje.

Oba tieto tooly sú dobré a dokážu podobné veci trochu iným prístupom. Čokoľvek, čo ide spraviť v C# ide spraviť aj pomocou týchto nástrojov.

NUKE je viac deklaratívne, tým ma človek ľahší začiatok a pokiaľ netreba naozaj špeciálne veci tak bohate stačí. Taktiež je príjemné mať intellisense vďaka tomu, že ide o konzolovú aplikáciu v rámci solution.

Cake je viac imperatívne, osobne ho používam o dosť dlhšie a možno aj pre to mi príde trochu univerzálnejšie, navyše vyhráva v počte integrácii na treťostranné služby a programy.

Záver

Myslím, že keď si človek vyberie hociktorý nástroj (Cake, NUKE), tak na začiatku nespraví chybu. Navyše kód pre build automation nebýva dlhý, tak to ide ľahko prepísať.

A ako som spomínal, už len samotné použitie takéhoto nástroja šetrí čas a nervy.

Osobne mi tieto nástroje priniesli hlavne to, že si viem buildy rýchlo odladiť lokálne. A keď som na dovolenke, tak mi nemusí nik volať ohľadom buidlovania knižnice XY, ktorú nutne potrebuje na vyriešenie bugu.