Udostępnij za pośrednictwem


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

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.

  1. Przejdź do pozycji Potoki na pasku menu po lewej stronie i kliknij przycisk Utwórz potok
  2. Na następnym ekranie wybierz pozycję Azure Repos Git jako opcję repozytorium i wybierz repozytorium, w którym znajduje się kod
  3. Na karcie Konfigurowanie wybierz opcję Potok początkowy
  4. 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'