Tutorial: Verwenden von GitHub Actions zum Bereitstellen in App Service für Container und Herstellen einer Datenbankverbindung

Dieses Tutorial führt Sie durch die Einrichtung eines GitHub Actions-Workflows zum Bereitstellen einer containerisierten ASP.NET Core-Anwendung mit einem Azure SQL-Datenbank-Back-End. Nach Abschluss verfügen Sie über eine ASP.NET-App, die in Azure ausgeführt wird und mit SQL-Datenbank verbunden ist. Zunächst erstellen Sie Azure-Ressourcen mit einem auf einer ARM-Vorlage beruhenden GitHub Actions-Workflow.

In diesem Tutorial lernen Sie Folgendes:

  • Verwenden eines GitHub Actions-Workflows zum Hinzufügen von Ressourcen zu Azure mit einer ARM-Vorlage (Azure Resource Manager-Vorlage)
  • Verwenden eines GitHub Actions-Workflows zum Erstellen eines Containers mit den neuesten Web-App-Änderungen

Wenn Sie kein Azure-Abonnement haben, erstellen Sie ein kostenloses Azure-Konto, bevor Sie beginnen.

Voraussetzungen

Um dieses Tutorial abzuschließen, benötigen Sie Folgendes:

  • Ein Azure-Konto mit einem aktiven Abonnement. Sie können kostenlos ein Konto erstellen.
  • Ein GitHub-Konto. Falls Sie noch nicht über ein Konto verfügen, können Sie sich kostenlos registrieren.
    • Ein GitHub-Repository, in dem Sie Ihre Resource Manager-Vorlagen und Ihre Workflowdateien speichern können. Informationen zum Erstellen eines neuen Repositorys finden Sie in diesem Hilfeartikel.

Herunterladen des Beispiels

Verzweigen Sie das Beispielprojekt im Repository mit den Azure-Beispielen.

https://github.com/Azure-Samples/dotnetcore-containerized-sqldb-ghactions/

Ressourcengruppe erstellen

Öffnen Sie Azure Cloud Shell unter https://shell.azure.com. Sie können alternativ die Azure-Befehlszeilenschnittstelle verwenden, wenn Sie sie lokal installiert haben. (Weitere Informationen zu Cloud Shell finden Sie in der Übersicht zu Cloud Shell.)

    az group create --name {resource-group-name} --location {resource-group-location}

Generieren von Anmeldeinformationen für die Bereitstellung

