Tutorial: Bereitstellen einer ASP.NET Core-App und einer Datenbank in Azure Container Apps mithilfe von GitHub Actions

In diesem Tutorial erfahren Sie, wie Sie mithilfe von Visual Studio und GitHub Actions eine ASP.NET Core-App und SQL-Datenbank in Azure Container Apps bereitstellen. Außerdem erfahren Sie, wie Sie Entity Framework-Migrationen und Datenbankupdates in GitHub Actions verwalten. Diese Konzepte können auch auf andere CI/CD-Tools und -Umgebungen angewendet werden.

Voraussetzungen

Sie benötigen Visual Studio 2022 mit den installierten Workloads ASP.NET und Webentwicklung und Azure-Entwicklung.

Wenn Sie Visual Studio bereits installiert haben:

  • Installieren Sie in Visual Studio die neuesten Updates, indem Sie Hilfe>Nach Updates suchen auswählen.
  • Überprüfen Sie, ob die ASP.NET- und Webentwicklungs- und Azure-Entwicklungsworkloads installiert sind, indem Sie Tools>Tools und Features abrufen auswählen.

Lokales Einrichten der Beispiel-App

Verwenden Sie die ToDo-Beispiel-App, um dieses Tutorial nachzuvollziehen. Führen Sie den folgenden Befehl aus, um die App aus GitHub zu klonen:

git clone https://github.com/Azure-Samples/msdocs-app-service-sqldb-dotnetcore.git
cd msdocs-app-service-sqldb-dotnetcore

Navigieren Sie zum Projektordner, und öffnen Sie die Projektmappe DotNetCoreSqlDb.sln in Visual Studio.

Die ToDo-Anwendung ist einsatzbereit, aber Sie müssen eine Verbindung mit der SQL Server-localdb-Instanz herstellen, die in Visual Studio verfügbar ist. Wenn Sie eine Verbindung mit localdb herstellen, können Sie die App ausführen und Aufgaben persistent speichern, während Sie lokal arbeiten.

  1. Klicken Sie im Projektmappen-Explorer von Visual Studio mit der rechten Maustaste auf den Knoten Verbundene Dienste, und wählen Sie Hinzufügen > SQL Server-Datenbank aus.
  2. Wählen Sie im Dialogfeld Mit Abhängigkeit verbinden die Option SQL Server Express LocalDB (lokal) und dann Weiter aus.
  3. Legen Sie im Dialogfeld Mit SQL Server Express LocalDB verbinden (lokal) die folgenden Werte fest:
    • Name der Verbindungszeichenfolge: Übernehmen Sie die Standardeinstellung.
    • Wert der Verbindungszeichenfolge: Übernehmen Sie die Standardeinstellung.
    • Wert der Verbindungszeichenfolge speichern unter: Wählen Sie Kein aus.
    • Wählen Sie Weiter aus.
  4. Übernehmen Sie auf dem Bildschirm Zusammenfassung der Änderungen die Standardwerte für die Einstellungen, und wählen Sie Fertig stellen aus, um den Workflow abzuschließen.

Visual Studio zeigt eine Zusammenfassung der Dienstabhängigkeiten an, einschließlich der Verbindung mit LocalDB.

A screenshot showing how to add a migration using Visual Studio.

Nun müssen Sie eine erste Migration erstellen und diese verwenden, um die lokale Datenbank mit dem richtigen Schema für die Todo-App zu aktualisieren.

  1. Wählen Sie das Symbol ... rechts neben der Dienstabhängigkeitenliste neben der LocalDB-Verbindung aus, und wählen Sie Migration hinzufügen aus.
  2. Warten Sie im Dialogfeld Entity Framework-Migrationen einen Moment, bis Visual Studio die DbContext-Klasse gefunden hat, die im Projekt enthalten ist. Nachdem die Werte geladen wurden, wählen Sie Fertig stellen aus.
  3. Visual Studio generiert einen Ordner Migrations im Projekt und erstellt eine erste Migrationsklasse. Diese Klasse kann verwendet werden, um die Datenbank mit dem richtigen Schema zu aktualisieren.
  4. Wählen Sie erneut das Symbol ... neben dem LocalDB-Dienst aus, und wählen Sie dann Datenbank aktualisieren aus.
  5. Warten Sie im Dialogfeld Entity Framework-Migrationen einen Moment, bis Visual Studio die DbContext-Klasse erneut gefunden hat, und wählen Sie dann Fertig stellen aus. Visual Studio führt die Migration aus und erstellt das Schema für die Datenbank auf dem LocalDB-Server.

