Azure Pipeline Post Build Event nicht ausführen
In diesem Beitrag zeige ich wie man Post Build Events eines Visual Studio Projekts in einer Azure Pipeline nicht ausführt. Das kann in manchen Situationen notwendig sein und würde im schlimmsten Fall dazu führen, dass die Pipe immer mit einem Fehler abbricht.
Azure Pipeline Post Build Event nicht ausführen
DevOps Prozesse werden in Microsoft Azure DevOps entweder mit einem Assistenten zusammengeklickt, oder als *.yaml Skript konfiguriert. Alles was man so nicht lösen kann wird in PowerShell Skripte ausgelagert. Viele vordefinierte Elemente lassen sich aber durch Parameter individualisieren. Ein zentrales Element aller automatischen Build Pipelines ist der Build Task, der in der Standardeinstellung msbuild mit einigen Parametern ausführt. Ohne weitere Einstellungen führt dieser Task auch die Events (wie Pre- und Postbuild) von Visual Studio Projekten aus.
Problemstellung
Werden Events die man für die lokale Erstellung vom Code benötigt im automatischen Build ausgeführt, dann kann das ein Problem sein. Einige Beispiele:
- Das Post Build Event kopiert die aus dem Projekt erstellte *.dll Datei in den Programmordner. Auf der Azure VM, welche diesen Build ausführt existieren diese Pfade nicht. Wurde das nicht berücksichtigt schlägt der Build Prozess fehl.
- Das Projekt führt automatische Tests aus und benötigt dafür 3rd Party Programme. Über einen Post Build Event wird dieses vorbereitet. Auf einer Build VM sind diese Programme nicht installiert, der Build Prozess schlägt fehlt.
Lösung
Die einfachste und schnellste Lösung ist es, eine Condition für das Event hinzuzufügen. Am Beispiel einer C# Projektdatei (*.csproj) würde das wie folgt aussehen:
Diese Condition fragt zur Ausführungszeit die msbuild Variable AzureBuild ab und vergleicht deren Inhalt mit dem String „true“. Je nach Auswertung wird der definierte Command nun ausgeführt oder nicht. In meinem Fall ist diese Variable auf der lokalen Entwicklungsmaschine nicht gesetzt, also leer. In der Pipeline wurde die Variable mittels Parameter in der *.yaml Pipeline wie folgt definiert:
Die Folge daraus: das die DevOps Pipeline führt dieses PostBuild Event nicht aus.
Alternative Lösungen
Wie so oft gibt es viele Möglichkeiten, welche zu einem ähnlichen oder vergleichbaren Ergebnis führen. Sofern es die Projektgröße zulässt ist ein eigener Build Server zu empfehlen. Dort kann man sich das System für die Anforderungen entsprechend konfigurieren. Post Build Events sollten damit kein Problem mehr sein und man kann zusätzliche Features nutzen wie automatisierte Tests mit 3rd Party Programmen und theoretisch auch automatisierte UI Tests.
Eine weitere Möglichkeit, jedoch etwas weniger praktikabel ist die Definition einer eigenen DevOps Konfiguration. Das heißt neben Debug und Release gibt es dann noch eine dritte Option DevOps. Das funktioniert und kann bei Legacy Projekten Sinn machen. Von der Lösung ist aber im Allgemeinen abzuraten, da dies leicht zu stark abweichenden Konfigurationen für Release und DevOps führt.
Fazit
Ich habe gezeigt wie man Post Build Events für Azure DevOps optinal macht. Mit einer Condition und einer Variable in der Pipeline lässt sich somit der automatische Prozess des Builds besser steuern und man kann Features in der Projektdatei erzeugen die nur speziell für die Entwicklungsumgebung gelten.