Planen Ihrer Buildaufgaben

Abgeschlossen

Mara verfügt jetzt über eine Kopie des Codes von Space Game. Sie erstellt ihn mithilfe von Microsoft Azure Pipelines anstelle des vorhandenen Ubuntu 22.04-Buildservers. Bevor sie dies aber tun kann, muss sie sich Gedanken über die vorhandenen Buildskripts machen. Begleiten Sie sie dabei, wie sie die vorhandenen Skripts den Azure Pipelines-Aufgaben zuordnet. Überlegen Sie, wie Sie dasselbe mit Ihrem eigenen Buildprozess machen können.

Im Folgenden finden Sie ein paar Notizen, die Mara gesammelt hat, als sie mit Andy, dem Entwicklungsleiter, gesprochen hat:

  • Auf dem Buildcomputer wird Ubuntu 22.04 ausgeführt.
  • Der Buildcomputer enthält Buildtools wie:
    • npm – Paket-Manager für Node.js
    • NuGet, der Paket-Manager für .NET
    • .NET SDK
  • Das Projekt verwendet „Syntactically Awesome Style Sheets“ (Sass), um das Schreiben von „Cascading Style Sheets“ (CSS) -Dateien zu erleichtern.
  • Das Projekt verwendet das gulp-Toolkit zum Minimieren von JavaScript- und CSS-Dateien.

Bei einer minimierten Ressource werden nicht benötigte Daten wie Leerzeichen entfernt und Variablennamen verkürzt, damit der Download schneller wird.

Hier sehen Sie die Schritte, die während des Buildprozesses ablaufen:

  1. Um die in package.json definierten Node.js-Pakete zu installieren, führen Sie npm install aus.
  2. Um Sass-Dateien (.scss) in CSS-Dateien (.css) zu konvertieren, führen Sie node-sass aus.
  3. Um JavaScript- und CSS-Dateien zu minimieren, führen Sie gulp aus.
  4. Um dem QA-Team bei der Identifizierung der Buildnummer und des Datums zu helfen, geben Sie die Buildinformationen in das Verzeichnis wwwroot aus.
  5. Um die Abhängigkeiten des Projekts zu installieren, führen Sie dotnet restore aus.
  6. Wenn Sie die App sowohl unter der Konfiguration „Debug“ als auch unter der Konfiguration „Release“ erstellen möchten, führen Sie dotnet build aus.
  7. Um die Anwendung als ZIP-Datei zu packen und die Ergebnisse auf eine Netzwerkfreigabe zu kopieren, damit das QA-Team sie dort abholen kann, führen Sie dotnet publish aus.

Mara erstellt ein Shellskript, das die von ihr identifizierten Aufgaben ausführt. Sie lässt es auf ihrem Laptop laufen.

Hinweis

Sie müssen dieses Skript weder ausführen noch vollständig verstehen, was es macht. Es soll nur illustrieren, was ein typisches Buildskript tun könnte.

#!/bin/bash

# Install Node.js modules as defined in package.json.
npm install --quiet

# Compile Sass (.scss) files to standard CSS (.css).
node-sass Tailspin.SpaceGame.Web/wwwroot

# Minify JavaScript and CSS files.
gulp

# Print the date to wwwroot/buildinfo.txt.
echo `date` > Tailspin.SpaceGame.Web/wwwroot/buildinfo.txt

# Install the latest .NET packages the app depends on.
dotnet restore

# Build the app under the Debug configuration.
dotnet build --configuration Debug

# Publish the build to the /tmp directory.
dotnet publish --no-build --configuration Debug --output /tmp/Debug

# Build the app under the Release configuration.
dotnet build --configuration Release

# Publish the build to the /tmp directory.
dotnet publish --no-build --configuration Release --output /tmp/Release

Das Verzeichnis /tmp bildet die Netzwerkfreigabe des Teams nach.

Nachdem sie das Skript ausgeführt hat, stellt Mara fest, dass es unvollständig ist. Zum Beispiel behandelt es keine Fehler. Es benachrichtigt niemanden, wenn Buildfehler auftreten. Selbst wenn Fehler auftreten, läuft es weiter. Es installiert auch nicht die Werkzeuge, die im jeweiligen Schritt erforderlich sind.

Was sind Azure Pipelines-Aufgaben?

In Azure Pipelines ist eine Aufgabe ein gepacktes Skript oder eine Prozedur, die mit einem Satz von Eingaben abstrahiert wurde.

Eine Azure Pipelines-Aufgabe abstrahiert die zugrunde liegenden Details. Diese Abstraktion vereinfacht die Ausführung allgemeiner Buildfunktionen, z. B. das Herunterladen von Buildtools oder Paketen, von denen Ihre App abhängig ist, oder das Erstellen Ihres Projekts mittels Ausführung von Visual Studio oder Xcode.

Hier ist ein Beispiel, dass die DotNetCoreCLI@2-Aufgabe verwendet, um ein C#-Projekt zu erstellen, das auf .NET abzielt:

