Wie verwende ich GitHub Actions zur Bereitstellung in Azure?

Abgeschlossen

In dieser Lerneinheit erfahren Sie, wie Sie mit GitHub-Aktionen eine Container-basierte Web-App in Microsoft Azure Web Apps bereitstellen. Sie enthält einige Optionen zum Auslösen einer Workflow. Als nächstes lernen Sie, wie Sie mit Bedingungen in der Workflow arbeiten. Schließlich erfahren Sie, wie Sie Azure-Ressourcen mit Hilfe von GitHub-Aktionen erstellen und löschen können.

Optionen zum Auslösen eines CD-Workflows

Es gibt mehrere Möglichkeiten zum Starten eines CD-Workflows. Im vorherigen Modul zu CI mit GitHub Actions haben Sie erfahren, wie ein Workflow über einen Push an das GitHub-Repository ausgelöst wird. Im Falle von CD sollten Sie jedoch eine Bereitstellungsworkflow oder ein anderes Ereignis auslösen.

Eine Möglichkeit besteht darin, den Workflow mit ChatOps auszulösen. ChatOps verwendet Chat-Clients, Chatbots und Echtzeit-Kommunikationstools, um Aufgaben auszuführen. Sie können beispielsweise einen bestimmten Kommentar in einem Pull Request hinterlassen, der einen Bot auslösen kann. Dieser Bot kann einen Antwortkommentar mit einigen Statistiken verfassen oder einen Workflow ausführen.

Eine weitere Option ist, Bezeichnungen in Ihrem Pull Request zu verwenden. Diese Option verwenden wir auch in unserem Beispiel. Mit unterschiedlichen Bezeichnungen können unterschiedliche Workflows gestartet werden. Fügen Sie beispielsweise eine Bezeichnung für eine Phase hinzu, um eine Workflow zur Bereitstellung in Ihrer Staging-Umgebung zu starten. Oder fügen Sie eine Bezeichnung für die Spin-Up-Umgebung hinzu, um die Workflow auszuführen, die die Microsoft Azure-Ressourcen für die Bereitstellung erstellt. Ihre Workflow für die Verwendung von Bezeichnungen sieht wie folgt aus:

on:
  pull_request:
    types: [labeled]

Steuern der Ausführung mit einer Auftragsbedingung

Oft möchten Sie nur einen Workflow ausführen, wenn eine Bedingung wahr („true“) ist.

GitHub-Workflows bieten die if-Bedingung für dieses Szenario. Die Bedingung verwendet einen Ausdruck, der zur Laufzeit ausgewertet wird. Sie möchten diese Workflow beispielsweise ausführen, wenn dem Pull Request eine Stage-Bezeichnung hinzugefügt wird.

if: contains(github.event.pull_request.labels.*.name, 'stage')

Speichern von Anmeldeinformationen mit GitHub-Geheimnissen

In der Workflowdatei sollten niemals vertrauliche Informationen verfügbar gemacht werden. GitHub Secrets ist ein sicherer Ort zum Speichern vertraulicher Informationen, die Ihre Workflow benötigt. Im Folgenden sehen Sie ein Beispiel.

Zum Bereitstellen zu einer Azure-Ressource muss die GitHub-Aktion über Berechtigungen zum Zugriff auf die Ressource verfügen. Sie möchten nicht, dass Ihre Azure-Anmeldeinformationen in der Workflowdatei allgemein zugänglich sind. Stattdessen können Sie Ihre Anmeldeinformationen in GitHub Secrets speichern.

Um Informationen in GitHub Secrets zu speichern, erstellen Sie im Portal ein Geheimnis.

Azure portal interface for creating a secret.

Verwenden Sie dann den Namen des Geheimnisses, das Sie in Ihrer Workload erstellt haben, überall dort, wo Sie diese Informationen benötigen. Verwenden Sie zum Beispiel die Azure-Anmeldedaten, die in GitHub Secrets gespeichert wurden, im creds:-Attribut einer Azure login-Aktion.

steps:
      - name: "Login via Azure CLI"
        uses: azure/login@v1
        with:
          creds: ${{ secrets.AZURE_CREDENTIALS }}

Bereitstellen in Microsoft Azure mithilfe von GitHub Actions

Im GitHub Marketplace sind mehrere Aktionen verfügbar, mit denen Sie Ihre Azure-bezogenen Aufgaben automatisieren können.

The GitHub Marketplace showing search results for Azure.

Sie können auch direkt im Workflow-Editor eines Repositorys nach GitHub Actions suchen und das Feature durchsuchen. In der Randleiste können Sie nach einer bestimmten Aktion suchen, die vorgestellten Aktionen anzeigen und die vorgestellten Kategorien durchsuchen.

So finden Sie eine Aktion:

  1. Navigieren Sie in Ihrem Repository zu der Workflowdatei, die Sie bearbeiten möchten.
  2. Klicken Sie in der oberen rechten Ecke der Dateiansicht auf das Symbol Bearbeiten.
  3. Verwenden Sie die Randleiste des GitHub-Marketplace rechts neben dem Editor, um GitHub Actions zu durchsuchen.

Angenommen, Sie möchten eine containerbasierte Web-App in Azure-Web-Apps bereitstellen. Wenn Sie den GitHub Marketplace durchsuchen, finden Sie folgende Aktionen:

Wenn Sie diese Aktionen dem Deploy-to-Azure-Auftrag hinzufügen, sieht Ihr Workflow folgendermaßen aus:

  Deploy-to-Azure:
    runs-on: ubuntu-latest
    needs: Build-Docker-Image
    name: Deploy app container to Azure
    steps:
      - name: "Login via Azure CLI"
        uses: azure/login@v1
        with:
          creds: ${{ secrets.AZURE_CREDENTIALS }}

      - uses: azure/docker-login@v1
        with:
          login-server: ${{env.IMAGE_REGISTRY_URL}}
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}

      - name: Deploy web app container
        uses: azure/webapps-container-deploy@v1
        with:
          app-name: ${{env.AZURE_WEBAPP_NAME}}
          images: ${{env.IMAGE_REGISTRY_URL}}/${{ github.repository }}/${{env.DOCKER_IMAGE_NAME}}:${{ github.sha }}

      - name: Azure logout
        run: |
          az logout

Beachten Sie, dass dieser Auftrag von einem vorherigen Auftrag (Build-Docker-Image) abhängt. Im vorherigen Auftrag wird das Artefakt erstellt, das bereitgestellt wird.

Die Aktion azure/login@v1 erfordert Anmeldeinformationen, um sich bei Ihrem Azure-Konto anzumelden, damit sie Zugriff auf die Azure-Ressourcen erhält, die Sie bereitstellen möchten. Verwenden Sie hier die Anmeldedaten, die wir in GitHub Secrets gespeichert haben.

Dasselbe gilt für die Aktion azure/docker-login@v1. Da Sie ein Container-Image bereitstellen, müssen Sie sich bei Ihrer privaten Containerregistrierung anmelden.

Die Bereitstellung wird von der Aktion azure/webapps-container-deploy@v1 ausgeführt. Dies hängt von den beiden vorangegangenen Aktionen ab.

Erstellen und Löschen von Azure-Ressourcen mithilfe von GitHub Actions

Da es sich bei CD um einen automatisierten Prozess handelt, haben Sie sich bereits für die Verwendung von Infrastructure-as-Code entschieden, um die Umgebungen, die Sie bereitstellen, zu erstellen und abzubauen. GitHub Actions kann diese Aufgaben in Azure automatisieren, und Sie können diese Aktionen in Ihren Workflow einschließen.

Hinweis

Beachten Sie, dass es wichtig ist, Ressourcen, die Sie nicht mehr verwenden, so schnell wie möglich zu löschen, um unnötige Kosten zu vermeiden.

Eine Möglichkeit besteht darin, einen neuen Workflow mit zwei Aufträgen zu erstellen: einen Workflow, der Ressourcen einrichtet und einen, der diese löscht. Verwenden Sie dann eine Bedingung, um nur den gewünschten Auftrag auszuführen. In diesem Beispiel sucht die Bedingung nach einer Bezeichnung im Pull Request und führt den set-up-azure-resources-Auftrag aus, wenn die Bezeichnung spin up environment (Umgebung starten) lautet, und den destroy-azure-resources-Auftrag, wenn die Bezeichnung destroy environment (Umgebung zerstören) lautet.

jobs:
  set-up-azure-resources:
    runs-on: ubuntu-latest

    if: contains(github.event.pull_request.labels.*.name, 'spin up environment')

    ...

  destroy-azure-resources:
    runs-on: ubuntu-latest

    if: contains(github.event.pull_request.labels.*.name, 'destroy environment')

    ...

Die Aufträge verwenden die Azure CLI zum Erstellen und Zerstören der Azure-Ressourcen. Weitere Informationen über Azure CLI finden Sie in der Übersicht über Azure CLI.

Im Folgenden wird ein Beispiel für die Schritte im set-up-azure-resources-Auftrag veranschaulicht:

steps:
  - name: Checkout repository
    uses: actions/checkout@v2

  - name: Azure login
    uses: azure/login@v1
    with:
      creds: ${{ secrets.AZURE_CREDENTIALS }}

  - name: Create Azure resource group
    if: success()
    run: |
      az group create --location ${{env.AZURE_LOCATION}} --name ${{env.AZURE_RESOURCE_GROUP}} --subscription ${{secrets.AZURE_SUBSCRIPTION_ID}}
  - name: Create Azure app service plan
    if: success()
    run: |
      az appservice plan create --resource-group ${{env.AZURE_RESOURCE_GROUP}} --name ${{env.AZURE_APP_PLAN}} --is-linux --sku F1 --subscription ${{secrets.AZURE_SUBSCRIPTION_ID}}
  - name: Create webapp resource
    if: success()
    run: |
      az webapp create --resource-group ${{ env.AZURE_RESOURCE_GROUP }} --plan ${{ env.AZURE_APP_PLAN }} --name ${{ env.AZURE_WEBAPP_NAME }}  --deployment-container-image-name nginx --subscription ${{secrets.AZURE_SUBSCRIPTION_ID}}
  - name: Configure webapp to use GitHub Packages
    if: success()
    run: |
      az webapp config container set --docker-custom-image-name nginx --docker-registry-server-password ${{secrets.GITHUB_TOKEN}} --docker-registry-server-url https://docker.pkg.github.com --docker-registry-server-user ${{github.actor}} --name ${{ env.AZURE_WEBAPP_NAME }} --resource-group ${{ env.AZURE_RESOURCE_GROUP }} --subscription ${{secrets.AZURE_SUBSCRIPTION_ID}}

Beachten Sie, dass Sie GitHub-Aktionen zum Überprüfen des Repositorys und zum Anmelden bei Azure verwenden. Anschließend erstellen Sie die benötigten Ressourcen und stellen den Container mithilfe der Azure CLI bereit.