Bereitstellen eines benutzerdefinierten Containers in App Service mithilfe von GitHub-Aktionen

GitHub Actions bietet Ihnen die Flexibilität, einen automatisierten Softwareentwicklungsworkflow zu erstellen. Mit der Azure Web Deploy-Aktion können Sie Ihren Workflow automatisieren, um mithilfe von GitHub Actions benutzerdefinierte App Service-Container bereitzustellen.

Ein Workflow wird durch eine YAML-Datei im Pfad /.github/workflows/ in Ihrem Repository definiert. Diese Definition enthält die verschiedenen Schritte und Parameter im Workflow.

Bei einem Azure App Service-Containerworkflow umfasst die Datei drei Abschnitte:

`Section` Aufgaben
Authentifizierung 1. Abrufen eines Dienstprinzipals oder Veröffentlichungsprofils.
2. Erstellen eines GitHub-Geheimnisses.
Build 1. Erstellen Sie die Umgebung.
2. Erstellen des Containerimages
Bereitstellen 1. Bereitstellen des Containerimages

Voraussetzungen

Generieren von Anmeldeinformationen für die Bereitstellung

Die empfohlene Vorgehensweise für die Authentifizierung mit Azure App Services für GitHub Actions verwendet ein Veröffentlichungsprofil. Sie können sich auch mit einem Dienstprinzipal oder Open ID Connect authentifizieren, für diesen Vorgang sind jedoch weitere Schritte erforderlich.

Speichern Sie die Anmeldeinformationen des Veröffentlichungsprofils oder den Dienstprinzipal als GitHub-Geheimnis, um sich bei Azure zu authentifizieren. In Ihrem Workflow greifen Sie auf das Geheimnis zu.

Ein Veröffentlichungsprofil stellt Anmeldeinformationen auf App-Ebene dar. Richten Sie Ihr Veröffentlichungsprofil als GitHub-Geheimnis ein.

  1. Wechseln Sie im Azure-Portal zu Ihrem App Service.

  2. Wählen Sie auf der Seite Übersicht die Option Veröffentlichungsprofil abrufen.

    Hinweis

    Ab Oktober 2020 muss für Linux-Web-Apps die App-Einstellung WEBSITE_WEBDEPLOY_USE_SCM auf true festgelegt werden, bevor die Datei heruntergeladen wird. Diese Anforderung wird künftig entfallen. Informationen zum Konfigurieren allgemeiner Web-App-Einstellungen finden Sie unter Konfigurieren einer App Service-App im Azure-Portal.

  3. Speichern Sie die heruntergeladene Datei. Zum Erstellen eines GitHub-Geheimnisses verwenden Sie den Inhalt der Datei.

Konfigurieren des GitHub-Geheimnisses für die Authentifizierung

Suchen Sie auf GitHub nach Ihrem Repository. Wählen Sie Einstellungen > Sicherheit > Geheimnisse und Variablen > Aktionen > Neues Repositorygeheimnis aus.

Um Anmeldeinformationen auf App-Ebene zu verwenden, fügen Sie den Inhalt der heruntergeladenen Veröffentlichungsprofildatei in das Wertfeld des Geheimnisses ein. Geben Sie dem Geheimnis den Namen AZURE_WEBAPP_PUBLISH_PROFILE.

Wenn Sie Ihren GitHub-Workflow konfigurieren, verwenden Sie AZURE_WEBAPP_PUBLISH_PROFILE in der Bereitstellungsaktion für die Azure-Web-App. Beispiel:

- uses: azure/webapps-deploy@v2
  with:
    publish-profile: ${{ secrets.AZURE_WEBAPP_PUBLISH_PROFILE }}

Konfigurieren von GitHub-Geheimnissen für die Registrierung

Definieren Sie Geheimnisse für die Docker-Anmeldeaktion. Im Beispiel in diesem Dokument wird Azure Container Registry für die Containerregistrierung verwendet.

  1. Wechseln Sie im Azure-Portal oder in Docker zu Ihrem Container, und kopieren Sie den Benutzernamen und das Kennwort. Den Benutzernamen und das Kennwort für Azure Container Registry finden Sie im Azure-Portal unter Einstellungen>Zugriffsschlüssel für Ihre Registrierung.

  2. Definieren Sie ein neues Geheimnis für den Registrierungsbenutzer mit dem Namen REGISTRY_USERNAME.

  3. Definieren Sie ein neues Geheimnis für das Registrierungskennwort mit dem Namen REGISTRY_PASSWORD.

Erstellen des Containerimages

