Развертывание пользовательского контейнера для Служба приложений с помощью Azure Pipelines
Azure DevOps позволяет размещать, создавать, планировать и тестировать код с помощью бесплатных рабочих процессов. Использование Azure Pipelines в качестве одного из этих рабочих процессов позволяет развертывать приложение с непрерывной поставкой и непрерывной интеграцией (CI/CD), которое работает с любой платформой и облаком. Конвейер определяется как YAML-файл в корневой папке вашего репозитория.
В этой статье мы используем Azure Pipelines для развертывания приложения контейнера Windows для Служба приложений из репозитория Git в Azure DevOps. Предполагается, что у вас уже есть приложение .NET с поддержкой dockerfile в Azure DevOps.
Необходимые компоненты
- Учетная запись Azure с активной подпиской. Создайте учетную запись бесплатно .
- Организация Azure DevOps. Создайте ее бесплатно.
- Работающее приложение Windows с Dockerfile, размещенное в Azure Repos.
Добавление подключения к службе
Перед созданием конвейера необходимо сначала создать подключение службы, так как вам будет предложено выбрать и проверить подключение при создании шаблона. Подключение к службе позволяет подключаться к выбранному реестру (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 можно создать конвейер, выполнив указанные ниже действия.
- Перейдите к конвейерам в левой строке меню и нажмите кнопку "Создать конвейер"
- На следующем экране выберите Azure Repos Git в качестве параметра репозитория и выберите репозиторий, в котором находится код.
- На вкладке "Настройка" выберите параметр "Начальный конвейер"
- На следующей вкладке "Рецензирование" нажмите кнопку "Сохранить "
Создание и отправка образа в реестр контейнеров 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'