Развертывание пользовательского контейнера для Служба приложений с помощью Azure Pipelines

Azure DevOps позволяет размещать, создавать, планировать и тестировать код с помощью бесплатных рабочих процессов. Использование Azure Pipelines в качестве одного из этих рабочих процессов позволяет развертывать приложение с непрерывной поставкой и непрерывной интеграцией (CI/CD), которое работает с любой платформой и облаком. Конвейер определяется как YAML-файл в корневой папке вашего репозитория.

В этой статье мы используем Azure Pipelines для развертывания приложения контейнера Windows для Служба приложений из репозитория Git в Azure DevOps. Предполагается, что у вас уже есть приложение .NET с поддержкой dockerfile в Azure DevOps.

Необходимые компоненты

Добавление подключения к службе

Перед созданием конвейера необходимо сначала создать подключение службы, так как вам будет предложено выбрать и проверить подключение при создании шаблона. Подключение к службе позволяет подключаться к выбранному реестру (ACR или Docker Hub) при использовании шаблонов задач. При добавлении нового подключения к службе выберите параметр Реестра Docker. Следующая форма предлагает выбрать Docker Hub или Реестр контейнеров Azure вместе с соответствующими сведениями. Чтобы следовать этому руководству, используйте Реестр контейнеров Azure. Вы можете создать новое подключение службы, следуя указаниям , приведенным здесь.

Защита секретов

Так как мы используем конфиденциальную информацию, доступ к которой не требуется другим пользователям, мы используем переменные для защиты нашей информации. Создайте переменную, следуя указаниям здесь.

Чтобы добавить переменную, нажмите кнопку "Переменные" рядом с кнопкой "Сохранить" в правом верхнем углу представления редактирования для конвейера. Нажмите кнопку "Создать переменную" и введите сведения. Добавьте приведенные ниже переменные с собственными секретами, соответствующими каждому ресурсу.

  • vmImageName: "windows-latest"
  • imageRepository: "your-image-repo-name"
  • dockerfilePath: "$(Build.SourcesDirectory)/path/to/Dockerfile"
  • dockerRegistryServiceConnection: "your-service-connection-number"

Создание нового конвейера

После создания репозитория с приложением .NET и поддержкой dockerfile можно создать конвейер, выполнив указанные ниже действия.

  1. Перейдите к конвейерам в левой строке меню и нажмите кнопку "Создать конвейер"
  2. На следующем экране выберите Azure Repos Git в качестве параметра репозитория и выберите репозиторий, в котором находится код.
  3. На вкладке "Настройка" выберите параметр "Начальный конвейер"
  4. На следующей вкладке "Рецензирование" нажмите кнопку "Сохранить "

Создание и отправка образа в реестр контейнеров Azure

После создания и сохранения конвейера необходимо изменить конвейер, чтобы выполнить шаги по созданию контейнера, отправке в реестр и развертыванию образа в Служба приложений. Чтобы начать, перейдите в меню "Конвейеры ", выберите созданный конвейер и нажмите кнопку " Изменить ".

Сначала необходимо добавить задачу Docker, чтобы создать образ. Добавьте следующий код и замените Dockerfile: app/Dockerfile путем к 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)

Добавление задачи развертывания Служба приложений

Затем необходимо настроить задачу развертывания. Для этого требуется имя подписки, имя приложения и реестр контейнеров. Добавьте новый этап в yaml-файл, вставив приведенный ниже код.

- stage: Deploy
  displayName: Deploy to App Service
  jobs:
  - job: Deploy
    displayName: Deploy
    pool:
      vmImage: $(vmImageName)
    steps:

Затем перейдите на вкладку "Показать помощник" в правом верхнем углу и найдите задачу развертывания службы приложение Azure и заполните следующую форму:

  • Тип подключения: Azure Resource Manager
  • Подписка Azure: имя подписки
  • тип Служба приложений: веб-приложение для контейнеров (Windows)
  • Служба приложений имя: имя приложения
  • Реестр или пространство имен: пространство имен azure-container-registry-namespace
  • Изображение: имя-azure-container-registry-image-name

После заполнения нажмите кнопку "Добавить ", чтобы добавить следующую задачу:

- task: AzureRmWebAppDeployment@4
  inputs:
    ConnectionType: 'AzureRM'
    azureSubscription: 'my-subscription-name'
    appType: 'webAppHyperVContainer'
    WebAppName: 'my-app-name'
    DockerNamespace: 'myregsitry.azurecr.io'
    DockerRepository: 'dotnetframework:12'

После добавления задачи конвейер готов к выполнению. Нажмите кнопку "Проверить и сохранить " и запустите конвейер. Конвейер выполняет шаги по сборке и отправке образа контейнера Windows в Реестр контейнеров Azure и развертывании образа в Служба приложений.

Ниже приведен пример полного 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'