OpenID Connect ist eine Authentifizierungsmethode, die kurzlebige Token verwendet. Das Einrichten von OpenID Connect mit GitHub Actions ist komplexer und bietet mehr Sicherheit.

  1. Wenn Sie keine bestehende Anwendung besitzen, registrieren Sie eine neue Microsoft Entra-Anwendung und einen neuen Dienstprinzipal, die auf Ressourcen zugreifen können.

    az ad app create --display-name myApp
    

    Dieser Befehl gibt JSON mit einem appId aus, das Ihrem client-id entspricht. Dies objectId ist APPLICATION-OBJECT-ID und wird zum Erstellen von Verbundanmeldeinformationen mit Graph-API-Anrufen verwendet. Speichern Sie den Wert, der später als AZURE_CLIENT_IDGitHub-Geheimnis verwendet werden soll.

  2. Erstellen eines Dienstprinzipals. Ersetzen Sie $appID durch die AppId aus Ihrer JSON-Ausgabe. Dieser Befehl generiert eine JSON-Ausgabe mit einem anderen objectId, was im nächsten Schritt verwendet wird. Der neue objectId ist der assignee-object-id.

    Dieser Befehl generiert eine JSON-Ausgabe mit einem anderen objectId und wird im nächsten Schritt verwendet. Der neue objectId ist der assignee-object-id.

    Kopieren Sie die appOwnerTenantId, um sie später als GitHub-Geheimnis für AZURE_TENANT_ID zu verwenden.

     az ad sp create --id $appId
    
  3. Erstellen Sie eine neue Rollenzuweisung nach Abonnement und Objekt. Standardmäßig ist die Rollenzuweisung an Ihr Standardabonnement gebunden. Ersetzen Sie $subscriptionId durch Ihre Abonnement-ID, $resourceGroupName durch den Namen Ihrer Ressourcengruppe und $assigneeObjectId durch die generierte assignee-object-id (die neu erstellte Dienstprinzipalobjekt-ID).

    az role assignment create --role contributor --subscription $subscriptionId --assignee-object-id  $assigneeObjectId --assignee-principal-type ServicePrincipal --scope /subscriptions/$subscriptionId/resourceGroups/$resourceGroupName
    
  4. Führen Sie den folgenden Befehl aus, um neue Anmeldeinformationen für die Verbundidentität für Ihre Microsoft Entra-Anwendung zu erstellen.

    • Ersetzen Sie APPLICATION-OBJECT-ID durch die ObjectId (die beim Erstellen der Anwendung generiert wurde) für Ihre Microsoft Entra-Anwendung.
    • Legen Sie einen Wert für CREDENTIAL-NAME fest, um später auf ihn zu verweisen.
    • Legen Sie die subject fest. Dieser Wert wird von GitHub in Abhängigkeit von Ihrem Workflow festgelegt:
      • Aufträge in Ihrer GitHub Actions-Umgebung: repo:< Organization/Repository >:environment:< Name >
      • Bei Aufträgen, die nicht an eine Umgebung gebunden sind, fügen Sie den Referenzpfad für den Branch/Tag auf der Grundlage des für die Auslösung des Workflows verwendeten Referenzpfads ein: repo:< Organization/Repository >:ref:< ref path>. Zum Beispiel: repo:n-username/ node_express:ref:refs/heads/my-branch oder repo:n-username/ node_express:ref:refs/tags/my-tag.
      • Für Workflows, die durch ein Pull Request-Ereignis ausgelöst werden: repo:< Organization/Repository >:pull_request.
    az ad app federated-credential create --id <APPLICATION-OBJECT-ID> --parameters credential.json
    ("credential.json" contains the following content)
    {
        "name": "<CREDENTIAL-NAME>",
        "issuer": "https://token.actions.githubusercontent.com",
        "subject": "repo:octo-org/octo-repo:environment:Production",
        "description": "Testing",
        "audiences": [
            "api://AzureADTokenExchange"
        ]
    }
    

Informationen zum Erstellen einer Active Directory-Anwendung, eines Dienstprinzipals und von Verbundanmeldeinformationen über das Azure-Portal finden Sie unter Verbinden von GitHub und Azure.

Konfigurieren des GitHub-Geheimnisses für die Authentifizierung

Sie müssen die Client-ID Ihrer Anwendung, die Mandanten-ID und die Abonnement-ID für die Anmeldeaktion bereitstellen. Diese Werte können entweder direkt im Workflow bereitgestellt werden oder in GitHub-Geheimnissen gespeichert und darauf in Ihrem Workflow verwiesen werden. Das Speichern der Werte als GitHub-Geheimnisse ist die sicherere Option.

  1. Wechseln Sie in GitHub zu Ihrem Repository.

  2. Gehen Sie im Navigationsmenü auf Einstellungen.

  3. Wählen Sie Security > Secrets and variables > Actions (Sicherheit > Geheimnisse und Variablen > Aktionen) aus.

    Screenshot des Hinzufügens eines Geheimnisses

  4. Wählen Sie New repository secret (Neues Repositorygeheimnis) aus.

  5. Erstellen Sie Geheimnisse für AZURE_CLIENT_ID, AZURE_TENANT_ID und AZURE_SUBSCRIPTION_ID. Verwenden Sie diese Werte aus Ihrer Microsoft Entra-Anwendung für Ihre GitHub-Geheimnisse:

    GitHub-Geheimnis Microsoft Entra-Anwendung
    AZURE_CLIENT_ID Anwendungs-ID (Client)
    AZURE_TENANT_ID Verzeichnis-ID (Mandant)
    AZURE_SUBSCRIPTION_ID Abonnement-ID
  6. Speichern Sie jedes Geheimnis, indem Sie Geheimnis hinzufügen auswählen.

Hinzufügen eines SQL Server-Geheimnisses

Erstellen Sie in Ihrem Repository ein neues Geheimnis für SQL_SERVER_ADMIN_PASSWORD. Bei diesem Geheimnis kann es sich um ein beliebiges Kennwort handeln, das den Azure-Standards für Kennwortsicherheit entspricht. Sie können nicht noch einmal auf dieses Kennwort zugreifen. Speichern Sie es daher separat.

