Continuous Integration

NuGets erstellen im Jenkins Build

Die Idee – Jenkins baut NuGets für mich

Nachdem ich die Vorteile von NuGets genieße habe ich auch meine Librarys entsprechend verpacken wollen. Und da ich für alle meine Projekte auch Jenkins nutze, sollte das hier natürlich ebenso der Fall sein. Mein angestrebter Flow war damit wie folgt:

  • Die Konfiguration des Packages sollte natürlich innerhalb des Source-Repositories erfolgen.

  • Die Erstellung des eigentlichen Paketes dann von Jenkins am Ende des Builds.

  • Das Deploy reichte im lokalen Netz. Also ein einfacher Ordner. Dieser kann dann in NuGet als Quelle konfiguriert werden.

  • Für die Versionsnummern finde ich eigentlich “Semantic Versioning” sehr gut. Für unsere internen Zwecke wollte ich aber etwas Einfacheres. Das Datum des Checkins rückwärts als Versionsnummer wurde also das Ziel.

Die Ernüchterung

Nach etwas Recherche zeigte sich jedoch, dass sich das Meiste gut und einfach abbilden lässt. Die automatische Versionierung ist aber nicht ganz so einfach zu lösen. Die Vorhandenen Lösungen zählen z. B. Builds hoch. Um dann herauszufinden welche Repositoryversion dahintersteckt muss man erst an den Jenkins und kommt von da an das Log. Behält man nur die letzten 10 Builds z. B. ist eine Nachverfolgung schwierig.

Also habe ich ein kleines Tool geschrieben welches die commit-UID als Parameter nimmt. Zu dem commit holt es die Checkinzeit und schreibt die als Version in das Projekt. Ein commit vom 13.02.2016 12:04 wird somit zu V16.02.13.1204. Im Changelog gruppiere ich Änderungen je Monat. “V16.02.*” Dadurch kann ich anhand der Versionsnummer exakt den commit bestimmten aus dem die Version kompiliert wurde. (Dies gilt sowohl für NuGets, als auch für eine Anwendung)

%SetVersion% SetByHg %MERCURIAL_REVISION% "%Workspace%/MyProject/Properties/AssemblyInfo.cs"

Hinter %SetVersion% steckt der Pfad zu dem kleinen Tool. SetByHg ist ein Parameter, es gibt auch SetByGit. %Mercurial_Revision% erhalte ich von Jenkins. Und zuletzt braucht das Tool den Pfad zur AssemblyInfo um diese anzupassen

Na also Jenkins, geht doch

Zusammen mit dem Projekt wird noch eine folgendermaßen aufgebaute Datei eingecheckt, die packages.nuspec.



  
      $id$
      $version$
      $author$
      $description$
      Changelog
     

    [Optional]

Die Variablen werden durch die entsprechenden Werte aus der Projektdatei ersetzt. Der Rest ist dann im Prinzip relativ geradeaus und zeigt sich im Jenkins wie folgt:

nuget pack MyProject.csproj -Outputdirectory "%NuGetShare%" -Prop Configuration=Release -Prop Platform=x86

%NuGetShare% ist das Verzeichnis, wo alle meine selbst erstellten NuGets drin landen. Im Visual Studio wird dieses Verzeichnis als Package Repository konfiguriert und schon kann man seine Packages in allen Projekten komfortabel verwenden.

Tags

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Back to top button
Close