- ASP.NET Core Razor Pages
- ASP.NET Core WebApi
- Entity Framework Core
- Unit of Work / Repositories
- Validierung
- Azure Grundlagen
- Azure Web App
- Azure DevOps
- Azure Build Pipelines
- Azure Release Pipelines
Es ist eine einfache Anwendung zur Verwaltung von Sensoren un deren Messwerte gegegeben. Diese lokal lauffährige Anwednung (Web API und Web App) soll nun per Continuous Integration und Continuous Deliviery gebaut und ausgeliefert werden. Somit können kurze Release Zyklen eingehalten werden was die Kennzahl time to market
für neue Features drastisch reduziert.
Die Grundfunktionalität ist bereits implementiert und befindet sich im Ordner source/
Die Entitätsklassen sind bereits angelegt. Auch die Annotationen zur Definition (inkl. der Migrationen) der Datenbank sind bereits implementiert.
Die einzelnen Zeilen der csv
-Datei werden verarbeitet sodass am Schluss eine Collection von Measurements
mit ihren Sensoren
zurückgegeben wird.
Die Migration wurde bereits angelegt und muss nur verwendet werden, wenn an den Entitätsklassen Änderungen vorgenommen werden:
- Persistence als StartupProject
Add-Migration InitialMigration
UpdateDatabase
mit Kontrolle, ob DB angelegt wurde- Die Daten über die ImportConsole importieren.
Die ConnectionStrings
wurden in den relevanten Projekten schon in der appSettings.json
festgelegt.
Die Web App besteht aus folgenden Seiten.
Anforderungen:
- Anzeige der Sensoren
- Sortierung nach Name und Location
- Dritte Spalte enthält die Anzahl der Messungen für den Sensor
- Nicht alle Messwerte aus der Datenbank laden!
- Der Name führt als Link zu einer Übersicht der Messwerte für den Sensor
- Der Link "Edit Sensor" verweist auf eine Bearbeitungsseite für den Sensor
Anforderungen:
- Funktionalität
- Name, Unit und Location können geändert werden
- Validierungen
- Siehe nächste Überschrift
- Es sind entsprechende Fehlermeldungen beim fehlerhaften Feld auszugeben
- "Save" führt zur Überblicksseite des Sensors mit den letzten 20 Messungen
- "Back to List" führt wieder auf die Hauptseite
Nach dem Anlegen kontrollieren Sie das Ergebnis über die Hauptseite.
- Name (Pflichtfeld)
- Location (Pflichtfeld)
- Es dürfen keine zwei Sensoren mit dem gleichen Namen und der gleichen Location existieren!
Diese Seite erreicht man über den Namenslink (1. Spalte) der Hauptseite.
Neben den Stammdaten des Sensors sind die letzten 20 Messwerte inklusive Zeit, Wert und Einheit auszugeben.
Es sind bereits folgende API-Controller implementiert.
-
Die Struktur der Daten entnehmen Sie dem Musterausdruck:
-
Sollte die id nicht existieren, ist NotFound zurückzugeben
-
Liefert für den Sensor den zu der Zeit gültigen Wert
-
SensorId 5:
20.10.2018 13:00
-
SensorId 5:
20.10.2018 12:59:16
-
SensorId 5:
20.10.2018 12:59:17
-
SensorId 5:
20.10.2017 13:00
-
Erzeugt für den Sensor einen neuen Messwert
-
Zeit darf nicht in der Zukunft liegen
-
Ungültige SensorId liefert
NotFound
-
Liefert die Sensordaten (entsprechend Muster) und die Anzahl der Messungen je Sensor
-
Sortiert nach Sensorname und Location
-
Es sind möglichst wenige Daten von der Datenbank zu laden
-
Die Dauer der Abfrage ist zu optimieren
-
Liefert die Sensordaten (entsprechend Muster) und den Durchschnitt der Messwerte je Sensor
-
Sortiert nach Sensorname und Location
-
Es sind möglichst wenige Daten von der Datenbank zu laden
-
Die Dauer der Abfrage ist zu optimieren
Microsoft bietet neben GitHub, welches hauptsächlich zum Verwalten von Open Source Projekten verwendet wird auch Azure DevOps an.
-
Melden Sie sich bei Azure DevOps mit ihrem <IhrName>@htblaleonding.onmicrosoft.com Benutzer an.
-
Erstellen Sie ein neues Projekt:
- Name:
SmartSchool-Azure
- Visiblity:
Public
- Name:
-
Klonen Sie das (leere) Azure DevOps Projekt in Visual Studio
- Wählen Sie in Visual Studio ihren <IhrName>@htblaleonding.onmicrosoft.com Benutzer aus.
- Wählen Sie den lokalen Pfad aus, wohin das Projekt geklont werden soll (z.B.:
c:\HTL\SmartSchool-Azure
).
-
Übernehmen Sie die bereits fertige Implementierung
source/
in das geklonte lokale Projektverzeichnis (z.B.:c:\HTL\SmartSchool-Azure
). -
Öffnen Sie die Solution
SmartSchool.sln
in Visual Studio. -
In Visual Studio sollten Sie nun folgende Darstellung haben:
-
Vorbereitung der lokalen Datenbank
-
Starten der Web App bzw. der Web Api
-
Commiten und pushen sie die Änderungen in das Azure DevOps Projekt
Die Web App bzw. die Web Api (Swagger) sollten wie in den Screenshots dargestellt aufgerufen werden. Erst danach können die folgende Punkte des Tutorials durchgeführt werden!
Unter Continuous Integration versteht man die fortlaufende und permanente Zusammenführung aller Komponenten zur kompletten Anwendung.
Dh. dass bei jeglicher Code-Änderung (Push in das Git-Repository) ein Compile- und Testzyklus durchlaufen wird und am Ende als Resultat die ausführbare Anwendung als Artefakt hinterlegt wird. Auf diesem hinterlegten Artefakt setzt dann im Anschluss Continuous Deliviery auf - siehe dazu dann das nächste Kapitel.
-
Melden Sie sich bei Azure DevOps mit ihrem <IhrName>@htblaleonding.onmicrosoft.com Benutzer an.
-
Navigieren Sie im Projekt
SmartSchool-Azure
zum Abschnitt Pipelines: -
Erstellen Sie eine neue Pipeline:
-
Wählen Sie die Quelle für ihren Source Code aus - in diesem Fall
Azure Repos Git
: -
Wählen Sie das Repository aus - in diesem Fall
SmartSchool-Azure
: -
Wählen Sie die Vorlage für ihre Pipeline aus - in diesem Fall
Starter pipeline
: -
Bennen Sie die Pipeline 'build-all.yml' und ersetzen Sie die Vorlage mit folgendem Code (Source zum Kopieren finden Sie unten):
-
Der
Trigger
legt fest wann die Pipeline ausgeführt werden soll Details. In diesem Fall wird die Pipeline bei jedem Push auf denmaster
Branch ausgeführt. -
Der
Pool
legt die Umgebung fest in welcher die Pipeline ausgeführt werden soll Details. In diesem Fall ist dies ein Windows Server 2019 (windows-latest
). -
Im Abschnitt
Variables
können Variablen definiert werden, welche im Weiteren dann verwendet werden können. -
Dieser Step stellt sicher, dass das Werkzeug
NuGet
zur Verfügung steht. -
In diesem Schritt werden die
NuGet
-Pakete, welche in den einzelnen Projekten definiert sind geladen. -
Nun wird die gesamte Solution kompiliert.
-
In diesem Schritt werden die Unit Tests durchgeführt.
-
Hier wird die Datei
.runsettings
in dasStaging
-Verezichnis kopiert. Dorthin werden alle Dateien kopiert, welche im letzten Schritt (9) dann alsBuild Artefakt
veröffentlicht werden sollen. -
Abschließend werden alle Dateien aus dem
Staging
-Verzeichnis alsBuild Artefakt
veröffentlicht. Diese Artefakte dienen als Basis für die Auslieferung in derRelease Pipeline
.
Source:
trigger: - master pool: vmImage: 'windows-latest' variables: solution: '**/*.sln' buildPlatform: 'Any CPU' buildConfiguration: 'Release' steps: - task: NuGetToolInstaller@1 displayName: NuGet (Installation) - task: NuGetCommand@2 displayName: NuGet (Restore) inputs: restoreSolution: '$(solution)' - task: VSBuild@1 displayName: Build Solution inputs: solution: '$(solution)' msbuildArgs: '/p:DeployOnBuild=true /p:WebPublishMethod=Package /p:PackageAsSingleFile=true /p:SkipInvalidConfigurations=true /p:DesktopBuildPackageLocation="$(build.artifactStagingDirectory)\WebApp\WebApp.zip" /p:DeployIisAppPath="Default Web Site" /p:GenerateDocumentation=true' platform: '$(buildPlatform)' configuration: '$(buildConfiguration)' - task: DotNetCoreCLI@2 displayName: 'Run Unit Tests' inputs: command: 'test' arguments: '--no-build --configuration $(buildConfiguration)' publishTestResults: true projects: '**/SmartSchool.Test.csproj' - task: CopyFiles@2 displayName: Copy Test Configuration inputs: SourceFolder: '$(Build.SourcesDirectory)' Contents: '**/*.runsettings' TargetFolder: '$(build.artifactStagingDirectory)' - task: PublishBuildArtifacts@1 displayName: Publish SmartSchool.Web as Build Artefact inputs: artifactName: drop
-
-
Führen Sie die Pipline rechts oben per
Run
aus. -
Während der Ausführung der Pipline können Sie sich die Logs der einzelnen Scrhitte anzeigen lassen:
-
Nachdem die Pipeline ausgeführt wurde sehen Sie folgendes Ergebnis:
Sie sehen einerseits, dass alle Schritte der Build Pipline erfolgreich durchgeführt wurden, sowei der kompilierte Code aus dem
master
-Branch stammt, genau einBuild Artefakt
erzeugt/veröffentlicht wurde und dass alle Tests (100%) erfolgreich durchgeführt wurden.
Die Build-Pipeline muss erfolgreich durchlaufen werden. Erst danach können die folgende Punkte des Tutorials durchgeführt werden!
Auf Basis der kompilierten Artefakte (Web App mit Razor Pages und die Web Api) kann nun eine Auslieferung erfolgen. Sollte bei jedem Build
eine Auslieferung erfolgen so spricht man von Continuous Deliviery.
-
Melden Sie sich im Azure Portal mit ihrem <IhrName>@htblaleonding.onmicrosoft.com Benutzer an.
-
Wechseln Sie rechts oben auf das
Standardverzeichnis
: -
Dort sollten Sie eine
Resource Group
mit ihrem Namen finden, in welcher Sie nun die inAzure
gehostete Web-Site konfigurieren werden.Hinweis: Eine
Resource Group
stellt einen Behälter dar, in welchem verschiedenste Azure Services zusammengefasst werden können. -
Wählen Sie ihre
Resource Group
aus und klicken Sie aufAdd
: -
Suchen Sie nach dem Service
Web App
-
Legen Sie folgende Konfiguration für ihre neue
Web App
fest:Bei Punkt (1) ist wichtig, dass Sie anstatt
smartschool-jf
hinten ihr Kürzel anstatt-jf
verwenden! -
Analog zur
Web App
für die Produktivumgebung legen Sie auch eineWeb App
für die Staging Umgebung an:Bei Punkt (1) ist wichtig, dass Sie anstatt
smartschool-jf-staging
ihr Kürzel anstatt-jf-
verwenden! -
Konfiguration der erstellten
Web App
Services (smartschool-jf-staging
undsmartschool-jf
)-
Connection String
für die Verbindung zur Datenbank in beidenWeb App
Services konfigurieren:Bezeichnung Wert Name DefaultConnection
Value Server=tcp:htl-samples.database.windows.net,1433;Initial Catalog=SmartSchoolAzure;Persist Security Info=False;User ID=appuser;Password=htlleonding2020#;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;
Type SQLAzure
-
ASPNETCORE_ENVIRONMENT
Application Setting in der StagingWeb App
konfigurieren - somit werden detailierte Fehlermeldungen ausgegeben:Bezeichnung Wert Name ASPNETCORE_ENVIRONMENT
Value Development
-
-
Melden Sie sich bei Azure DevOps mit ihrem <IhrName>@htblaleonding.onmicrosoft.com Benutzer an.
-
Navigieren Sie im Projekt
SmartSchool-Azure
zum Abschnitt Pipelines: -
Erstellen Sie eine neue Pipeline:
-
Wählen Sie als Vorlage
Empty job
aus: -
Benennen Sie ihre
Release Pipeline
aufDeployment
um: -
Konfigurieren Sie das
Build Artefact
welches als Basis für ihr Deployment dienen soll: -
Trigger
für das Deployment konfigurieren:Mit diesem
Trigger
wird bei jedem erfolgreichem Build dieRelease Pipeline
für die Auslieferung angestoßen. -
Konfigurieren Sie die Auslieferung in die
Staging
Umgebung: -
Legen Sie fest in welche
Web App
die gebauten Artefakte ausgeliefert werden sollen: -
Dupliziern Sie die
Staging
Stage und nennen Sie sieProduction
:Mit dieser Stage wird nach dem Deployment in die
Staging
Umgebung auch ein Deployment in die Produktivumgebung durchgeführt. -
Festlegen eines
Pre deployment approvals
für dieProduction
Stage:Dies hat den Grund, dass eine Persion das Deployment auf die Produktivumgebung freigeben muss.
-
Manuelles Deployment durchführen:
Die
Release Pipeline
ist liefert standardmäßig nun jedes mal in dieStaging
- bzw.Production
-Umgebung aus, sobald ein neuer Build vorhanden ist. Zum Testen kann auch manuell einRelease
erstellt werden. Das Erstellen einesReleases
ist gleichbedeutend mit dem Anfordern einer Auslieferung. -
Staging
Umgebung auf korrekte Funktionalität prüfen: -
Nach dem
Staging
-Deployment wird nun in dieProduction
-Umgebung ausliefern: -
Staging
Umgebung auf korrekte Funktionalität prüfen: -
Ansicht des
Release
nach dem Deployment:Somit ist das
Release-1
in beiden Umgebungen (Staging
undProduction
) sauber ausgeliefert.
Nun ist es möglich eine neue Anforderung per Code-Ändeurng und anschließendem Commit/Push in die Staging-
bzw. im Anschluß in die Production
-Umgebung auszuliefern.
Dieses Diagram fasst die einzelnen Schritte zusammen: