Bereitstellen Ihrer Anwendung in Azure mithilfe in Visual Studio erstellter GitHub Actions-Workflows

Ab Visual Studio 2019 Version 16.11 können Sie neue GitHub Actions-Workflows für auf GitHub.com gehostete .NET-Projekte erstellen.

Voraussetzungen

Bereitstellen eines einzelnen Projekts in Azure mithilfe von GitHub Actions

Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf Ihr auf GitHub.com gehostetes Projekt, und wählen Sie dann Veröffentlichen aus.

Rechtsklick > Veröffentlichen

Wählen Sie auf dem nächsten Bildschirm Azure und dann Weiter aus.

Auswählen von „Azure“

Je nach dem Projekttyp wird Sie eine andere Liste von Azure-Diensten angezeigt, aus der Sie auswählen können. Wählen Sie einen der unterstützten Azure-Dienste aus, der Ihren Anforderungen entspricht.

Auswählen des entsprechenden Azure-Diensts für Ihr Projekt

Wählen Sie im letzten Schritt des Assistenten die Option CI/CD mit GitHub Actions-Workflows (generiert yml-Datei) und dann Fertigstellen aus.

CI/CD mit GitHub Actions-Workflows (generiert YML-Datei)

Visual Studio generiert einen neuen GitHub Actions-Workflow und fordert Sie auf, ihn als Commit auf GitHub.com zu pushen.

Committen und Pushen

Wenn Sie diesen Schritt mit dem integrierten Git-Tools ausführen, erkennt Visual Studio die Ausführung des Workflows.

Workflow wird ausgeführt.

Festlegen der GitHub-Geheimnisse

Damit der generierte Workflow erfolgreich in Azure bereitgestellt werden kann, benötigt er möglicherweise Zugriff auf ein Veröffentlichungsprofil.

Ein GitHub-Geheimnis

Für eine erfolgreiche Bereitstellung kann auch der Zugang zu einem Dienstprinzipal erforderlich sein.

Zwei GitHub-Geheimnisse

In allen Fällen versucht Visual Studio, das GitHub-Geheimnis in Ihrem Namen auf den richtigen Wert festzulegen. Wenn ein Fehler auftritt, werden Sie darüber informiert und können den Vorgang erneut ausführen.

Fehlendes GitHub-Geheimnis

Wenn das Geheimnis nicht erneut festgelegt werden kann, bietet Visual Studio Ihnen die Möglichkeit, manuell auf das Geheimnis zuzugreifen, damit Sie den Vorgang über die Seite Ihres Repositorys auf Github.com abschließen können.

Festlegen eines fehlenden GitHub-Geheimnisses

Bereitstellen mehrerer Projekte in Azure Container Apps mithilfe von GitHub Actions

Diese Schritte sind geeignet, wenn Sie mehr als ein Projekt haben, das Docker-Container verwendet, und Sie diese als Multiprojekt-App bereitstellen möchten. Sie können Multiprojekt-Apps, z. B. solche, die Microservices implementieren, auf Azure Container Apps oder Azure Kubernetes Service (AKS) bereitstellen. Dieser Artikel behandelt Azure Container Apps.

  1. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf den Knoten GitHub Actions, und wählen Sie Neuer Workflow aus. Der GitHub Actions-Workflowassistent wird angezeigt.

    Screenshot der GitHub-Aktionenknotenmenü.

  2. Wählen Sie auf dem Zielbildschirm „GitHub Actions-Workflow“ die Option Azure aus.

  3. Wählen Sie für das spezifische Ziel Azure Container Apps aus. Der Assistent wechselt zum Bildschirm Container-App.

    Screenshot: Vorhandene Azure Container Apps.

  4. Wählen Sie eine vorhandene Azure Container-App aus, oder wählen Sie Neu erstellen aus.

    Screenshot: Vorhandene Azure Container Apps.

    Wenn Sie eine neue erstellen, wird dieser Bildschirm angezeigt. Beim Testen oder Lernen empfiehlt es sich in der Regel, eine neue Ressourcengruppe zu erstellen, damit später alles einfacher gelöscht werden kann. Eine Container Apps-Umgebung ist eine sichere Grenze um Gruppen von Container-Apps, die gemeinsam dasselbe virtuelle Netzwerk nutzen und Protokolle an dasselbe Protokollierungsziel schreiben. Weitere Informationen finden Sie unter Azure Container Apps-Umgebungen. Wenn Sie nicht wissen, was das ist oder bisher noch keine erstellt haben, erstellen Sie für diesen Fall eine neue.

    Screenshot der Erstellung einer neuen Azure-Container-App-Instanz.

    Nach der Erstellung wird die neue Azure Container Apps-Instanz angezeigt.

    Screenshot der neu erstellten Azure-Container-Apps-Instanz.

  5. Wählen Sie Weiter aus, um zum Bildschirm Registrierung zu wechseln. Wählen Sie eine vorhandene Azure Container Registry aus, oder erstellen Sie eine neue.

    Screenshot: Bildschirm der Azure Container Registry.

    Wenn Sie sich für die Erstellung einer neuen entscheiden, sehen Sie diesen Bildschirm. Geben Sie die Ressourcengruppe (SKU) an, und wählen Sie nach Möglichkeit dieselbe Region wie zuvor aus. Informationen zu den SKUs für Azure Container Registry finden Sie unter Azure Container Registry-Dienstebenen.

    Screenshot: Ein neues Azure Container Registry, das erst kürzlich erstellt wurde.

    Nach der Erstellung wird die neue Registrierung auf dem Bildschirm angezeigt.

    Screenshot der Erstellung einer neuen Azure-Container-Registry.

  6. Die bereitstellbaren Projekte in Ihrer Lösung werden angezeigt. Wählen Sie die Projekte aus, die Sie zusammen in derselben Azure Container Apps-Instanz bereitstellen möchten.

    Screenshot, der die Auswahl der bereitzustellenden Projekte zeigt.

  7. Klicken Sie auf Fertig stellen. Sie können die Befehle sehen, die ausgegeben werden, um die Ressourcen in Azure zu erstellen und die Authentifizierung einzurichten. Wenn etwas fehlschlägt, notieren Sie sich die verwendete Befehlszeile, da Sie den Befehl über die CLI erneut versuchen können. Machen Sie sich keine zu großen Sorgen, wenn Sie zu diesem Zeitpunkt einen Autorisierungsfehler erhalten. Sie können die Authentifizierung auch später in Visual Studio einrichten.

  8. Nach Abschluss des Vorgangs wird der Zusammenfassungsbildschirm angezeigt. Der Zusammenfassungsbildschirm zeigt die Anmeldeinformationen an, die den Einträgen entsprechen, die Visual Studio in Ihrem GitHub-Repository unter den GitHub Actions-Geheimnissen erstellt. Überprüfen Sie auf gelbe Warnzeichen. Wenn bei einem der Authentifizierungsschritte während des Erstellungsprozesses ein Fehler aufgetreten ist, haben Sie die Möglichkeit, diesen hier zu korrigieren, indem Sie auf den Link neben dem Warnzeichen klicken und einige Schritte ausführen.

  9. Öffnen Sie die Workflowdatei, um zu überprüfen, was Visual Studio generiert hat. Visual Studio tut zwar sein Bestes, um einen Workflow für Ihre Situation zu generieren, aber jede App und jedes Repository ist einzigartig, so dass Sie die von Visual Studio generierte YML-Workflowdatei oft manuell bearbeiten müssen, bevor sie erfolgreich ausgeführt werden kann. Erweitern Sie zum Öffnen den Knoten „GitHub Actions“ im Projektmappen-Explorer, klicken Sie mit der rechten Maustaste auf den soeben erstellten Workflow, und wählen Sie Bearbeiten aus.

Im Folgenden sehen Sie ein Beispiel einer Workflowdatei, die von Visual Studio für eine Lösung mit zwei bereitstellbaren Projekten (WebAPI und WebFrontEnd) erstellt wurde.

on:
push:
  branches:
  - main
env:
CONTAINER_REGISTRY_LOGIN_SERVER: registry20230810121555.azurecr.io
CONTAINER_APP_NAME: containerapp20230810121017
CONTAINER_APP_RESOURCE_GROUP_NAME: webfrontend-container-app-1234
CONTAINER_APP_CONTAINER_NAME: containerapp
jobs:
WebApi_buildImageAndDeploy:
  runs-on: ubuntu-latest
  steps:
  - name: Checkout source code
    uses: actions/checkout@v3
  - name: Set up Docker Buildx
    uses: docker/setup-buildx-action@v2
  - name: Login to Docker registry
    uses: docker/login-action@v2
    with:
      registry: ${{ env.CONTAINER_REGISTRY_LOGIN_SERVER }}
      username: ${{ secrets.registry20230810121555_USERNAME_6891 }}
      password: ${{ secrets.registry20230810121555_PASSWORD_6891 }}
  - name: Build and push Docker image to Azure container registry
    uses: docker/build-push-action@v4
    with:
      push: true
      tags: ${{ env.CONTAINER_REGISTRY_LOGIN_SERVER }}/webapi:${{ github.sha }}
      file: WebApi\Dockerfile
  - name: Azure login
    uses: azure/login@v1
    with:
      creds: ${{ secrets.containerapp20230810121017_SPN }}
  - name: Deploy to Azure container app
    uses: azure/CLI@v1
    with:
      inlineScript: >-
        az config set extension.use_dynamic_install=yes_without_prompt
        az containerapp registry set --name ${{ env.CONTAINER_APP_NAME }} --resource-group ${{ env.CONTAINER_APP_RESOURCE_GROUP_NAME }} --server ${{ env.CONTAINER_REGISTRY_LOGIN_SERVER }} --username ${{ secrets.registry20230810121555_USERNAME_2047 }} --password ${{ secrets.registry20230810121555_PASSWORD_2047 }}
        az containerapp update --name ${{ env.CONTAINER_APP_NAME }} --container-name ${{ env.CONTAINER_APP_CONTAINER_NAME }} --resource-group ${{ env.CONTAINER_APP_RESOURCE_GROUP_NAME }} --image ${{ env.CONTAINER_REGISTRY_LOGIN_SERVER }}/webapi:${{ github.sha }}
  - name: Azure logout
    run: az logout
WebFrontEnd_buildImageAndDeploy:
  runs-on: ubuntu-latest
  needs: WebApi_buildImageAndDeploy
  steps:
  - name: Checkout source code
    uses: actions/checkout@v3
  - name: Set up Docker Buildx
    uses: docker/setup-buildx-action@v2
  - name: Login to Docker registry
    uses: docker/login-action@v2
    with:
      registry: ${{ env.CONTAINER_REGISTRY_LOGIN_SERVER }}
      username: ${{ secrets.registry20230810121555_USERNAME_2047 }}
      password: ${{ secrets.registry20230810121555_PASSWORD_2047 }}
  - name: Build and push Docker image to Azure container registry
    uses: docker/build-push-action@v4
    with:
      push: true
      tags: ${{ env.CONTAINER_REGISTRY_LOGIN_SERVER }}/webfrontend:${{ github.sha }}
      file: WebFrontEnd\Dockerfile
  - name: Azure login
    uses: azure/login@v1
    with:
      creds: ${{ secrets.containerapp20230810121017_SPN }}
  - name: Deploy to Azure container app
    uses: azure/CLI@v1
    with:
      inlineScript: >-
        az config set extension.use_dynamic_install=yes_without_prompt
        az containerapp registry set --name ${{ env.CONTAINER_APP_NAME }} --resource-group ${{ env.CONTAINER_APP_RESOURCE_GROUP_NAME }} --server ${{ env.CONTAINER_REGISTRY_LOGIN_SERVER }} --username ${{ secrets.registry20230810121555_USERNAME_2047 }} --password ${{ secrets.registry20230810121555_PASSWORD_2047 }}
        az containerapp update --name ${{ env.CONTAINER_APP_NAME }} --container-name ${{ env.CONTAINER_APP_CONTAINER_NAME }} --resource-group ${{ env.CONTAINER_APP_RESOURCE_GROUP_NAME }} --image ${{ env.CONTAINER_REGISTRY_LOGIN_SERVER }}/webfrontend:${{ github.sha }}
  - name: Azure logout
    run: az logout

Die Hauptfunktion des Workflows besteht darin, sich bei den Azure-Diensten mit der richtigen Authentifizierung anzumelden und die Befehle zum Erstellen und Bereitstellen der App auszuführen.

Bearbeiten und Testen des Workflows

Die obige Prozedur generiert eine YML-Workflowdatei, Sie müssen sie jedoch in der Regel überprüfen und anpassen, bevor sie für eine Bereitstellung verwendet werden kann. Möglicherweise müssen Sie den Leitfaden von GitHub zum Schreiben von Workflowaktionen zu Rate ziehen, siehe Infos zu benutzerdefinierten Aktionen. Die Workflowdatei enthält viele konfigurierbare Elemente, z. B. die Einstellungen für die Umgebungsvariablen und die Namen der Geheimnisse. Sie können Verweise auf die Speicherorte Ihrer Dockerfile-Dateien, den Namen Ihrer Azure Container-App, die Verzweigung im Repository, die Sie zum Auslösen des Workflows verwenden werden und Verweise auf die Geheimnisse in GitHub sehen. Geheimnisse werden mithilfe der Syntax ${{ secrets.SECRET_NAME }} referenziert. Weitere Informationen finden Sie unter GitHub Actions-Geheimnisse.

Wenn sich Ihre Projekte nicht im Stamm des Repositorys befinden, müssen Sie den Workflow ändern, um den Pfad zum Suchen der Dockerfile-Dateien anzugeben. Fügen Sie Umgebungsvariablen für die relativen Pfade zur Dockerfile-Datei in beiden Projekten hinzu.

DOCKER_FILEPATH_WEBAPI: docker/ComposeSample/WebApi/Dockerfile
DOCKER_FILEPATH_WEBFRONTEND: docker/ComposeSample/WebFrontend/Dockerfile

Verwenden Sie die Werte dieser Umgebungsvariablen für den file-Parameter wie folgt:

- name: Build and push Docker image to Azure container registry
  uses: docker/build-push-action@v4
  with:
    push: true
    tags: ${{ env.CONTAINER_REGISTRY_LOGIN_SERVER }}/webfrontend:${{ github.sha }}
    file: ${{ env.DOCKER_FILEPATH_WEBFRONTEND }}

Wenn Sie Änderungen an der Dockerfile-Datei vornehmen müssen, nehmen Sie die Änderungen vor und speichern sie, und committen und pushen Sie diese an das Remote-Repository. Der von Visual Studio generierte Workflow enthält einen Trigger, der bewirkt, dass er ausgeführt wird, wenn er auf einer angegebenen Verzweigung aktualisiert wird. Wenn Sie einen Push an die working-Verzweigung ausführen, sollte dies dem folgenden Code ähneln:

on:
  push:
  branches:
  - working

Um die Änderungen zu testen, führen Sie einen Commit durch und pushen die Änderung an die Verzweigung des im Triggercode angegebenen Repositorys. Sie müssen keinen Pull Request (PR) erstellen. Der Workflow wird ausgeführt, solange der push-Trigger auf die richtige Verzweigung festgelegt ist.

Suchen Sie auf der Registerkarte Aktionen Ihres Repositorys unter GitHub.com nach der Workflowausführung. Sie können direkt dorthin gelangen, indem Sie einen Link auf der Zusammenfassungsregisterkarte „GitHub Actions“ in Visual Studio verwenden. In GitHub können Sie die Workflowausführung öffnen, um die Protokolle anzuzeigen.

Problembehandlung

Die folgenden Tipps zur Problembehandlung sind möglicherweise hilfreich, wenn Ihr Workflow nicht erfolgreich ausgeführt wird.

Problem: Buildphase wird nicht erstellt