Das folgende Beispiel zeigt einen Teil des Workflows zum Erstellen eines Node.js-Docker-Images. Melden Sie sich über die Docker-Anmeldung bei einer privaten Containerregistrierung an. In diesem Beispiel wird Azure Container Registry verwendet, die gleiche Aktion funktioniert jedoch auch mit anderen Registrierungen.

name: Linux Container Node Workflow

on: [push]

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v2
    - uses: azure/docker-login@v1
      with:
        login-server: mycontainer.azurecr.io
        username: ${{ secrets.REGISTRY_USERNAME }}
        password: ${{ secrets.REGISTRY_PASSWORD }}
    - run: |
        docker build . -t mycontainer.azurecr.io/myapp:${{ github.sha }}
        docker push mycontainer.azurecr.io/myapp:${{ github.sha }}     

Sie können auch die Docker-Anmeldung verwenden, um sich bei mehreren Containerregistrierungen gleichzeitig anzumelden. Dieses Beispiel enthält zwei neue GitHub-Geheimnisse für die Authentifizierung mit docker.io. Im Beispiel wird davon ausgegangen, dass ein Dockerfile auf der Stammebene der Registrierung vorhanden ist.

name: Linux Container Node Workflow

on: [push]

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v2
    - uses: azure/docker-login@v1
      with:
        login-server: mycontainer.azurecr.io
        username: ${{ secrets.REGISTRY_USERNAME }}
        password: ${{ secrets.REGISTRY_PASSWORD }}
    - uses: azure/docker-login@v1
      with:
        login-server: index.docker.io
        username: ${{ secrets.DOCKERIO_USERNAME }}
        password: ${{ secrets.DOCKERIO_PASSWORD }}
    - run: |
        docker build . -t mycontainer.azurecr.io/myapp:${{ github.sha }}
        docker push mycontainer.azurecr.io/myapp:${{ github.sha }}     

Bereitstellung in einem App Service-Container

Um Ihr Image in einem benutzerdefinierten Container in App Service bereitzustellen, verwenden Sie die Aktion azure/webapps-deploy@v2. Diese Aktion umfasst sieben Parameter:

Parameter Erklärung
app-name (Erforderlich): Name der App Service-App.
publish-profile (Optional) Gilt für Web-Apps(Windows und Linux) und Web-App-Container (Linux). Szenarien mit mehreren Containern werden nicht unterstützt. Veröffentlichungsprofil-Dateiinhalte (*.publishsettings) mit Web Deploy-Geheimnissen
slot-name (Optional): Geben Sie einen vorhandene Slot ein, bei dem es sich nicht um den Produktionsslot handelt.
package (Optional) Gilt nur für Web-App: Pfad zum Paket oder Ordner. *.zip, *.war, *.jar oder ein Ordner für die Bereitstellung
images (Erforderlich) Gilt nur für Web-App-Container: Geben Sie den vollqualifizierten Namen des bzw. der Containerimages an. Beispiel: „myregistry.azurecr.io/nginx:latest“ oder „python:3.7.2-alpine/“. Für eine App mit mehreren Containern können mehrere Namen von Containerimages angegeben werden (mehrere getrennte Zeilen).
configuration-file (Optional) Gilt nur für Web-App-Container: Der Pfad der Docker-Compose-Datei. Es muss sich um einen vollqualifizierten Pfad oder einen Pfad relativ zum Standardarbeitsverzeichnis handeln. Dieser Parameter ist beim Konfigurieren von Apps mit mehreren Containern erforderlich.
startup-command (Optional): Geben Sie den Startbefehl ein. Beispiel: „dotnet run“ oder „dotnet filename.dll“
name: Linux Container Node Workflow

on: [push]

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v2

    - uses: azure/docker-login@v1
      with:
        login-server: mycontainer.azurecr.io
        username: ${{ secrets.REGISTRY_USERNAME }}
        password: ${{ secrets.REGISTRY_PASSWORD }}

    - run: |
        docker build . -t mycontainer.azurecr.io/myapp:${{ github.sha }}
        docker push mycontainer.azurecr.io/myapp:${{ github.sha }}     

    - uses: azure/webapps-deploy@v2
      with:
        app-name: 'myapp'
        publish-profile: ${{ secrets.AZURE_WEBAPP_PUBLISH_PROFILE }}
        images: 'mycontainer.azurecr.io/myapp:${{ github.sha }}'

Nächste Schritte

Die verfügbaren Aktionen sind auf verschiedene GitHub-Repositorys verteilt, jeweils mit Dokumentation und Beispielen, um Sie bei der Verwendung von GitHub für CI/CD und der Bereitstellung Ihrer Apps in Azure zu unterstützen.