Поделиться через


Развертывание пользовательского контейнера в службе приложений с помощью 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. Вы можете создать новое подключение службы, следуя указаниям , приведенным здесь.

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

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

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

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

    • vmImageName: "windows-latest"
    • хранилище изображений: 'название-вашего-репозитория-изображений'
    • dockerfilePath: "$(Build.SourcesDirectory)/path/to/Dockerfile"
    • dockerRegistryServiceConnection: "ваш-номер-подключения-услуги"

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

После создания репозитория с приложением .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)

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

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

  1. Добавьте новый этап в yaml-файл, вставив приведенный ниже код.

    - stage: Deploy
      displayName: Deploy to App Service
      jobs:
      - job: Deploy
        displayName: Deploy
        pool:
          vmImage: $(vmImageName)
        steps:
    
  2. Перейдите на вкладку "Показать помощник" в правом верхнем углу и найдите задачу развертывания Службы приложений Azure и заполните следующую форму:

    • Тип подключения: Azure Resource Manager
    • Подписка Azure: имя подписки
    • Тип Службы приложений: Веб-Приложение для Контейнеров (Windows)
    • Название службы приложений: имя вашего приложения
    • Реестр или пространство имен: your-azure-container-registry-namespace
    • Изображение: имя-azure-container-registry-image-name
  3. Нажмите кнопку "Добавить ", чтобы добавить следующую задачу:

    - 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'