task: DotNetCoreCLI@2
  displayName: 'Build the project'
  inputs:
    command: 'build'
    arguments: '--no-restore --configuration Release'
    projects: '**/*.csproj'

Die Pipeline kann diese Aufgabe beispielsweise in den folgenden Befehl übersetzen:

dotnet build MyProject.csproj --no-restore --configuration Release

Lassen Sie uns diese Aufgabe ein wenig mehr unterteilen:

  • Die DotNetCoreCLI@2-Aufgabe wird dem dotnet-Befehl zugeordnet.
  • Mit displayName wird der Aufgabenname festgelegt, der auf der Benutzeroberfläche angezeigt wird. Diesen Vorgang sehen Sie bald in Aktion.
  • Mit inputs werden die Argumente angegeben, die dem Befehl übergeben werden.
    • Mit command wird festgelegt, dass der dotnet build-Unterbefehl ausgeführt wird.
    • Mit arguments werden zusätzliche Argumente angegeben, die dem Befehl übergeben werden.
    • Mit projects wird angegeben, welche Projekte erstellt werden. Im obigen Beispiel wird das Platzhaltermuster **/*.csproj verwendet. ** und *.csproj sind Beispiele für Globmuster. Mit ** wird festgelegt, dass das aktuelle Verzeichnis und alle untergeordneten Verzeichnisse durchsucht werden. Der Teil *.csproj gibt eine beliebige Datei mit der Erweiterung .csproj an. Mit Platzhaltern können Sie mit mehreren Dateien arbeiten, ohne jede einzeln angeben zu müssen. Wenn Sie nur auf eine bestimmte Datei zugreifen möchten, können Sie auf Platzhalter verzichten und stattdessen ihren Namen angeben.

Das „@“ im Aufgabennamen (z. B. DotNetCoreCLI@2) bezieht sich auf die Version der Aufgabe. Wenn neue Aufgabenversionen verfügbar werden, können Sie im Laufe der Zeit zu diesen migrieren, um Zugriff auf neue Features zu erhalten.

Wie werden Aufgaben in einer Pipeline verwendet?

Als Nächstes wird Mara die vorhandenen Skriptbefehle den Azure Pipelines-Aufgaben zuordnen. Eine Pipeline wird unter Verwendung einer YAML-Datei erstellt. Hierbei handelt es sich um ein kompaktes Format, mit dem sich die Art von Daten, die in Konfigurationsdateien enthalten sind, leicht strukturieren lassen. YAML-Pipelinedateien werden in der Regel direkt mit dem Quellcode Ihrer App verwaltet.

Mit YAML hat Mara bereits in der Vergangenheit ähnliche Buildaufgaben und -konfigurationen definiert. Außerdem gefällt ihr die Idee, die Builddefinition als Code zu verwalten, da sie hier genauso wie bei anderen Projektteilen vorgehen muss.

Mara entscheidet sich dafür, in Visual Studio Code eine YAML-Datei zu erstellen, um ihr Build zu definieren. Sie gibt in die Datei alle Azure Pipelines-Aufgaben ein, mit denen sie die vorhandenen Skriptbefehle ersetzen möchte.

Zuordnen von Skriptbefehlen zu Azure Pipelines-Aufgaben

Im Folgenden erfahren Sie, wie Mara die Befehle ihres Skripts den Azure Pipelines-Aufgaben zuordnet.

Bei jeder Zuordnung greift sie auf die Referenzdokumentation zurück. Die Dokumentation kategorisiert Aufgaben nach Funktionen, wie Build oder Bereitstellen.

Mit der .NET Core CLI-Aufgabe DotNetCoreCLI@2 können beispielsweise dotnet-Befehle ausgeführt werden.

In der folgenden Tabelle werden die Skriptbefehle den neuen Azure Pipelines-Aufgaben zugeordnet:

Skriptbefehl Azure Pipelines-Aufgabe
npm install Npm@1
node-sass CmdLine@2 (oder script)
gulp gulp@1
echo `date` CmdLine@2 (oder script)
dotnet restore DotNetCoreCLI@2
dotnet build DotNetCoreCLI@2
dotnet publish DotNetCoreCLI@2

Es gibt keinen integrierten Aufgabentyp, der node-sass ausführt oder das Datum in eine Datei schreibt. Für diese verwendet Mara die Aufgabe CmdLine@2, mit der sie jeden gewünschten Befehl ausführen kann. Häufiger wird Ihnen allerdings die script-Aufgabe begegnen, die eine Verknüpfung zu CmdLine@2 ist. Weitere Informationen zu den anderen gängigen Aufgabenverknüpfungen finden Sie in der YAML-Schemareferenz für Azure Pipelines unter Schrittedefinition.

Im weiteren Modulverlauf erstellen Sie selbst eine YAML-Datei, in der diese Aufgaben verwendet werden.

Überprüfen Sie Ihr Wissen

1.

Eine Buildaufgabe: