Continuous Deployment mit benutzerdefinierten Containern in Azure App Service

In diesem Tutorial konfigurieren Sie Continuous Deployment für ein benutzerdefiniertes Containerimage aus verwalteten Azure Container Registry-Repositorys oder aus Docker Hub.

1. Wechseln zum Bereitstellungscenter

Navigieren Sie im Azure-Portal zur Verwaltungsseite Ihrer App Service-App.

Klicken Sie im Menü auf der linken Seite auf Deployment Center>Einstellungen.

2. Bereitstellungsquelle auswählen

Die Auswahl der Bereitstellungsquelle hängt von Ihrem Szenario ab:

  • Die Containerregistrierung richtet CI/CD zwischen Ihrer Containerregistrierung und App Service ein.
  • GitHub Actions ist die richtige Wahl für Sie, wenn Sie den Quellcode für das Containerimage in GitHub hosten. Die neue Bereitstellungsaktion wird durch neue Commits in Ihrem GitHub-Repository ausgelöst und kann docker build sowie docker push direkt in Ihrer Containerregistrierung ausführen. Anschließend aktualisiert sie die App Service-App, um das neue Image auszuführen. Weitere Informationen finden Sie unter Funktionsweise von CI/CD mit GitHub Actions.
  • Informationen zum Einrichten von CI/CD mit Azure Pipelines finden Sie unter Bereitstellen eines Azure-Web-App-Containers aus Azure Pipelines.

Hinweis

Wählen Sie für eine Docker Compose-App die Containerregistrierung aus.

Wenn Sie sich für GitHub Actions entscheiden, klicken Sie auf Autorisieren, und befolgen Sie die Eingabeaufforderungen zur Autorisierung. Wenn Sie die Autorisierung schon einmal mit GitHub durchgeführt haben, können Sie die Bereitstellung über das Repository eines anderen Benutzers ausführen, indem Sie auf Konto ändern klicken.

Nachdem Sie Ihr Azure-Konto bei GitHub autorisiert haben, wählen Sie das Unternehmen, das Repository und den Branch aus, über die Sie die Bereitstellung vornehmen möchten.

2. Konfigurieren der Registrierungseinstellungen

3. Konfigurieren der Registrierungseinstellungen

Hinweis

Sidecar-Container (Preview) sind mit Mehrcontainer-Apps (Docker Compose) in App Service erfolgreich. Informationen zu den ersten Schritten finden Sie unter Tutorial: Konfigurieren eines Sidecar-Containers für benutzerdefinierte Container in Azure App Service (Preview).

Wählen Sie zum Bereitstellen einer App mit mehreren Containern (Docker Compose) unter Containertyp die Option Docker Compose aus.

Wird das Dropdownmenü Containertyp nicht angezeigt, müssen Sie zurück zu Quelltext scrollen und Container Registryauswählen.

Wählen Sie unter Registrierungsquelle aus, wo Ihre Containerregistrierung eingerichtet werden soll. Wenn Sie sich weder für Azure Container Registry noch für Docker Hub entscheiden, wählen Sie Private Registrierung aus.

Hinweis

Wenn Ihre App mit mehreren Containern (Docker Compose) mehr als ein privates Image verwendet, müssen Sie sicherstellen, dass sich die privaten Images in derselben privaten Registrierung befinden und mit denselben Benutzeranmeldeinformationen zugänglich sind. Wenn Ihre App mit mehreren Containern nur öffentliche Images verwendet, wählen Sie Docker Hub aus, selbst wenn einige Images nicht in Docker Hub gehostet werden.

Klicken Sie auf die Registerkarte Ihrer Lösung, und führen Sie die beschriebenen Schritte aus.

Im Dropdownmenü Registrierung werden die Registrierungen angezeigt, die sich im gleichen Abonnement wie Ihre App befinden. Wählen Sie die gewünschte Registrierung aus.

Hinweis

Wählen Sie das bereitzustellende Image und Tag aus. Wenn Sie möchten, können Sie unter Startdatei den Startbefehl eingeben.

Führen Sie als Nächstes den Schritt für Ihren Containertyp aus:

  • Wählen Sie für Docker Compose die Registrierung für Ihre privaten Images aus. Klicken Sie auf Datei auswählen, um Ihre Docker Compose-Datei hochzuladen, oder fügen Sie den Inhalt Ihrer Docker Compose-Datei in die Konfiguration ein.
  • Wählen Sie für einzelne Container das bereitzustellende Image und Tag aus. Wenn Sie möchten, können Sie unter Startdatei den Startbefehl eingeben.

App Service fügt die Zeichenfolge unter Startdatei an das Ende des Befehls „docker run“ (als [COMMAND] [ARG...]-Segment) an, wenn Ihr Container gestartet wird.

3. Aktivieren von CI/CD

