CI und CD für GitHub mit AppVeyor

In diesem Post zeige ich wie sich Continuous Integration und Continuous Delivery für ein GitHub Repository umsetzen lässt. Dabei soll ein .NET Projekt bei jeder Änderung gebuildet und auf manuelles zu tun released werden (neuer Git Release inkl. Tag und NuGet-Package auf NuGet.org). Dafür verwende ich AppVeyor. Als Beispiel Projekt dient https://github.com/msallin/SQLiteCodeFirst.

AppVeyor verwendet MSBuild für das builden der Projekte. Der Build erfolgt auf einem Windows Server 2012 R2. Für Open Source Projekte ist AppVeyor kostenlos.

Vorarbeiten

  1.  AppVeyor account eröffnen (http://www.appveyor.com/)

CI – Continuous Integration

Jeder Push welche in das Repository gemacht wird, soll ein Build ausgeführt werden. Das gilt für jeden Branch, Zusätzlich soll ein Build ausgeführt werden, wenn ein Pull-Request gemacht wurde.

  1. Neues Projekt erstellen (https://ci.appveyor.com/projects)
  2. Projekt konfigurieren
AppVeyor_2
Das entsprechende Repository auswählen, das gebuildet werden soll. Dabei wird dem Repository ein WebHook hinzugefügt.
AppVeyor_3Next Build number: wird automatisch hochgezählt
Build version format: So wird der Build “benannt”. Für den CI-Build spielt die Versionsbezeichnung keine Rolle.
Default Branch: Der Branch welcher gebuildet wird, wenn der Build manuell ausgelöst wird
Branches to build: “All branches” jeder branch im Repo wird bei einem Push automatisch gebuildet.
Do not bulid tags: Kein Build auslösen wenn ein Tag erstellt wird.
AppVeyor_4Configuration: Der CI Build soll jeweils mit der Debug sowie mit der Release Konfiguration durchgeführt werden.Package NuGet projects: Aus im Projekt enthaltenen NuSpec-Dateien sollen automatisch NuGet-Packages erstellt werden. Diese werden nicht weiter verwendet aber es wird validiert ob das Package erstellt werden kann.
AppVeyor_5Das DLL soll zu den Artefacts hinzugefügt werden. Für die Pfadangabe können Wildcards verwendet werden. Damit alle Build-Konfigurationen (Debug, Release) verwendet werden können wird hier von einer Wildcard gebraucht gemacht.Nupkg Dateien werden automatisch zu den Artefacts hinzugefügt.

CD – Continuous Delivery

Der Master Branch soll, manuell ausgelöst, gebuildet werden.
Das resultierende DLL soll als GitHub Release und das nupkg auf NuGet.org veröffentlicht werden.

  1. Neues Projekt erstellen
  2. Projekt konfigurieren (Dabei ist vorzugehen wie beim CI Build. Ausnahmen sind unten aufgeführt)
    1. General
      1. Build Version: Muss eine Version im Format “0.0.0.0” sei
      2. Branches to build: “Only Branches below” -> “master”
      3. Assembly Patching: Einschalten. Bei allen Attributen “{version}” einfügen ({version} entspricht der aktuellen Build Version)
    2. Build
      1. Configuration: Release
      2. Package NuGet projects: Ja
      3. Include NuGet symbol packages: Ja
    3. Deployment
      1. Provider “NuGet”
        1. Deploy from branch: “Master”
        2. API Key: Beziehen von https://www.nuget.org/account
      2. Provider “GitHub Releases”
        1. Tag Name: “v$(appveyor_build_version)” (Die Build Version)
        2. Release Name: “v$(appveyor_build_version)” (Die Build Version)
        3.  : Neuer Token erstellen https://github.com/settings/applications
        4. Artifact(s) to deploy: Der Name des DLL Artefacts
        5. Draft Release: Ja (Damit noch die Release Notes eingefügt werden können)
        6. Deploy from Branch: “Master”
  3. Hook entfernen
    Im Moment wird der Bulid automatisch ausgelöst.
    Deshalb muss der entsprechende WebHook Eintrag im Git Repo entfernt werden.

NuGet Package

Dem Projekt, das als NuGet-Package deployt werden soll, muss ein “.nuspec” File hinzugefügt werden. Das wird danach verwendet um das NuGet-Package zu erstellen.
Damit die Version des Builds für das NuGet-Package übernommen muss im NuSpec file folgendes angegeben werden “<version>$version$</version>”. Bei dieser Einstellung wird die Version des Assemblies für das NuGet-Package übernommen. Diese Version wiederum wird durch das Assembly Patching gesetzt.

Resultat

1. Bei jedem Push wird der jeweilige Branch gebuildet. Des weiteren wird das NuGet-Package basierend auf dem nuspec File erstellt. Das Assembly, das NuGet-Package und das NuGet-Symbol-Package werden als Artefacts des Buildes hinzugefügt.

2. Bei jedem Pull Request wird der Zielbranch inkl. dem zu mergendem Content gebuildet. Das Resultat ist im Pull Request ersichtlich

3. Der Release Build, basierend auf dem Master Branch kann manuell ausgelöst werden. Dabei wird automatisch ein neuer GitHub Release erstellt und das NuGet-Package auf Nuget.org veröffentlicht.

Leave a Reply

Your email address will not be published. Required fields are marked *