Starten Sie das Projekt, indem Sie oben in Visual Studio die Schaltfläche „Ausführen“ für DotNetCoreSqlDb auswählen.

Wenn die App geladen wird, überprüfen Sie, ob die Datenbank ordnungsgemäß funktioniert, indem Sie eine neue Aufgabe eingeben. Die Aufgabe wird in der Hauptlistenansicht auf der Startseite der App angezeigt.

Erkunden der App-Startkonfiguration

Die Beispiel-App enthält den folgenden Code in der Datei Program.cs:

if(builder.Environment.IsDevelopment())
{
    builder.Services.AddDbContext<MyDatabaseContext>(options =>
        options.UseSqlServer(builder.Configuration.GetConnectionString("Default")));
}
else
{
    builder.Services.AddDbContext<MyDatabaseContext>(options =>
        options.UseSqlServer(Environment.GetEnvironmentVariable("AZURE_SQL_CONNECTIONSTRING")));
}

Dieser Code wendet die folgenden Konfigurationen an:

  • Wenn die App lokal ausgeführt wird, wird die localdb-Verbindungszeichenfolge aus der Datei appsettings.json abgerufen und für Entity Framework bereitgestellt. Mit dieser Konfiguration kann die localdb-Verbindungszeichenfolge in die Quellcodeverwaltung eingecheckt werden, damit andere Entwickler während der Entwicklung problemlos eine Verbindung mit einer lokalen Datenbank herstellen können. Außerdem können Entity Framework-Migrationen lokal ausgeführt werden. Standardmäßig ermittelt Entity Framework beim Ausführen von Migrationen keine Verbindungszeichenfolgen, die in der Umgebungsvariablen gespeichert sind.
  • Wenn die App in GitHub Actions-Workflows oder in der Produktion ausgeführt wird, wird die Verbindungszeichenfolge aus Umgebungsvariablen gepullt. Umgebungsvariablen können verhindern, dass sichere Verbindungszeichenfolgen für die Produktion in die Quellcodeverwaltung eingecheckt oder in Konfigurationsdateien eingebunden werden.

Erstellen der Azure-Dienste

Für die App müssen die folgenden Azure-Dienste erstellt werden, damit die Bereitstellung erfolgreich ist:

  • Container-App: Erforderlich zum Hosten und Ausführen der bereitgestellten Anwendung.
  • Containerregistrierung: Speichert das erstellte Imageartefakt der containerisierten App.
  • SQL-Datenbank-Instanz: Eine Azure SQL-Datenbank-Instanz zum Speichern der Daten der App.

Die Veröffentlichungsfeatures von Visual Studio können das Erstellen dieser Ressourcen für Sie übernehmen.

