Bereitstellen eines benutzerdefinierten Containers in App Service mithilfe von Azure Pipelines
Azure DevOps ermöglicht das Hosten, Erstellen, Planen und Testen Ihres Codes mit ergänzenden Workflows. Wenn Sie Azure Pipelines als einen dieser Workflows verwenden, können Sie Ihre Anwendung mit CI/CD für jede beliebige Plattform und Cloud bereitstellen. Eine Pipeline wird als YAML-Datei im Stammverzeichnis Ihres Repositorys definiert.
In diesem Artikel verwenden wir Azure Pipelines, um eine Windows Containeranwendung aus einem Git-Repository in Azure DevOps für App Service bereitzustellen. Es wird davon ausgegangen, dass Sie bereits über eine .NET-Anwendung mit einer unterstützenden Dockerfile in Azure DevOps verfügen.
Voraussetzungen
- Ein Azure-Konto mit einem aktiven Abonnement. Sie können kostenlos ein Konto erstellen.
- Eine Azure DevOps-Organisation. Erstellen Sie ein kostenloses Konto.
- Eine funktionierende Windows-App mit Dockerfile, die auf Azure Repos gehostet wird.
Dienstverbindung hinzufügen
Bevor Sie Ihre Pipeline erstellen, sollten Sie zunächst Ihre Dienstverbindung erstellen, da Sie bei der Erstellung Ihrer Vorlage aufgefordert werden, Ihre Verbindung auszuwählen und zu überprüfen. Eine Dienstverbindung ermöglicht Ihnen die Verbindung mit der Registry Ihrer Wahl (ACR oder Docker Hub), wenn Sie die Aufgabenvorlagen verwenden. Wenn Sie eine neue Dienstverbindung hinzufügen, wählen Sie die Option Docker Registry. Im folgenden Formular werden Sie aufgefordert, Docker Hub oder Azure Container Registry sowie die dazugehörigen Informationen auszuwählen. Um diesem Tutorial zu folgen, verwenden Sie Azure Container Registry. Sie können eine neue Dienstverbindung erstellen, indem Sie den Anweisungen hier folgen.
Schützen Ihrer Geheimnisse
Da wir mit vertraulichen Informationen arbeiten, von denen Sie nicht möchten, dass andere darauf zugreifen, verwenden wir Variablen, um unsere Informationen zu schützen. Erstellen Sie eine Variable, indem Sie die Anweisungen hier folgen.
Um eine Variable hinzuzufügen, wählen Sie die Schaltfläche Variablen neben der Schaltfläche „Speichern“ oben rechts in der Bearbeitungsansicht für Ihre Pipeline aus. Wählen Sie die Schaltfläche Neue Variable aus, und geben Sie Ihre Informationen ein. Fügen Sie die unten stehenden Variablen mit Ihren eigenen Geheimnissen hinzu, die sich aus den einzelnen Ressourcen ergeben.
- vmImageName: 'windows-latest'
- imageRepository: 'your-image-repo-name'
- dockerfilePath: '$(Build.SourcesDirectory)/path/to/Dockerfile'
- dockerRegistryServiceConnection: 'your-service-connection-number'
Erstellen einer neuen Pipeline
Sobald Ihr Repository mit Ihrer .NET-Anwendung und dem unterstützenden Dockerfile erstellt ist, können Sie Ihre Pipeline wie folgt erstellen.
- Navigieren Sie auf der linken Menüleiste zu Pipelines, und wählen Sie die Schaltfläche Pipeline erstellen aus.
- Wählen Sie auf dem nächsten Bildschirm Azure Repos Git als Repositoryoption und wählen Sie das Repository, in dem sich Ihr Code befindet
- Wählen Sie auf der Registerkarte „Konfigurieren“ die Option Starterpipeline aus.
- Wählen Sie auf der nächsten Registerkarte „Überprüfen“ die Schaltfläche Speichern aus.
Erstellen und Pushen eines Images an Azure Container Registry
Nachdem Sie Ihre Pipeline erstellt und gespeichert haben, müssen Sie die Pipeline bearbeiten, um die Schritte für die Erstellung des Containers, das Pushen in eine Registry und die Bereitstellung des Images für den App Service auszuführen. Navigieren Sie zunächst zum Menü Pipelines, wählen Sie die von Ihnen erstellte Pipeline aus, und wählen Sie anschließend die Schaltfläche Bearbeiten aus.
Zunächst müssen Sie die Docker-Task hinzufügen, damit Sie das Image erstellen können. Fügen Sie den folgenden Code hinzu und ersetzen Sie die Datei Dockerfile: app/Dockerfile durch den Pfad zu Ihrem Dockerfile.
trigger:
- main
pool:
vmImage: 'windows-latest'
variables:
vmImageName: 'windows-latest'
imageRepository: 'your-image-repo-name'
dockerfilePath: '$(Build.SourcesDirectory)/path/to/Dockerfile'
dockerRegistryServiceConnection: 'your-service-connection-number'
- stage: Build
displayName: Build and push stage
jobs:
- job: Build
displayName: Build job
pool:
vmImage: $(vmImageName)
steps:
- task: Docker@2
displayName: Build and push an image to container registry
inputs:
command: buildAndPush
repository: $(imageRepository)
dockerfile: $(dockerfilePath)
containerRegistry: $(dockerRegistryServiceConnection)
tags: |
$(tag)
Hinzufügen der Task zur App Service-Bereitstellung
Als Nächstes müssen Sie die Bereitstellungstask einrichten. Dazu benötigen Sie den Namen Ihres Abonnements, den Anwendungsnamen und die Container-Registry. Fügen Sie der yaml-Datei eine neue Stufe hinzu, indem Sie den folgenden Code einfügen.
- stage: Deploy
displayName: Deploy to App Service
jobs:
- job: Deploy
displayName: Deploy
pool:
vmImage: $(vmImageName)
steps:
Als Nächstes navigieren Sie zur Registerkarte Assistent anzeigen in der oberen rechten Ecke, suchen die Task Azure App Service bereitstellen und füllen das folgende Formular aus:
- Verbindungstyp: Azure Resource Manager
- Azure Abonnement: your-subscription-name
- App Service-Typ: Web-App für Container (Windows)
- App Service-Name: your-app-name
- Registry oder Namespace: your-azure-container-registry-namespace
- Image: your-azure-container-registry-image-name
Sobald Sie diese Angaben ausgefüllt haben, wählen Sie die Schaltfläche Hinzufügen aus, um die folgende Task hinzuzufügen:
- task: AzureRmWebAppDeployment@4
inputs:
ConnectionType: 'AzureRM'
azureSubscription: 'my-subscription-name'
appType: 'webAppHyperVContainer'
WebAppName: 'my-app-name'
DockerNamespace: 'myregsitry.azurecr.io'
DockerRepository: 'dotnetframework:12'
Nachdem Sie die Task hinzugefügt haben, ist die Pipeline bereit zur Ausführung. Wählen Sie auf Schaltfläche Überprüfen und Speichern aus, und führen Sie die Pipeline aus. Die Pipeline durchläuft die Schritte zum Erstellen und Verschieben des Windows Container-Images in Azure Container Registry und zur Bereitstellung des Images im App Service.
Nachfolgend sehen Sie ein Beispiel für die vollständige yaml-Datei:
trigger:
- main
pool:
vmImage: 'windows-latest'
variables:
vmImageName: 'windows-latest'
imageRepository: 'your-image-repo-name'
dockerfilePath: '$(Build.SourcesDirectory)/path/to/Dockerfile'
dockerRegistryServiceConnection: 'your-service-connection-number'
- stage: Build
displayName: Build and push stage
jobs:
- job: Build
displayName: Build job
pool:
vmImage: $(vmImageName)
steps:
- task: Docker@2
displayName: Build and push an image to container registry
inputs:
command: buildAndPush
repository: $(imageRepository)
dockerfile: $(dockerfilePath)
containerRegistry: $(dockerRegistryServiceConnection)
tags: |
$(tag)
- stage: Deploy
displayName: Deploy to App Service
jobs:
- job: Deploy
displayName: Deploy
pool:
vmImage: $(vmImageName)
steps:
- task: AzureRmWebAppDeployment@4
inputs:
ConnectionType: 'AzureRM'
azureSubscription: 'my-subscription-name'
appType: 'webAppHyperVContainer'
WebAppName: 'my-app-name'
DockerNamespace: 'myregsitry.azurecr.io'
DockerRepository: 'dotnetframework:12'