Wie verwende ich GitHub Actions zur Bereitstellung in Azure?
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 erfahren Sie, wie Sie mit Bedingungen im Workflow arbeiten. Schließlich erfahren Sie, wie Sie Azure-Ressourcen mithilfe von GitHub-Aktionen erstellen und löschen.
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 Option 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 zum Beispiel eine stage-Bezeichnung hinzu, um einen Bereitstellungsworkflow für Ihre Stagingumgebung zu starten, oder fügen Sie eine spin up environment-Bezeichnung hinzu, um den Workflow auszuführen, der die Microsoft Azure-Ressourcen erstellt, die Sie für die Bereitstellung verwenden. Ihre Workflow für die Verwendung von Bezeichnungen sieht wie folgt aus:
on:
pull_request:
types: [labeled]
Steuern der Ausführung mit einer Auftragsbedingung
Häufig möchten Sie nur einen Workflow ausführen, wenn eine bestimmte Bedingung wahr ist.
GitHub-Workflows bieten die if-Bedingung für dieses Szenario. Die bedingte Bedingung verwendet einen Ausdruck , der zur Laufzeit ausgewertet wird. Beispielsweise möchten Sie diesen Workflow ausführen, wenn der Pullanforderung eine Phasenbezeichnung 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. 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.
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
Der GitHub Marketplace verfügt über mehrere Aktionen, mit denen Sie Azure-bezogene Aufgaben automatisieren können.
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:
- Navigieren Sie in Ihrem Repository zu der Workflowdatei, die Sie bearbeiten möchten.
- Wählen Sie das Symbol "Bearbeiten" in der oberen rechten Ecke der Dateiansicht aus.
- 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:
- azure/webapps-deploy@v1
- Azure/login@v1, den wir zuvor gesehen haben
- azure/docker-login@v1
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-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 Azure/login@v1-Aktion benötigt Anmeldeinformationen, um sich bei Ihrem Azure-Konto anzumelden, damit sie auf die Azure-Ressourcen zugreifen kann, für die Sie bereitstellen möchten. Verwenden Sie hier die Anmeldedaten, die wir in GitHub Secrets gespeichert haben.
Das gleiche 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 Aktion "azure/webapps-deploy@v1 " führt die Bereitstellung aus. Dies hängt von den beiden vorangegangenen Aktionen ab.
Erstellen und Löschen von Azure-Ressourcen mithilfe von GitHub Actions
Da CD ein automatisierter Prozess ist, haben Sie sich bereits entschieden, die Infrastruktur als Code zu verwenden, um die Umgebungen zu erstellen und abzubauen, für die Sie bereitstellen möchten. 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 zu Azure CLI finden Sie unter Ü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.