NUKE - Bouw je pipeline als echte code

1. Introductie

Ken je dat gevoel? Je opent de pipeline van een collega en treft een YAML-bestand van driehonderd regels aan. Een spatie of tab teveel of te weinig en de build crasht, en om het te debuggen moet je toch weer een commit pushen. Ik heb er zelf te veel tijd  aan verloren.

Met NUKE schreef ik mijn buildpijplijn als gewone C# met IntelliSense en breakpoints voor het debuggen. Geen aparte YAML. Gewoon C# code.

 

2. Wat is NUKE?

NUKE is een open-source build automation framework voor .NET.
Het idee is eenvoudig: je buildpipeline is een gewone C# consoleapplicatie. Targets, afhankelijkheden, parameters alles zit in de code, dus de compiler vangt fouten af tijdens de lokale build. Ook kan je de buildpipeline met NUKE volledig lokaal uitvoeren om de aanpassingen te testen, hierdoor voelt het als normaal programeerwerk!

Wat heb je eraan?

  • Fouten in de code direct zichtbaar.
  • Lokaal draaien, voer `nuke` uit lokaal, zonder eerst iets te pushen.
  • Werkt overal, een buildscript, inzetbaar op Azure DevOps, GitLab CI en GitHub Actions.
  • IDE-ondersteuning, gewoon debuggen en autocomplete in Rider of Visual Studio.
  • Veel integraties, NuGet, Docker, Kubernetes en meer zijn kant-en-klaar beschikbaar.
  • Makkelijk herbruikbaar te maken door zelf een package te maken met herbruikbare delen.
Nuke Project Structure

3. Hoe ziet dat eruit?

Een typische setup heeft targets voor Clean, Restore, Compile, Test en Publish. Je geeft per target aan van welke andere targets die afhangt, NUKE bepaalt zelf de volgorde. Wil je Test overslaan? Dan geef je `--skip Test` mee als argument. Wil je debuggen? Zet een breakpoint en stap er gewoon doorheen.

NUKE biedt een breedt aanbod van tools die je normaal ook zou gebruiken, maar ook custom code kan je toevoegen. Zo zou je bijvoorbeeld ook van de custom Bash scripten af kunnen stappen door dit in C# op te lossen.

Een volledig werkend voorbeeld vind je in de officiele NUKE documentatie: https://nuke.build/docs/getting-started/setup/
 

4. Uitvoeren in de pipeline

Het mooie is: je hoeft je buildlogica maar op één plek te schrijven. NUKE kan via `nuke :ci-generate` zelf de platformspecifieke YAML genereren. De YAML-bestanden voor ADO, GitLab en GitHub worden daarmee dunne wrappers die simpelweg je buildscript aanroepen.

Voeg je later een stap toe? Dan pas je alleen Build.cs aan - de YAML hoef je niet aan te raken. Voorbeeldconfiguraties voor alle drie de platforms staan in de documentatie: https://nuke.build/docs/cicd/azure-pipelines/ 

Nuke GithubActions

5. Conclusie

Wat NUKE voor mij het meest waardevol maakt, is dat je build eindelijk net zoveel aandacht krijgt als de rest van je codebase. Je kunt het testen, reviewen en refactoren. Geen aparte YAML meer waar andere regels gelden.

NUKE vervangt je CI platform niet, dat regelt nog steeds de triggers, de secrets en de omgevingen. Maar de echte logica zit voortaan in je repository, als gewone code.

6. Vergelijkbare tools in andere talen

Het idee van je build schrijven als echte code is niet nieuw en ook niet alleen voor .NET. In andere talen bestaan vergelijkbare tools:

 

Framework

Taal

Kernidee

Gradle

Java / Kotlin / Groovy

De facto standaard in de JVM-wereld; krachtige DSL, uitstekend voor Android- en Spring-projecten.

Bazel

Polyglot (Java, Go, C++…)

Ontwikkeld door Google; gericht op herhaalbaarheid en schaalbaarheid in monorepo's.

Pants

Python (polyglot)

Gericht op grote Python- en Java-codebases met snelle, incrementele builds.

Rake

Ruby

Ruby's antwoord op Make; taken gedefinieerd in Ruby-code, breed ingezet in het Rails-ecosysteem.

 

Dit lijstje heb ik via ChatGpt gemaakt, omdat mijn kennis van deze talen minimaal is, maar ik toch de opties wil laten zien.

Nuke logo 2
#replace title#