Ein Problem, das in der Dockerfile-Datei auftreten kann, besteht darin, dass die Buildphase nicht wie in Visual Studio funktioniert. Die Dockerfile-Standarddatei, die Visual Studio für ein Projekt generiert, veranschaulicht dieses Problem. Berücksichtigen Sie die folgenden Änderungen an der Buildphase, wenn Sie über eine solche Dockerfile-Datei verfügen. Hier ist ein Beispiel, bei dem sich ein Projekt in einem Repository bei docker/ComposeSample/WebApi befindet. Der vollständige Pfad wird angegeben, da der Dockerfile-Kontext im Workflowbuildcontainer auf den Stamm des Repositorys festgelegt ist, aber in Visual Studio ist er auf den Ordner oberhalb des Projektordners festgelegt. Das Suffix _build wird hier angefügt, um den Buildordner zu erstellen, und anstatt nur die Projektdatei zu kopieren, wird der gesamte Ordner kopiert. Im Vergleich zu der von Visual Studio generierten Dockerfile-Standarddatei wurde der Dateiteil des Pfads im ersten Argument des COPY-Befehls entfernt, sodass wir den gesamten Ordner statt nur die Projektdatei kopieren. Ohne diese Änderungen erzeugt diese Phase einen MSBuild-Fehler.

FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src
COPY ["docker/ComposeSample/WebApi/", "WebApi_build/"]
RUN dotnet restore "WebApi_build/WebApi.csproj"
COPY . .
WORKDIR "/src/WebApi_build"
RUN dotnet build "WebApi.csproj" -c Release -o /app/build

Problem: Anmeldeinformationen für die Authentifizierung

Der Workflow erfordert, dass für den Azure-Zugriff die richtigen Geheimnisse für Benutzername und Kennwort eingerichtet werden. Visual Studio versucht, dies automatisch zu tun, wenn Sie die Azure-Assets erstellen oder über den Bildschirm „GitHub-Aktionen“ in der Microsoft Visual Studio IDE. Sie können die Geheimnisse in GitHub überprüfen und sicherstellen, dass sie vorhanden sind, oder sie erneut generieren und bei Bedarf mithilfe des Abschnitts „Einstellungen“ im Repository zu GitHub hinzufügen. Überprüfen Sie die ID der Geheimnisse anhand der Verweise in den einzelnen Abschnitten des Workflows. Bei Bedarf können Sie zur Containerregistrierung im Azure-Portal wechseln und den Benutzernamen und das Kennwort für die Containerregistrierung abrufen und diese Werte verwenden, um die Geheimnisse in GitHub zu aktualisieren.

Wenn Sie den az ad sp create-for-rbac-Befehl ausgeführt haben, um einen Dienstprinzipal einzurichten und eine Client-ID, einen geheimen Clientschlüssel und eine Mandanten-ID abzurufen, fügen Sie die Client-ID und den geheimen Clientschlüssel im Abschnitt GitHub Actions-Geheimnisse für Ihr GitHub-Repository hinzu. Sie können Azure-Anmeldeinformationen in Form eines Benutzernamens (Client-ID für die App) und eines Kennworts (geheimer Clientschlüssel) für die Azure Container-App-Authentifizierung angeben. Ersetzen Sie dazu den Schritt Azure login mit dem folgenden Code. Verwenden Sie Ihre eigenen GitHub-Geheimnisnamen, die Sie für die Client-ID und den geheimen Clientschlüssel erstellt haben, und verwenden Sie die Mandanten-ID aus der Ausgabe desselben Befehls.

- name: Azure login
  uses: azure/CLI@v1
  with:
    inlineScript: |
      az login --service-principal -u ${{ secrets.GITHUB_SECRETID_FOR_USERNAME }} -p ${{ secrets.GITHUB_SECRETID_FOR_PASSWORD }} --tenant {your tenant ID}
      az account list

Wenn die Dockerfile-Datei ordnungsgemäß funktioniert und die Authentifizierung korrekt ist, Sie aber weiterhin Probleme mit Ihrem Workflow haben, sollten Sie die folgenden Ressourcen nutzen:

Welche Projekttypen werden unterstützt?

  • ASP.NET Core
  • ASP.NET 5 und höher
  • Azure-Funktionen

Welche Azure-Dienste werden unterstützt?

  • Azure-Web-Apps
  • Azure-Funktionen
  • Azure API Management