4. Aktivieren von CI/CD

App Service unterstützt die CI/CD-Integration mit Azure Container Registry und Docker Hub. Klicken Sie unter Continuous Deployment auf Ein, um die Integration zu aktivieren.

Hinweis

Wenn Sie unter Quelle die Option GitHub Actions auswählen, gibt es keine Integration, weil CI/CD direkt von GitHub Actions verwaltet wird. Stattdessen wird der Bereich Workflowkonfiguration angezeigt, in dem Sie auf Dateivorschau anzeigenklicken können, um sich die Workflowdatei anzusehen. Azure committet diese Datei auf Ihr ausgewähltes GitHub-Repository, damit Build- und Bereitstellungstasks dort verwaltet werden. Weitere Informationen finden Sie unter Funktionsweise von CI/CD mit GitHub Actions.

Wenn Sie diese Option aktivieren, fügt App Service Ihrem Repository in Azure Container Registry oder Docker Hub einen Webhook hinzu. Ihr Repository veröffentlicht immer an diesen Webhook, wenn Ihr ausgewähltes Image mit docker push aktualisiert wird. Der Webhook bewirkt, dass Ihre App Service-App neu gestartet wird und docker pull ausführt, um das aktualisierte Image abzurufen.

Hinweis

Um eine ordnungsgemäße Funktion des Webhooks sicherzustellen, ist es wichtig, die Option für die Basic Auth Publishing Credentials (Standardauthentifizierung von Anmeldeinformationen für die Veröffentlichung) in Ihrer Web App zu aktivieren. Andernfalls kann der Fehler „401 – nicht autorisiert“ für den Webhook auftreten. Führen Sie die folgenden Schritte aus, um zu überprüfen, ob die Option Basic Auth Publishing Credentials (Standardauthentifizierung von Anmeldeinformationen für die Veröffentlichung) aktiviert ist:

  • Navigieren Sie zu Konfiguration > Allgemeine Einstellungen Ihrer Web-App.
  • Suchen Sie nach dem Abschnitt Plattformeinstellung, in dem Sie die Option Basic Auth Publishing Credentials (Standardauthentifizierung von Anmeldeinformationen für die Veröffentlichung) finden.

Bei anderen privaten Registrierungen können Sie den Webhook manuell oder als Schritt einer CI/CD-Pipeline veröffentlichen. Klicken Sie unter Webhook-URL auf Kopieren, um die Webhook-URL zu kopieren.

Hinweis

Die Unterstützung für Apps mit mehreren Containern (Docker Compose) ist eingeschränkt:

  • Für Azure Container Registry erstellt App Service einen Webhook in der ausgewählten Registrierung, der nur für diese Registrierung gilt. Ein docker push-Befehl für eines der Repositorys in der Registrierung (einschließlich derjenigen, auf die nicht in Ihrer Docker Compose-Datei verwiesen wird) löst einen Neustart der App aus. Daher sollten Sie den Geltungsbereich des Webhooks eingrenzen.
  • Docker Hub unterstützt keine Webhooks auf Registrierungsebene. Sie müssen Webhooks manuell zu den in der Docker Compose-Datei angegebenen Images hinzufügen.

4. Speichern der Einstellungen

5. Speichern der Einstellungen

Klicken Sie auf Speichern.

Funktionsweise von CI/CD mit GitHub Actions

Wenn Sie unter Quelltext die Option GitHub Actions auswählen (siehe Auswählen der Bereitstellungsquelle), richtet App Service CI/CD auf folgende Weise ein:

  • Legt eine GitHub Actions-Workflowdatei in Ihrem GitHub-Repository ab, um Build- und Bereitstellungsaufgaben für App Service zu verarbeiten.
  • Fügt die Anmeldeinformationen für Ihre private Registrierung als GitHub-Geheimnisse hinzu. Die generierte Workflowdatei führt die Aktion Azure/docker-login aus, um sich bei Ihrer privaten Registrierung anzumelden, und führt dann docker push für die Bereitstellung aus.
  • Fügt das Veröffentlichungsprofil für Ihre App als GitHub-Geheimnis hinzu. Die generierte Workflowdatei verwendet dieses Geheimnis für die Authentifizierung bei App Service und führt dann die Aktion Azure/webapps-deploy aus, um das aktualisierte Image zu konfigurieren. Dadurch wird ein App-Neustart ausgelöst, um das aktualisierte Image abzurufen.
  • Erfasst Informationen aus den Workflowausführungsprotokollen und zeigt sie auf der Registerkarte Protokolle im Deployment Center Ihrer App an.

