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.
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 Ihremclient-id
entspricht. DiesobjectId
istAPPLICATION-OBJECT-ID
und wird zum Erstellen von Verbundanmeldeinformationen mit Graph-API-Anrufen verwendet. Speichern Sie den Wert, der später alsAZURE_CLIENT_ID
GitHub-Geheimnis verwendet werden soll.Erstellen eines Dienstprinzipals. Ersetzen Sie
$appID
durch die AppId aus Ihrer JSON-Ausgabe. Dieser Befehl generiert eine JSON-Ausgabe mit einem anderenobjectId
, was im nächsten Schritt verwendet wird. Der neueobjectId
ist derassignee-object-id
.Dieser Befehl generiert eine JSON-Ausgabe mit einem anderen
objectId
und wird im nächsten Schritt verwendet. Der neueobjectId
ist derassignee-object-id
.Kopieren Sie die
appOwnerTenantId
, um sie später als GitHub-Geheimnis fürAZURE_TENANT_ID
zu verwenden.az ad sp create --id $appId
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 generierteassignee-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
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
oderrepo: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
.
- Aufträge in Ihrer GitHub Actions-Umgebung:
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" ] }
- Ersetzen Sie
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.
Wechseln Sie in GitHub zu Ihrem Repository.
Gehen Sie im Navigationsmenü auf Einstellungen.
Wählen Sie Security > Secrets and variables > Actions (Sicherheit > Geheimnisse und Variablen > Aktionen) aus.
Wählen Sie New repository secret (Neues Repositorygeheimnis) aus.
Erstellen Sie Geheimnisse für
AZURE_CLIENT_ID
,AZURE_TENANT_ID
undAZURE_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 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:
- Checkt den Quellcode mithilfe der Check-Out-Aktion aus.
- Meldet sich mit der Azure-Anmeldeaktion bei Azure an und sammelt Umgebungs- und Azure-Ressourceninformationen.
- Stellt Ressourcen mit der Aktion „Bereitstellen“ aus Azure Resource Manager bereit.
So führen Sie den Workflow zum Erstellen von Azure-Ressourcen aus:
Öffnen Sie die Datei
azuredeploy.yaml
in.github/workflows
in Ihrem Repository.Aktualisieren Sie den Wert von
AZURE_RESOURCE_GROUP
auf den Namen Ihrer Ressourcengruppe.Aktualisieren Sie die Werte von
WEB_APP_NAME
undSQL_SERVER_NAME
auf den Namen Ihrer Web-App und den Namen des SQL Servers.Navigieren Sie zu Aktionen, und wählen Sie Workflow ausführen aus.
Vergewissern Sie sich, dass Ihrer Aktion erfolgreich ausgeführt wurde, indem Sie auf der Seite Aktionen nach einem grünen Häkchen suchen.
Hinzufügen von Geheimnissen für die Containerregistrierung und SQL
Öffnen Sie im Azure-Portal die neu erstellte Azure Container Registry in Ihrer Ressourcengruppe.
Wechseln Sie zu Zugriffsschlüssel, und kopieren Sie die Werte für Benutzername und Kennwort.
Erstellen Sie neue GitHub-Geheimnisse für die
ACR_USERNAME
- undACR_PASSWORD
-Kennwörter in Ihrem Repository.Öffnen Sie im Azure-Portal Ihre Azure SQL-Datenbank. Öffnen Sie Verbindungszeichenfolgen, und kopieren Sie den Wert.
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:
Öffnen Sie Ihre
build-deploy.yaml
-Datei in.github/workflows
in Ihrem Repository.Überprüfen Sie, ob die Umgebungsvariablen für
AZURE_RESOURCE_GROUP
undWEB_APP_NAME
mit denen inazuredeploy.yaml
übereinstimmen.Aktualisieren Sie den Wert
ACR_LOGIN_SERVER
für Ihren Azure Container Registry-Anmeldeserver.