Suchen

ASP.NET-Apps auf AWS Elastic Beanstalk migrieren, Teil 3 Buildspec.yml für CodeBuild erstellen

| Autor / Redakteur: Dipl. -Ing. Thomas Drilling / Stephan Augsten

Wer seine ASP.NET-Anwendungen auf AWS migrieren möchte, muss zunächst ein Quellcode-Repository auf CodeCommit einrichten. Die Vorbereitung der Build-Umgebung ist der nächste Schritt, den wir heute in Angriff nehmen.

Firma zum Thema

Die YAML-Datei mit den Build-Spezifikationen für AWS CodeBuild.
Die YAML-Datei mit den Build-Spezifikationen für AWS CodeBuild.
(Bild: Drilling / AWS)

Für die Code-Kompilierung kommt bei einer AWS-DevOps-Pipeline der Service CodeBuild zum Einsatz, der für die eigentliche Übersetzung zuständig ist. CodeBuild startet im Wesentlichen einen Container mit einem vom Nutzer angegebenen Docker-Image, das die passende Build-Umgebung bereitstellt.

Anschließend führt CodeBuild eine Reihe von Befehlen aus, um die erforderliche Software zu installieren und den gewünschten Build oder die gewünschten (Unit-)Tests durchzuführen. Schließlich werden die vom Nutzer angegebenen Ausgabedateien - Artefakte - erstellt und in Form einer ZIP-Datei für die nächste Stufe der CodePipeline z. B. für AWS Code Deploy oder Beanstalk auf Amazon S3 hochgeladen.

Die Befehle, die CodeBuild im Container ausführt, werden in einer buildspec.yml-Datei spezifiziert, die Teil des Projekt-Quellcodes ist. Man kann auch eine fertige buildspec-Datei direkt zur CodeBuild-Konfiguration hinzufügen – es ist aber in der Regel komfortabler, die buildspec in der Quellcodeverwaltung zu erstellen und zu verfolgen.

Yaml-Datei für CodeBuild erstellen

Sofern man CodeBuild mit Windows-Containern ausführt, kommt PowerShell als Standard-Kommandozeile für die folgenden Befehle zum Einsatz. Die Datei muss auf den Namen „buildspec.yml“ lauten. Sie wird im Stammverzeichnis des neuen ASP.NET-Projekts zunächst leer angelegt, kann aber auch in Visual Studio dem Projekt hinzugefügt werden.

Für weitere Details zur Struktur und zum Inhalt von buildspec.yml-Dateien müssen wir auf die CodeBuild-Dokumentation verweisen. Das folgende Beispiel ist einen Blog-Eintrag aus dem AWS-Developer-Blog angelehnt. Man muss nur die Werte für PROJECT und DOTNET_FRAMEWORK durch den Namen und die .NET Framework-Zielversion des eigenen Projekts ersetzen.

version: 0.2
env:
   variables:
      PROJECT: WebApplication
      DOTNET_FRAMEWORK: 4.6.1
phases:
   build:
      commands:
         - nuget restore
         - msbuild $env:PROJECT.csproj /p:TargetFrameworkVersion=v$env:DOTNET_FRAMEWORK /p:Configuration=Release /p:DeployIisAppPath="Default Web Site" /p:PackageAsSingleFile=false /p:OutDir=C:\codebuild\artifacts\ /t:Package
artifacts:
   files:
      - '**/*'
   base-directory: 'C:\codebuild\artifacts\_PublishedWebsites\${env:PROJECT}_Package\Archive\'

Phasenweise

An der obigen Datei buildspec.yml lässt sich z. B. erkennen, dass die einzige für diese Beispielanwendung definierte „Phase“ die Erstellung („build“) ist. Wer vor oder nach dem Build weitere Aktionen ausführen muss, kann zusätzlich die Phasen „pre_build“ und „post_build“ hinzufügen. Der jeweils erste Befehl, der in der Build-Phase ausgeführt wird, ist die NuGet-Wiederherstellung, um alle NuGet-Pakete herunterzuladen, auf die das Projekt verweist.

Dann startet MS Build den Build selbst. Mit dem Parameter "/t:Package" wird die Ordnerstruktur für die Web-Bereitstellung generiert, die Elastic Beanstalk für ASP.NET Framework-Anwendungen erwartet. Dabei werden die Dateien „archive.xml“, „parameters.xml“ und „systemInfo.xml“eingeschlossen.

Standardmäßig ist die Ausgabe dieses Build-Typs eine ZIP-Datei. In Verbindung mit AWS CodePipeline komprimiert CodeBuild jedoch immer die „angegebenen“ Artefakt-Dateien, auch wenn diese bereits komprimiert sind.

Um dieses doppelte Komprimieren zu vermeiden, kann man den Parameter „/p:PackageAsSingleFile=false“ verwenden, der die Ordnerstruktur stattdessen in einem Ordner mit dem Namen „Archive“ ausgibt. Der Parameter „/p:OutDir“ gibt an, wo MSBuild die Dateien schreiben soll. In diesem Beispiel wird „C:\codebuild\artifacts\“ verwendet.

(ID:46354090)

Über den Autor

Dipl. -Ing. Thomas Drilling

Dipl. -Ing. Thomas Drilling

IT-Consultant, Trainer, Freier Journalist