Erstellen der Azure-Container-App und Azure Container Registry-Instanz

  1. Klicken Sie im Projektmappen-Explorer von Visual Studio mit der rechten Maustaste auf den obersten Projektknoten, und wählen Sie Veröffentlichen aus.

  2. Wählen Sie im Veröffentlichungsdialogfeld Azure als Bereitstellungsziel und dann Weiter aus.

  3. Wählen Sie als bestimmtes Ziel Azure Container Apps (Linux) und dann Weiter aus.

  4. Erstellen Sie eine neue Container-App für die Bereitstellung. Wählen Sie die Schaltfläche + Neu erstellen aus, um ein neues Dialogfeld zu öffnen, und geben Sie die folgenden Werte ein:

    A screenshot showing how to create a container app.

    • Name der Container-App: Behalten Sie den Standardwert bei, oder geben Sie einen Namen ein.
    • Abonnementname: Wählen Sie das Abonnement aus, in das die Bereitstellung erfolgen soll.
    • Ressourcengruppe: Wählen Sie Neu aus, und erstellen Sie eine neue Ressourcengruppe mit dem Namen msdocs-app-db-ef.
    • Container-Apps-Umgebung: Wählen Sie Neu aus, um das Dialogfeld „Container apps environment“ (Container Apps-Umgebung) zu öffnen, und geben Sie die folgenden Werte ein:
      • Umgebungsname: Behalten Sie den Standardwert bei.
      • Standort: Wählen Sie einen Standort in Ihrer Nähe aus.
      • Azure Log Analytics-Arbeitsbereich: Wählen Sie Neu aus, um das Dialogfeld „Log Analytics-Arbeitsbereich“ zu öffnen.
        • Name: Behalten Sie den Standardwert bei.
        • Standort: Wählen Sie einen Standort in Ihrer Nähe aus, und wählen Sie dann OK aus, um das Dialogfeld zu schließen.
      • Wählen Sie OK aus, um das Dialogfeld „Container apps environment“ (Container-Apps-Umgebung) zu schließen.
    • Wählen Sie Erstellen aus, um das ursprüngliche Container-Apps-Dialogfeld zu schließen. Visual Studio erstellt die Container-App-Ressource in Azure.
  5. Sobald die Ressource erstellt wurde, stellen Sie sicher, dass sie in der Liste der Container-Apps ausgewählt ist, und wählen Sie dann Weiter aus.

  6. Sie müssen eine Azure Container Registry-Instanz erstellen, um das veröffentlichte Imageartefakt für Ihre App zu speichern. Wählen Sie das grüne +-Symbol auf dem Containerregistrierungsbildschirm aus.

    A screenshot showing how to create a new container registry.

  7. Ändern Sie die Standardwerte nicht, und wählen Sie dann Erstellen aus.

  8. Nachdem die Containerregistrierung erstellt wurde, stellen Sie sicher, dass sie ausgewählt ist, und wählen Sie dann „Weiter“ aus.

  9. Wählen Sie auf dem Bildschirm Bereitstellungstyp die Option CI/CD mit GitHub Actions-Workflows ( generiert YML-Datei), und wählen Sie dann Fertig stellen aus. Wenn Sie von Visual Studio aufgefordert werden, den Administratorbenutzer zu aktivieren, um auf den veröffentlichten Docker-Container zuzugreifen, wählen Sie Ja aus.

Visual Studio erstellt das Veröffentlichungsprofil und zeigt es an. Die meisten Veröffentlichungsschritte und Details werden in der GitHub Actions-Datei .yml beschrieben, die durch Klicken auf die Schaltfläche Workflow bearbeiten in der Zusammenfassungsansicht des Veröffentlichungsprofils angezeigt werden kann. Diese Datei wird später in diesem Artikel ausführlicher behandelt.

Erstellen der Azure SQL-Datenbank

  1. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf den Knoten Verbundene Dienste, und wählen Sie Hinzufügen > SQL Server-Datenbank aus.
  2. Wählen Sie im Dialogfeld Mit Abhängigkeit verbinden die Option Azure SQL-Datenbank und dann Weiter aus.
  3. Wählen Sie + Neu erstellen aus, um eine neue Datenbank hinzuzufügen.
  4. Geben Sie im Dialogfeld Azure SQL-Datenbank die folgenden Werte ein:
    • Datenbankname: Behalten Sie den Standardwert bei.
    • Abonnementname: Wählen Sie dasselbe Abonnement wie zuvor aus.
    • Ressourcengruppe: Wählen Sie die zuvor erstellte msdocs-app-db-ef-Gruppe aus.
    • Datenbankserver: Wählen Sie Neu... aus, und geben Sie dann die folgenden Werte in das neue Popupfenster ein:
      • Name des Datenbankservers: Geben Sie einen eindeutigen Servernamen ein, oder fügen Sie Zufallszahlen an das Ende des automatisch generierten Namens an.
      • Standort: Wählen Sie einen Standort in Ihrer Nähe aus.
      • Administratorbenutzername: Geben Sie einen Wert Ihrer Wahl ein.
      • Administratorkennwort: Geben Sie einen Wert Ihrer Wahl ein.
      • Administratorkennwort (bestätigen): Geben Sie zur Bestätigung dasselbe Kennwort ein. Wählen Sie OK aus, um das Dialogfeld SQL Server zu schließen.
    • Wählen Sie Erstellen aus, um die SQL Server-Instanz und die Datenbank zu erstellen.
    • Wenn der Vorgang abgeschlossen ist, wählen Sie den Server aus der Liste aus, und wählen Sie dann Weiter aus.
  5. Behalten Sie im Dialogfeld Verbindung mit Azure SQL-Datenbank herstellen die Standardwerte bei, stellen Sie jedoch sicher, dass unten für die Option Wert der Verbindungszeichenfolge speichern unter die Option Kein ausgewählt ist.
  6. Wählen Sie Fertig stellen aus. Visual Studio erstellt dann die SQL-Ressourcen.

