In diesem Artikel möchte ich euch mein Projekt „NugetWrapper“ vorstellen. Hintergrund des Programmes ist das NuGet-Plugin von Jenkins. Es fehlen leider ein paar Funktionen im Plugin bzw. Nuget, um den Buildprozess zu verbessernF.

Das Wichtigste vorab: Ihr findet die Links zu den Projekten am Ende des Artikels.

Hintergrund

Es gibt ein Jenkins-Plugin, um nach erfolgreichem Kompilieren die NuGet-Pakete auf einem NuGet-Server zu veröffentlichen. Das Einrichten ist sehr schnell erledigt.

Bei einem Build-Job können die Pakete, anhand ihres Dateinamens, gefiltert werden. Ein Platzhalter wie *.nupkg veröffentlicht alle gefundenen Pakete. In einem Ausgabeverzeichnis kann durchaus mehrere solche Dateien enthalten. Wenn der Ordner nicht regelmäßig aufgeräumt wird, werden auch ältere Paketversionen nochmals veröffentlicht.

An sich ist das kein Problem, da der Nuget-Server doppelte Pakete zurückweist und nicht veröffentlicht. Das Problem besteht darin, dass das Plugin einen kompletten Build als Fehler markiert, wenn das Veröffentlichen fehlschlägt. Auch wenn kompilieren und erstellen der Anwendung ohne Fehler möglich war.

Sofern eine Solution (im Sinne von Visual Studio) nur ein einziges Paket erzeugt sollte dieses Problem nicht auftreten. Hat eine Solution allerdings mehrere Projekte (z.B. Lib.Core, Lib.Abstractions und Lib.Extensions) wird es schwierig. Hier ist es möglich, dass sich ein Paket ändert, die anderen jedoch nicht. Aufgrund des allgemeinen Filters werden auch bereits veröffentlichte Pakete erneut veröffentlicht.

Genau hier kommt der NuGetWrapper ins Spiel.

Aufruf durch Jenkins

Das Plugin erzeugt folgenden Aufruf für jedes Package:

Nuget.exe push Package_Name1.0.0.nupkg API_KEY -Source https://YourNugetServer.com -NonInteractive

Der Aufruf ist recht schnell erklärt:

  • Nuget.exe – Aufrufen der Nuget Kommandozeile
  • push – Befehl zum senden des Paketes an Nuget
  • Package_Name1.0.0.nupkg – Das Paket, welches gepusht werden soll
  • API_KEY – Token zur Authentifizierung am Server
  • -Source https://YourNugetServer.com – Adresse vom NugetServer
  • -NonInteractive – Unterdrücken von Benutzereingaben oder Bestätigungen

Bei korrekten Parametern wird das Paket richtig gepusht und der Server liefert HTTP 200 (OK) zurück. Ansonsten gibt es einen HTTP-Fehlercode.

Funktion und Aufbau des Wrappers

Die Funktion vom Wrapper ist einfach gehalten. Er prüft vor dem push, ob es bereits ein Paket mit dem Namen und der Version auf dem Server gibt. Wenn es das Paket gibt, wird es übersprungen. Fehlt es, wird es gepusht.

Die Paketinformationen werden aus den Nupkg selbst extrahiert. Es handelt es sich um ein Paket im Format der Open Packaging Conventions. Die Klasse PackageInfo entpackt das Paket und liest die notwendigen Informationen aus der nuspec-Datei aus.

Anschließend erfolgt ein Aufruf mittels nuget list, um die Pakete mit dem Paketnamen zu ermitteln. Das Programm prüft die Version und ruft ggfs. nuget push auf und reicht die Parameter durch.

Es gibt in dem ganzen Projekt nur 3-4 kleine Klassen, welche jeweils eine Aufgabe übernehmen:

  • Wrapper für die Konfigurationsparameter
  • Wrapper für die Nuget-Integration
  • Klasse zum Auslesen der Paketdefinition
  • Programm selbst, zum Kombinieren der Klassen und Aufrufe

Einrichtung

Unter dem Tab „Releases“ wird ein ZIP mit der kompilierten .exe bereitgestellt. Die .exe und .exe.config werden in ein beliebiges Zielverzeichnis kopiert. Wichtig ist der korrekte Pfad zur nuget.exe in der Konfigurationsdatei, da die Anwendung darauf aufbaut.

Weitere Details stehen in der Readme.

Mögliche Verbesserungen

Aufgrund der spezifischen Anforderung an die Jenkins-Integration ist die Implementierung minimalistisch gehalten (YAGNI 🙂 ). Daher ergeben sich ein paar interessante Ergänzungen für den „normalen“ Gebrauch. Anschließend kann das Plugin direkt auf diese Anwendung verweisen oder der Aufruf mittels Kommandozeile erfolgen.

  • Portierung auf .NET Core (aufgrund der fehlenden ZIP-Bibliothek nicht gemacht)
  • Implementierung einer Fehlerbehandlung
  • Prüfen auf Argumente bzw. Standardwerte für fehlende Argumente verwenden

Fazit

Ich habe das Programm jetzt seit einiger Zeit im Einsatz und bisher (auch im Zusammenhang mit dem Jenkins-Plugin) sind keine Probleme aufgetreten. Ich finde es persönlich schade, dass die Nuget-Konsole noch keinen Parameter hat, um bereits veröfentliche Pakete ohne Fehler zu überspringen. Ein Ticket auf GitHub gibt’s schon seit längerer Zeit.

Ich hoffe, dass das Programm auch für euch interessant ist. Ihr könnt mir gerne einen Kommentar, Ticket oder PR zukommen lassen.


Bildquelle: Pixabay.com

NugetWrapper: https://github.com/mbedded/NugetWrapper

Nuget Dokumentation: https://docs.microsoft.com/en-us/nuget/tools/nuget-exe-cli-reference