Sie können den GitHub Actions-Buildanbieter auf folgende Weise anpassen:

  • Anpassen der Workflowdatei, nachdem Sie in Ihrem GitHub-Repository generiert wurde. Weitere Informationen finden Sie unter Workflowsyntax für GitHub Actions. Stellen Sie unbedingt sicher, dass der Workflow mit der Aktion Azure/webapps-deploy endet, um einen App-Neustart auszulösen.
  • Wenn der ausgewählte Branch geschützt ist, können Sie trotzdem eine Vorschau der Workflowdatei anzeigen, ohne die Konfiguration zu speichern, und sie dann zusammen mit den erforderlichen GitHub-Geheimnissen manuell zu Ihrem Repository hinzufügen. Diese Methode verschafft Ihnen nicht die Protokollintegration in das Azure-Portal.
  • Anstatt ein Veröffentlichungsprofil zu verwenden, führen Sie die Bereitstellung mithilfe eines Dienstprinzipals in Microsoft Entra ID durch.

Authentifizieren mit einem Dienstprinzipal

Diese optionale Konfiguration ersetzt die Standardauthentifizierung mit Veröffentlichungsprofilen in der generierten Workflowdatei.

Generieren Sie in der Azure CLI mit dem Befehl az ad sp create-for-rbac einen Dienstprinzipal. Ersetzen Sie im folgenden Beispiel <subscription-id>, <group-name> und <app-name> durch Ihre eigenen Werte. Speichern Sie die gesamte JSON-Ausgabe für den nächsten Schritt, einschließlich der {}-Objekte der obersten Ebene.

az ad sp create-for-rbac --name "myAppDeployAuth" --role contributor \
                            --scopes /subscriptions/<subscription-id>/resourceGroups/<group-name>/providers/Microsoft.Web/sites/<app-name> \
                            --json-auth

Wichtig

Erteilen Sie aus Sicherheitsgründen dem Dienstprinzipal den minimal erforderlichen Zugriff. Der Bereich im vorherigen Beispiel ist auf die spezifische App Service-App und nicht auf die gesamte Ressourcengruppe beschränkt.

Navigieren Sie in GitHub zu Ihrem Repository, und klicken Sie auf Einstellungen > Geheimnisse > Neues Geheimnis hinzufügen. Fügen Sie die gesamte JSON-Ausgabe aus dem Azure CLI-Befehl in das Wertfeld des Geheimnisses ein. Geben Sie dem Geheimnis einen Namen wie AZURE_CREDENTIALS.

Ändern Sie in der Workflowdatei, die vom Bereitstellungscenter generiert wurde, den Schritt azure/webapps-deploy mit Code wie im folgenden Beispiel:

- name: Sign in to Azure 
# Use the GitHub secret you added
- uses: azure/login@v1
    with:
    creds: ${{ secrets.AZURE_CREDENTIALS }}
- name: Deploy to Azure Web App
# Remove publish-profile
- uses: azure/webapps-deploy@v2
    with:
    app-name: '<app-name>'
    slot-name: 'production'
    images: '<registry-server>/${{ secrets.AzureAppService_ContainerUsername_... }}/<image>:${{ github.sha }}'
    - name: Sign out of Azure
    run: |
    az logout

Automatisieren mithilfe der Befehlszeilenschnittstelle

Führen Sie az webapp config container set aus, um die Containerregistrierung und das Docker-Image zu konfigurieren.

az webapp config container set --name <app-name> --resource-group <group-name> --docker-custom-image-name '<image>:<tag>' --docker-registry-server-url 'https://<registry-name>.azurecr.io' --docker-registry-server-user '<username>' --docker-registry-server-password '<password>'

Bereiten Sie zum Konfigurieren einer App mit mehreren Containern eine Docker Compose-Datei vor, und führen Sie az webapp config container set mit dem --multicontainer-config-file-Parameter aus. Wenn Ihre Docker Compose-Datei private Images enthält, fügen Sie, wie im vorherigen Beispiel gezeigt, --docker-registry-server-*-Parameter hinzu.

az webapp config container set --resource-group <group-name> --name <app-name> --multicontainer-config-file <docker-compose-file>

Führen Sie az webapp deployment container config mit dem --enable-cd-Parameter aus, um CI/CD von der Containerregistrierung zu Ihrer App zu konfigurieren. Der Befehl gibt die Webhook-URL aus. Sie müssen den Webhook jedoch in einem separaten Schritt manuell in der Registrierung erstellen. Im folgenden Beispiel wird CI/CD in Ihrer App aktiviert. Anschließend wird die Webhook-URL in der Ausgabe verwendet, um den Webhook in Azure Container Registry zu erstellen.

ci_cd_url=$(az webapp deployment container config --name <app-name> --resource-group <group-name> --enable-cd true --query CI_CD_URL --output tsv)

az acr webhook create --name <webhook-name> --registry <registry-name> --resource-group <group-name> --actions push --uri $ci_cd_url --scope '<image>:<tag>'

Weitere Ressourcen