Verbinden der Container-App mit Azure SQL

  1. Wählen Sie auf der Übersichtsseite der Container-App, die Sie erstellt haben, im linken Navigationsbereich Dienstconnector (Vorschau) aus.

  2. Wählen Sie + Erstellen aus, um eine neue Verbindung zu erstellen.

  3. Geben Sie im Flyout Verbindung erstellen die folgenden Werte ein:

    • Container: Wählen Sie den Container dotnetcoresqldb aus, den Sie erstellt haben.

    • Diensttyp: Wählen Sie SQL-Datenbank aus.

    • Abonnement: Wählen Sie dasselbe Abonnement aus, das Sie für die Container-App ausgewählt haben.

    • Verbindungsname: Übernehmen Sie die Standardeinstellung.

    • SQL Server-Instanz: Wählen Sie den Datenbankserver aus, den Sie zuvor erstellt haben.

    • SQL-Datenbank: Wählen Sie die Datenbank aus, die Sie zuvor erstellt haben.

    • Clienttyp: Wählen Sie .NET aus.

      A screenshot showing how to use service connector.

  4. Wählen Sie Weiter: Authentifizierung aus, und geben Sie die folgenden Werte ein:

    • Wählen Sie Verbindungszeichenfolge als Authentifizierungstyp aus.
    • Benutzername: Geben Sie den Benutzernamen ein, den Sie beim Erstellen des Datenbankservers verwendet haben.
    • Kennwort: Geben Sie das Kennwort ein, das Sie beim Erstellen des Datenbankservers verwendet haben.
  5. Übernehmen Sie für die restlichen Einstellungen die Standardwerte, und wählen Sie dann Weiter: Netzwerk aus.

  6. Lassen Sie den Standardwert ausgewählt, und wählen Sie dann Weiter: Überprüfen und erstellen aus.

  7. Wählen Sie Erstellen aus, nachdem Azure die Einstellungen überprüft hat.

Nach einem Moment sollte die Verbindung mit der SQL-Datenbank angezeigt werden. Wählen Sie den Pfeil aus, um die Verbindung zu erweitern und den Wert AZURE_SQL_CONNECTIONSTRING anzuzeigen. Dieser Verbindungsname entspricht dem Namen der in der Beispiel-App definierten Verbindungszeichenfolge der Umgebungsvariablen.

Konfigurieren des GitHub Actions-Workflows

Die von Visual Studio generierte GitHub Actions-Workflowdatei kann von GitHub verwendet werden, um die App zu erstellen und in Azure bereitzustellen, wenn Änderungen gepusht werden. Derzeit würde dieser Prozess funktionieren, aber die bereitgestellte App würde eine Ausnahme auslösen. Obwohl die Azure SQL-Datenbank erstellt wurde, muss ein Schritt zum GitHub Actions-Workflow hinzugefügt werden, um das Schema zu generieren. Die Verbindungszeichenfolge für die Azure SQL-Datenbank kann sicher als Geheimnis in GitHub gespeichert und bei seiner Ausführung vom Workflow abgerufen werden.