Erstellen von Azure-Ressourcen

Der Workflow zum Erstellen von Azure-Ressourcen führt eine ARM-Vorlage aus, um Ressourcen in Azure bereitzustellen. Der Workflow:

So führen Sie den Workflow zum Erstellen von Azure-Ressourcen aus:

  1. Öffnen Sie die Datei azuredeploy.yaml in .github/workflows in Ihrem Repository.

  2. Aktualisieren Sie den Wert von AZURE_RESOURCE_GROUP auf den Namen Ihrer Ressourcengruppe.

  3. Aktualisieren Sie die Werte von WEB_APP_NAME und SQL_SERVER_NAME auf den Namen Ihrer Web-App und den Namen des SQL Servers.

  4. Navigieren Sie zu Aktionen, und wählen Sie Workflow ausführen aus.

    Führen Sie den GitHub Actions-Workflow aus, um Ressourcen hinzuzufügen.

  5. Vergewissern Sie sich, dass Ihrer Aktion erfolgreich ausgeführt wurde, indem Sie auf der Seite Aktionen nach einem grünen Häkchen suchen.

    Erfolgreiche Ausführung von „Ressourcen erstellen“.

Hinzufügen von Geheimnissen für die Containerregistrierung und SQL

  1. Öffnen Sie im Azure-Portal die neu erstellte Azure Container Registry in Ihrer Ressourcengruppe.

  2. Wechseln Sie zu Zugriffsschlüssel, und kopieren Sie die Werte für Benutzername und Kennwort.

  3. Erstellen Sie neue GitHub-Geheimnisse für die ACR_USERNAME- und ACR_PASSWORD-Kennwörter in Ihrem Repository.

  4. Öffnen Sie im Azure-Portal Ihre Azure SQL-Datenbank. Öffnen Sie Verbindungszeichenfolgen, und kopieren Sie den Wert.

  5. Erstellen Sie ein neues Geheimnis für SQL_CONNECTION_STRING. Ersetzen Sie {your_password} durch Ihre Dataset-ID (SQL_SERVER_ADMIN_PASSWORD).

Erstellen, Pushen und Bereitstellen Ihres Images

Der Erstellungs-, Push- und Bereitstellungsworkflow erstellt einen Container mit den neuesten App-Änderungen, pusht den Container in die Azure Container Registry und aktualisiert den Stagingslot der Webanwendung, sodass er auf den aktuellsten per Push bereitgestellten Container verweist. Der Workflow containerisiert einen Erstellungs- und Bereitstellungsauftrag:

  • Der Erstellungsauftrag checkt den Quellcode mit der Check-Out-Aktion aus. Anschließend verwendet der Auftrag die Docker-Anmeldeaktion und ein benutzerdefiniertes Skript, um sich bei der Azure Container Registry zu authentifizieren, ein Containerimage zu erstellen und es in der Azure Container Registry bereitzustellen.
  • Der Bereitstellungsauftrag meldet sich bei Azure mithilfe der Azure-Anmeldeaktion an und sammelt Umgebungs- und Azure-Ressourceninformationen. Anschließend aktualisiert der Auftrag die Web App-Einstellungen mithilfe der Aktion „Azure App Service-Einstellungen“ und führt die Bereitstellung in einem App Service-Stagingslot mithilfe der Aktion „Azure Web Deploy“ aus. Schließlich führt der Auftrag ein benutzerdefiniertes Skript aus, um die SQL-Datenbank zu aktualisieren, und vertauscht den Stagingslot mit dem Produktionsslot.

So führen Sie den Erstellungs-, Push- und Bereitstellungsworkflow aus:

  1. Öffnen Sie Ihre build-deploy.yaml-Datei in .github/workflows in Ihrem Repository.

  2. Überprüfen Sie, ob die Umgebungsvariablen für AZURE_RESOURCE_GROUP und WEB_APP_NAME mit denen in azuredeploy.yaml übereinstimmen.

  3. Aktualisieren Sie den Wert ACR_LOGIN_SERVER für Ihren Azure Container Registry-Anmeldeserver.

Nächste Schritte