Wdrażanie niestandardowego kontenera w usłudze App Service przy użyciu usługi Azure Pipelines
Usługa Azure DevOps umożliwia hostowanie, kompilowanie, planowanie i testowanie kodu przy użyciu bezpłatnych przepływów pracy. Użycie usługi Azure Pipelines jako jednego z tych przepływów pracy umożliwia wdrożenie aplikacji przy użyciu ciągłej integracji/ciągłego wdrażania, która współpracuje z dowolną platformą i chmurą. Potok jest definiowany jako plik YAML w katalogu głównym repozytorium.
W tym artykule użyjemy usługi Azure Pipelines do wdrożenia aplikacji kontenera systemu Windows w usłudze App Service z repozytorium Git w usłudze Azure DevOps. Przyjęto założenie, że masz już aplikację .NET z obsługą pliku dockerfile w usłudze Azure DevOps.
Wymagania wstępne
- Konto platformy Azure z aktywną subskrypcją. Utwórz konto bezpłatnie.
- Organizacja: Azure DevOps. Utwórz je bezpłatnie.
- Działająca aplikacja systemu Windows z plikiem Dockerfile hostowanym w usłudze Azure Repos.
Dodawanie połączenia z usługą
Przed utworzeniem potoku należy najpierw utworzyć połączenie z usługą, ponieważ zostanie wyświetlony monit o wybranie i zweryfikowanie połączenia podczas tworzenia szablonu. Połączenie z usługą umożliwia nawiązywanie połączenia z wybranym rejestrem (ACR lub Docker Hub) podczas korzystania z szablonów zadań. Podczas dodawania nowego połączenia z usługą wybierz opcję Rejestr platformy Docker. Poniższy formularz zawiera prośbę o wybranie usługi Docker Hub lub Azure Container Registry wraz z informacjami dotyczącymi. Aby wykonać czynności opisane w tym samouczku, użyj usługi Azure Container Registry. Nowe połączenie z usługą można utworzyć zgodnie z instrukcjami podanymi tutaj.
Zabezpieczanie wpisów tajnych
Ponieważ używamy poufnych informacji, do których nie chcesz uzyskiwać dostępu innym osobom, używamy zmiennych do ochrony naszych informacji. Utwórz zmienną, postępując zgodnie z instrukcjami podanymi tutaj.
Aby dodać zmienną, kliknij przycisk Zmienne obok przycisku Zapisz w prawym górnym rogu widoku edycji potoku. Wybierz przycisk Nowa zmienna i wprowadź informacje. Dodaj poniższe zmienne przy użyciu własnych wpisów tajnych odpowiednich dla każdego zasobu.
- vmImageName: "windows-latest"
- imageRepository: "your-image-repo-name"
- dockerfilePath: "$(Build.SourcesDirectory)/path/to/Dockerfile"
- dockerRegistryServiceConnection: "your-service-connection-number"
Tworzenie nowego potoku
Po utworzeniu repozytorium za pomocą aplikacji .NET i pomocniczego pliku dockerfile możesz utworzyć potok, wykonując następujące kroki.
- Przejdź do pozycji Potoki na pasku menu po lewej stronie i kliknij przycisk Utwórz potok
- Na następnym ekranie wybierz pozycję Azure Repos Git jako opcję repozytorium i wybierz repozytorium, w którym znajduje się kod
- Na karcie Konfigurowanie wybierz opcję Potok początkowy
- Na następnej karcie Przegląd kliknij przycisk Zapisz
Kompilowanie i wypychanie obrazu do rejestru kontenerów platformy Azure
Po utworzeniu i zapisaniu potoku należy edytować potok, aby uruchomić kroki tworzenia kontenera, wypychania do rejestru i wdrażania obrazu w usłudze App Service. Aby rozpocząć, przejdź do menu Potoki , wybierz utworzony potok i kliknij przycisk Edytuj .
Najpierw należy dodać zadanie platformy Docker, aby można było skompilować obraz. Dodaj następujący kod i zastąp plik Dockerfile: app/Dockerfile ścieżką do pliku 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)
Dodawanie zadania wdrażania usługi App Service
Następnie należy skonfigurować zadanie wdrażania. Wymaga to nazwy subskrypcji, nazwy aplikacji i rejestru kontenerów. Dodaj nowy etap do pliku yaml, wklejając poniższy kod.
- stage: Deploy
displayName: Deploy to App Service
jobs:
- job: Deploy
displayName: Deploy
pool:
vmImage: $(vmImageName)
steps:
Następnie przejdź do karty Pokaż asystenta w prawym górnym rogu i znajdź zadanie wdrażania usługi aplikacja systemu Azure i wypełnij następujący formularz:
- Typ połączenia: Azure Resource Manager
- Subskrypcja platformy Azure: twoja-subskrypcja-nazwa
- Typ usługi App Service: Web App for Containers (Windows)
- Nazwa usługi App Service: twoja-nazwa aplikacji
- Rejestr lub przestrzeń nazw: twoja-azure-container-registry-namespace
- Obraz: your-azure-container-registry-image-name
Po wypełnieniu tych elementów kliknij przycisk Dodaj , aby dodać poniższe zadanie:
- task: AzureRmWebAppDeployment@4
inputs:
ConnectionType: 'AzureRM'
azureSubscription: 'my-subscription-name'
appType: 'webAppHyperVContainer'
WebAppName: 'my-app-name'
DockerNamespace: 'myregsitry.azurecr.io'
DockerRepository: 'dotnetframework:12'
Po dodaniu zadania potok jest gotowy do uruchomienia. Kliknij przycisk Weryfikuj i zapisz, a następnie uruchom potok. Potok przechodzi przez kroki kompilowania i wypychania obrazu kontenera systemu Windows do usługi Azure Container Registry i wdrażania obrazu w usłudze App Service.
Poniżej przedstawiono przykład pełnego pliku yaml:
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'