Abrufen der Verbindungszeichenfolge und Hinzufügen zu GitHub-Geheimnissen

  1. Suchen Sie im Azure-Portal in der Hauptsuchleiste nach der Datenbank, die Sie erstellt haben, und wählen Sie sie aus den Ergebnissen aus.

  2. Wählen Sie auf der Übersichtsseite der Datenbank im linken Navigationsbereich Verbindungszeichenfolgen aus.

  3. Kopieren Sie auf der Registerkarte ADO.NET die Verbindungszeichenfolge aus dem Formularfeld.

    A screenshot showing how to retrieve the connection string.

  4. Navigieren Sie zum geforkten GitHub-Repository der App.

  5. Wählen Sie auf der Registerkarte Einstellungen im linken Navigationsbereich Geheimnisse > Aktionen und dann Neues Repositorygeheimnis aus.

  6. Geben Sie auf der Seite Neues Geheimnis die folgenden Werte ein:

    • Name: Geben Sie den Namen DbConnection ein.

    • Geheimnis: Fügen Sie die aus Azure kopierte Verbindungszeichenfolge ein. Stellen Sie sicher, dass Sie den Kennwortplatzhalter in der Verbindungszeichenfolge durch das Kennwort ersetzen, das Sie beim Erstellen der Datenbank ausgewählt haben.

    • Klicken Sie auf Add secret (Geheimnis hinzufügen).

      A screenshot showing how to create a GitHub secret.

Die Verbindungszeichenfolge wird jetzt sicher in den GitHub-Repositorygeheimnissen gespeichert und kann mithilfe eines GitHub-Workflows abgerufen werden.

Ändern des GitHub Actions-Workflows zum Aktivieren von Migrationen

  1. Öffnen Sie die von Visual Studio generierte GitHub Actions-.yml-Workflowdatei, indem Sie die Schaltfläche Workflow bearbeiten auf der Seite mit der Veröffentlichungsübersicht auswählen.

    A screenshot showing how to edit the workflow.

  2. Fügen Sie das folgende Yaml an das Ende der Workflowdatei an:

    - name: Run EF 
      run: | 
        dotnet tool install --global dotnet-ef
        dotnet tool restore
        dotnet ef database update -p DotNetCoreSqlDb --connection '${{ secrets.DBConnection }}'
    

    Mit diesem Code werden die Befehlszeilentools von Entity Framework installiert und die App-Migrationen ausgeführt. Wenn der Workflow ausgeführt wird, verwendet der Code auch den connection-Parameter des Befehls database update, um die in der Datei appsettings.json gespeicherte localdb-Verbindungszeichenfolge mit dem Wert zu überschreiben, der den GitHub-Geheimnissen hinzugefügt wurde.

Ausführen des GitHub Actions-Workflows und Testen der Bereitstellung

  1. Committen Sie die Änderungen an die Anwendung, und pushen Sie sie mit dem folgenden Befehl in das geforkte Repository:

    git add --all
    git commit -m "Added GitHub Actions workflow"
    git push
    
  2. Navigieren Sie zum GitHub-Repository, und wählen Sie die Registerkarte Aktionen aus. Eine Workflowausführung sollte automatisch ausgelöst werden, wenn der Pushvorgang erfolgreich war.

  3. Wählen Sie den aktiven Workflow aus, um die Protokolldetails für jeden Schritt nach seinem Abschluss anzuzeigen. Die Migration wird zuletzt ausgeführt, um die Datenbank in Azure zu aktualisieren.

    A screenshot showing the GitHub action workflow.

Nach Abschluss des Workflows wird die Anwendung in Azure Container Apps bereitgestellt und mit einem aktualisierten Schema mit der Datenbank verbunden.

Sie können die Bereitstellung testen, indem Sie zur Startseite der Container-App navigieren und eine Aufgabe erstellen, genau wie Sie dies lokal ausgeführt haben. Die URL für Ihre Container-App finden Sie immer auf der Übersichtsseite für die App im Azure-Portal.