Создание и развертывание решения HPC с помощью Azure Pipelines
Средства Azure DevOps могут автоматизировать создание и тестирование пакетная служба Azure высокопроизводительных вычислительных решений (HPC). Azure Pipelines предоставляет современные процессы непрерывной интеграции (CI) и непрерывного развертывания (CD) для создания, развертывания, тестирования и мониторинга программного обеспечения. Эти процессы ускоряют доставку программного обеспечения, позволяя сосредоточиться на коде, а не на поддержке инфраструктуры и операций.
В этой статье показано, как настроить процессы CI/CD с помощью Azure Pipelines с шаблонами Azure Resource Manager (шаблоны ARM) для развертывания решений HPC на пакетная служба Azure. В этом примере создается конвейер сборки и выпуска для развертывания инфраструктуры пакетная служба Azure и выпуска пакета приложения. На следующей схеме показан общий поток развертывания при условии, что код разрабатывается локально:
Предварительные требования
Чтобы выполнить действия, описанные в этой статье, вам потребуется:
Организация Azure DevOps и проект Azure DevOps с Azure Repos репозиторием, созданным в организации. В проекте Azure DevOps должны быть роли администратора проекта, администратора сборки и администратора выпуска .
Активная подписка Azure с ролью владельца или другой ролью, которая включает возможности назначения ролей. Дополнительные сведения см. в статье Общие сведения о назначениях ролей Azure.
Базовое понимание системы управления версиями и синтаксиса шаблона ARM.
Подготовка решения
В примере в этой статье используется несколько шаблонов ARM и существующее приложение для обработки видео с открытым исходным кодом FFmpeg. Вы можете скопировать или скачать эти ресурсы и отправить их в репозиторий Azure Repos.
Важно!
В этом примере выполняется развертывание программного обеспечения Windows на узлах пакетной службы windows. Azure Pipelines, шаблоны ARM и пакетная служба также полностью поддерживают программное обеспечение и узлы Linux.
Общие сведения о шаблонах ARM
Три шаблона возможностей, аналогичные единицам или модулям, реализуют определенные компоненты функциональности. Затем комплексный шаблон решения развертывает базовые шаблоны возможностей. Эта структура связанного шаблона позволяет тестировать каждый шаблон возможностей по отдельности и повторно использовать их в разных решениях.
Подробные сведения о шаблонах см. в справочном руководстве по шаблонам Resource Manager для типов ресурсов Microsoft.Batch.
Шаблон учетной записи хранения
Сохраните следующий код в виде файла с именем storageAccount.json. Этот шаблон определяет учетную запись хранения Azure, которая необходима для развертывания приложения в учетной записи пакетной службы.
{
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"accountName": {
"type": "string",
"metadata": {
"description": "Name of the Azure Storage Account"
}
}
},
"variables": {},
"resources": [
{
"type": "Microsoft.Storage/storageAccounts",
"name": "[parameters('accountName')]",
"sku": {
"name": "Standard_LRS"
},
"apiVersion": "2018-02-01",
"location": "[resourceGroup().location]",
"properties": {}
}
],
"outputs": {
"blobEndpoint": {
"type": "string",
"value": "[reference(resourceId('Microsoft.Storage/storageAccounts', parameters('accountName'))).primaryEndpoints.blob]"
},
"resourceId": {
"type": "string",
"value": "[resourceId('Microsoft.Storage/storageAccounts', parameters('accountName'))]"
}
}
}
Шаблон учетной записи пакетной службы
Сохраните следующий код как файл с именем batchAccount.json. Этот шаблон определяет учетную запись пакетной службы. Учетная запись пакетной службы выступает в качестве платформы для запуска приложений в пулах узлов.
{
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"batchAccountName": {
"type": "string",
"metadata": {
"description": "Name of the Azure Batch Account"
}
},
"storageAccountId": {
"type": "string",
"metadata": {
"description": "ID of the Azure Storage Account"
}
}
},
"variables": {},
"resources": [
{
"name": "[parameters('batchAccountName')]",
"type": "Microsoft.Batch/batchAccounts",
"apiVersion": "2017-09-01",
"location": "[resourceGroup().location]",
"properties": {
"poolAllocationMode": "BatchService",
"autoStorage": {
"storageAccountId": "[parameters('storageAccountId')]"
}
}
}
],
"outputs": {}
}
Шаблон пула пакетной службы
Сохраните следующий код в виде файла с именем batchAccountPool.json. Этот шаблон создает пул узлов и узлы в учетной записи пакетной службы.
{
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"batchAccountName": {
"type": "string",
"metadata": {
"description": "Name of the Azure Batch Account"
}
},
"batchAccountPoolName": {
"type": "string",
"metadata": {
"description": "Name of the Azure Batch Account Pool"
}
}
},
"variables": {},
"resources": [
{
"name": "[concat(parameters('batchAccountName'),'/', parameters('batchAccountPoolName'))]",
"type": "Microsoft.Batch/batchAccounts/pools",
"apiVersion": "2017-09-01",
"properties": {
"deploymentConfiguration": {
"virtualMachineConfiguration": {
"imageReference": {
"publisher": "MicrosoftWindowsServer",
"offer": "WindowsServer",
"sku": "2022-datacenter",
"version": "latest"
},
"nodeAgentSkuId": "batch.node.windows amd64"
}
},
"vmSize": "Standard_D2s_v3"
}
}
],
"outputs": {}
}
Шаблон Orchestrator
Сохраните следующий код в виде файла с именем deployment.json. Этот последний шаблон выступает в качестве оркестратора для развертывания трех базовых шаблонов возможностей.
{
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"StorageContainerUri": {
"type": "string",
"metadata": {
"description": "URI of the Blob Storage Container containing the Azure Resource Manager templates"
}
},
"StorageContainerSasToken": {
"type": "string",
"metadata": {
"description": "The SAS token of the container containing the Azure Resource Manager templates"
}
},
"applicationStorageAccountName": {
"type": "string",
"metadata": {
"description": "Name of the Azure Storage Account"
}
},
"batchAccountName": {
"type": "string",
"metadata": {
"description": "Name of the Azure Batch Account"
}
},
"batchAccountPoolName": {
"type": "string",
"metadata": {
"description": "Name of the Azure Batch Account Pool"
}
}
},
"variables": {},
"resources": [
{
"apiVersion": "2017-05-10",
"name": "storageAccountDeployment",
"type": "Microsoft.Resources/deployments",
"properties": {
"mode": "Incremental",
"templateLink": {
"uri": "[concat(parameters('StorageContainerUri'), 'arm-templates/storageAccount.json', parameters('StorageContainerSasToken'))]",
"contentVersion": "1.0.0.0"
},
"parameters": {
"accountName": {"value": "[parameters('applicationStorageAccountName')]"}
}
}
},
{
"apiVersion": "2017-05-10",
"name": "batchAccountDeployment",
"type": "Microsoft.Resources/deployments",
"dependsOn": [
"storageAccountDeployment"
],
"properties": {
"mode": "Incremental",
"templateLink": {
"uri": "[concat(parameters('StorageContainerUri'), 'arm-templates/batchAccount.json', parameters('StorageContainerSasToken'))]",
"contentVersion": "1.0.0.0"
},
"parameters": {
"batchAccountName": {"value": "[parameters('batchAccountName')]"},
"storageAccountId": {"value": "[reference('storageAccountDeployment').outputs.resourceId.value]"}
}
}
},
{
"apiVersion": "2017-05-10",
"name": "poolDeployment",
"type": "Microsoft.Resources/deployments",
"dependsOn": [
"batchAccountDeployment"
],
"properties": {
"mode": "Incremental",
"templateLink": {
"uri": "[concat(parameters('StorageContainerUri'), 'arm-templates/batchAccountPool.json', parameters('StorageContainerSasToken'))]",
"contentVersion": "1.0.0.0"
},
"parameters": {
"batchAccountName": {"value": "[parameters('batchAccountName')]"},
"batchAccountPoolName": {"value": "[parameters('batchAccountPoolName')]"}
}
}
}
],
"outputs": {}
}
Настройка репозитория
Отправьте шаблоны ARM, приложение FFmpeg и файл определения сборки YAML в репозиторий Azure Repos.
Отправьте четыре шаблона ARM в папку arm-templates в репозитории.
Для пакета приложения скачайте и извлеките 64-разрядную версию Windows FFmpeg 4.3.1 и отправьте ее в папку hpc-application в репозитории.
Для определения сборки сохраните следующее определение в виде файла с именем hpc-app.build.yml и отправьте его в папку pipelines в репозитории.
# To publish an application into Batch, you need to # first zip the file, and then publish an artifact, so # you can take the necessary steps in your release pipeline. steps: # First, zip up the files required in the Batch account. # For this instance, those are the ffmpeg files. - task: ArchiveFiles@2 displayName: 'Archive applications' inputs: rootFolderOrFile: hpc-application includeRootFolder: false archiveFile: '$(Build.ArtifactStagingDirectory)/package/$(Build.BuildId).zip' # Publish the zip file, so you can use it as part # of your Release pipeline later. - task: PublishPipelineArtifact@0 inputs: artifactName: 'hpc-application' targetPath: '$(Build.ArtifactStagingDirectory)/package'
После завершения настройки репозитория структура папок должна содержать следующие main разделы:
- Папка arm-templates , содержащая шаблоны ARM.
- Папка hpc-application , содержащая ffmpeg.
- Папка pipelines , содержащая файл определения сборки YAML для конвейера сборки.
Примечание
В этом примере структуры базы кода показано, что можно хранить код приложения, инфраструктуры и конвейера в одном репозитории.
Создание конвейера Azure
После настройки репозитория исходного кода используйте Azure Pipelines для реализации конвейера сборки, тестирования и развертывания для приложения. На этом этапе конвейера обычно выполняются тесты для проверки кода и сборки частей программного обеспечения. Количество и типы тестов, а также другие выполняемые задачи зависят от общей стратегии сборки и выпуска.
Создание конвейера сборки
В этом разделе описано, как создать конвейер сборки YAML для работы с программным обеспечением ffmpeg, которое выполняется в учетной записи пакетной службы.
В проекте Azure DevOps выберите Конвейеры в области навигации слева, а затем выберите Новый конвейер.
На экране Где находится код выберите Azure Repos Git.
На экране Выбор репозитория выберите нужный репозиторий.
Примечание
Вы также можете создать конвейер сборки с помощью визуального конструктора. На странице Новый конвейер выберите Использовать классический редактор. Шаблон YAML можно использовать в визуальном конструкторе. Дополнительные сведения см. в статье Определение классического конвейера.
На экране Настройка конвейера выберите Существующий YAML-файл Azure Pipelines.
На экране Выберите существующий ФАЙЛ YAML выберите файл hpc-app.build.yml из репозитория и нажмите кнопку Продолжить.
На экране ПРОВЕРКА конвейера YAML проверьте конфигурацию сборки, а затем выберите Выполнить или выберите раскрывающийся курсор рядом с пунктом Выполнить и нажмите кнопку Сохранить. Этот шаблон обеспечивает непрерывную интеграцию, поэтому сборка автоматически активируется, когда новая фиксация в репозитории соответствует условиям, заданным в сборке.
Вы можете просматривать динамические обновления хода выполнения сборки. Чтобы просмотреть результаты сборки, выберите соответствующий запуск в определении сборки в Azure Pipelines.
Примечание
Если вы используете клиентское приложение для запуска решения HPC, необходимо создать отдельное определение сборки для этого приложения. Инструкции см. в документации по Azure Pipelines .
Создание конвейера выпуска
Для развертывания приложения и базовой инфраструктуры используется конвейер выпуска Azure Pipelines. Конвейеры выпуска позволяют использовать CD и автоматизировать процесс выпуска. Развертывание приложения и базовой инфраструктуры выполняется несколькими шагами.
Связанные шаблоны для этого решения должны быть доступны из общедоступной конечной точки HTTP или HTTPS. Эта конечная точка может быть репозиторием GitHub, учетной записью Хранилище BLOB-объектов Azure или другим местом хранения. Чтобы обеспечить безопасность отправленных артефактов шаблона, храните их в закрытом режиме, но доступ к ним можно получить с помощью маркера подписанного URL-адреса (SAS).
В следующем примере показано, как развернуть инфраструктуру и приложение с помощью шаблонов из большого двоичного объекта службы хранилища Azure.
Настройка конвейера
В проекте Azure DevOps выберитеPipelines Releases (Выпуски конвейеров>) в области навигации слева.
На следующем экране выберите Создать>новый конвейер выпуска.
На экране Выбор шаблона выберите Пустое задание, а затем закройте экран Этап .
Выберите Новый конвейер выпуска в верхней части страницы и переименуйте конвейер на что-то подходящее для конвейера, например Развертывание пакетная служба Azure + пул.
В разделе Артефакты выберите Добавить.
На экране Добавление артефакта выберите Сборка , а затем выберите конвейер сборки, чтобы получить выходные данные для приложения HPC.
Примечание
Вы можете создать псевдоним источника или принять значение по умолчанию. Запишите значение псевдонима источника , так как оно необходимо для создания задач в определении выпуска.
Выберите Добавить.
На странице конвейера выберите Добавить рядом с элементом Артефакты, чтобы создать ссылку на другой артефакт, Azure Repos репозиторий. Эта ссылка необходима для доступа к шаблонам ARM в репозитории. Шаблоны ARM не нуждаются в компиляции, поэтому их не нужно отправлять через конвейер сборки.
Примечание
Еще раз обратите внимание на значение Псевдоним источника , которое будет использоваться позже.
Перейдите на вкладку Переменные . Создайте следующие переменные в конвейере, чтобы вам не нужно было повторно ввести одну и ту же информацию в несколько задач.
Имя Значение applicationStorageAccountName Имя учетной записи хранения для двоичных файлов приложения HPC. batchAccountApplicationName Имя приложения в учетной записи пакетной службы. batchAccountName Имя учетной записи пакетной службы. batchAccountPoolName Имя пула виртуальных машин для выполнения обработки. batchApplicationId Уникальный идентификатор приложения пакетной службы в формате : /subscriptions/<subscriptionId>/resourceGroups/<resourceGroupName>^
/providers/Microsoft.Batch/batchAccounts/<batchAccountName>^
/applications/<batchAccountApplicationName>
.
Замените<subscriptionId>
заполнитель идентификатором подписки Azure, а остальные заполнители значениями, заданными для других переменных в этом списке.batchApplicationVersion Семантическая версия приложения пакетной службы, в данном случае 4.3.1. расположение Регион Azure для развертываемых ресурсов. resourceGroupName Имя группы ресурсов для развертывания ресурсов. storageAccountName Имя учетной записи хранения для хранения связанных шаблонов ARM. StorageContainerSasToken $(<referenceName>.StorageContainerSasToken)
. Замените<referenceName
заполнитель значением Имени ссылки , которое вы настроите в разделе Выходные переменные на следующем шаге Копирования файлов Azure .StorageContainerUri $(<referenceName>.StorageContainerUri)
. Замените<referenceName>
заполнитель значением Имя ссылки , которое вы настроите в разделе Выходные переменные шага Копирование файлов Azure.Перейдите на вкладку Задачи , а затем выберите Задание агента.
На экране Задание агента в разделе Пул агентов выберите Azure Pipelines.
В разделе Спецификация агента выберите windows-latest.
Добавление задач
Создайте шесть задач, чтобы:
- Скачайте zip-файлы FFMPEG.
- Разверните учетную запись хранения для размещения вложенных шаблонов ARM.
- Скопируйте шаблоны ARM в учетную запись хранения.
- Разверните учетную запись пакетной службы и необходимые зависимости.
- Создайте приложение в учетной записи пакетной службы.
- Отправьте пакет приложения в учетную запись пакетной службы.
Для каждой новой задачи, указанной в следующих шагах:
+ Щелкните символ рядом с полем Задание агента в левой области.
Найдите и выберите указанную задачу в области справа.
Добавьте или выберите свойства для настройки задачи.
Выберите Добавить.
Создайте задачи следующим образом:
Выберите задачу Download Pipeline Artifacts (Скачать артефакты конвейера ) и задайте следующие свойства:
- Отображаемое имя: введите Download ApplicationPackage to Agent.
- Имя артефакта: введите hpc-application.
-
Целевой каталог: введите
$(System.DefaultWorkingDirectory)
.
Создайте учетную запись хранения Azure для хранения шаблонов ARM. Можно использовать существующую учетную запись хранения, но для поддержки этого автономного примера и изоляции содержимого создайте выделенную учетную запись хранения.
Выберите задачу Развертывание шаблона ARM: группа ресурсов область и задайте следующие свойства:
- Отображаемое имя: Введите Развертывание учетной записи хранения для шаблонов ARM.
- Подключение Resource Manager Azure. Выберите соответствующую подписку Azure.
- Подписки: Выберите соответствующую подписку Azure.
- Действие. Выберите Создать или обновить группу ресурсов.
-
Группа ресурсов: введите
$(resourceGroupName)
. -
Расположение: введите
$(location)
. -
Шаблон: введите
$(System.ArtifactsDirectory)/<AzureRepoArtifactSourceAlias>/arm-templates/storageAccount.json
. Замените<AzureRepoArtifactSourceAlias>
заполнитель псевдонимом источника репозитория, который вы записали ранее. -
Переопределить параметры шаблона: введите
-accountName $(storageAccountName)
.
Отправьте артефакты из системы управления версиями в учетную запись хранения. Часть этой задачи копирования файлов Azure выводит URI контейнера учетной записи хранения и маркер SAS в переменную, чтобы их можно было использовать повторно на последующих шагах.
Выберите задачу "Копирование файлов Azure" и задайте следующие свойства:
- Отображаемое имя: Введите AzureBlob File Copy (Копирование файла AzureBlob).
-
Источник: Введите
$(System.ArtifactsDirectory)/<AzureRepoArtifactSourceAlias>/arm-templates/
. Замените<AzureRepoArtifactSourceAlias>
заполнитель псевдонимом источника репозитория, который вы записали ранее. - Подписка Azure: Выберите соответствующую подписку Azure.
- Тип назначения: выберите Большой двоичный объект Azure.
-
Учетная запись хранения RM: введите
$(storageAccountName)
. - Имя контейнера: введите шаблоны.
- Имя ссылки: разверните узел Выходные переменные, а затем введите ffmpeg.
Примечание
Если этот шаг завершается неудачно, убедитесь, что ваша организация Azure DevOps имеет роль участник BLOB-объектов хранилища в учетной записи хранения.
Разверните шаблон ARM оркестратора, чтобы создать учетную запись и пул пакетной службы. Этот шаблон включает параметры для URI контейнера учетной записи хранения и маркера SAS. Переменные, необходимые в шаблоне ARM, хранятся в разделе переменных определения выпуска и задаются из задачи копирования файлов AzureBlob.
Выберите задачу Развертывание шаблона ARM: группа ресурсов область и задайте следующие свойства:
- Отображаемое имя: Введите Развернуть пакетная служба Azure.
- Подключение Resource Manager Azure. Выберите соответствующую подписку Azure.
- Подписки: Выберите соответствующую подписку Azure.
- Действие. Выберите Создать или обновить группу ресурсов.
-
Группа ресурсов: введите
$(resourceGroupName)
. -
Расположение: введите
$(location)
. - Расположение шаблона: выберите URL-адрес файла.
-
Ссылка на шаблон: Введите
$(StorageContainerUri)arm-templates/deployment.json$(StorageContainerSasToken)
. -
Переопределить параметры шаблона: введите
-StorageContainerUri $(StorageContainerUri) -StorageContainerSasToken $(StorageContainerSasToken) -applicationStorageAccountName $(applicationStorageAccountName) -batchAccountName $(batchAccountName) -batchAccountPoolName $(batchAccountPoolName)
.
Распространенной практикой является использование задач Azure Key Vault. Если субъект-служба, подключенный к подписке Azure, имеет соответствующую политику доступа, он может скачивать секреты из Key Vault и использовать в качестве переменной в конвейере. Имя секрета задается со связанным значением. Например, можно ссылаться на секрет sshPassword с $(sshPassword) в определении выпуска.
Вызовите Azure CLI, чтобы создать приложение в пакетная служба Azure.
Выберите задачу Azure CLI и задайте следующие свойства:
- Отображаемое имя: Введите Create application in пакетная служба Azure account (Создать приложение в учетной записи пакетная служба Azure).
- Подключение Resource Manager Azure. Выберите соответствующую подписку Azure.
- Тип скрипта: выберите PowerShell Core.
- Расположение скрипта: выберите Встроенный скрипт.
-
Встроенный скрипт: введите
az batch application create --application-name $(batchAccountApplicationName) --name $(batchAccountName) --resource-group $(resourceGroupName)
.
Вызовите Azure CLI, чтобы отправить связанные пакеты в приложение, в данном случае файлы ffmpeg.
Выберите задачу Azure CLI и задайте следующие свойства:
- Отображаемое имя: Введите Отправить пакет в учетную запись пакетная служба Azure.
- Подключение Resource Manager Azure. Выберите соответствующую подписку Azure.
- Тип скрипта: выберите PowerShell Core.
- Расположение скрипта: выберите Встроенный скрипт.
-
Встроенный скрипт: введите
az batch application package create --application-name $(batchAccountApplicationName) --name $(batchAccountName) --resource-group $(resourceGroupName) --version $(batchApplicationVersion) --package-file=$(System.DefaultWorkingDirectory)/$(Release.Artifacts.<AzureBuildArtifactSourceAlias>.BuildId).zip
. Замените<AzureBuildArtifactSourceAlias>
заполнитель псевдонимом источника сборки, который вы записали ранее.
Примечание
Номер версии пакета приложения присваивается переменной. Переменная позволяет перезаписывать предыдущие версии пакета и вручную управлять версией пакета, отправленной в пакетная служба Azure.
Создание и запуск выпуска
Завершив создание всех шагов, выберите Сохранить в верхней части страницы конвейера, а затем нажмите кнопку ОК.
Выберите Создать выпуск в верхней части страницы.
Чтобы просмотреть состояние выпуска в реальном времени, щелкните ссылку в верхней части страницы с сообщением о том, что выпуск создан.
Чтобы просмотреть выходные данные журнала агента, наведите указатель мыши на этап и нажмите кнопку Журналы .
Тестирование среды
После настройки среды убедитесь, что следующие тесты успешно выполняются. Замените заполнители значениями группы ресурсов и учетной записи пакетной службы.
Подключение к учетной записи пакетной службы
Подключитесь к новой учетной записи пакетной службы с помощью Azure CLI из командной строки.
- Войдите в свою учетную запись Azure с помощью команды
az login
и следуйте инструкциям по проверке подлинности. - Проверка подлинности учетной записи пакетной службы с помощью
az batch account login -g <resourceGroup> -n <batchAccount>
.
Получение списка доступных приложений
az batch application list -g <resourceGroup> -n <batchAccount>
Убедитесь, что пул действителен
az batch pool list
В выходных данных команды обратите внимание на значение , currentDedicatedNodes
которое необходимо настроить в следующем тесте.
Изменение размера пула
Выполните следующую команду, чтобы изменить размер пула, чтобы существовали вычислительные узлы, доступные для тестирования заданий и задач. Замените <poolName>
заполнитель значением имени пула <targetNumber>
, а заполнитель — числом, которое больше, чем currentDedicatedNodes
в выходных данных предыдущей команды. Проверьте состояние, выполняя az batch pool list
команду, пока изменение размера не завершится и не отобразится целевое количество узлов.
az batch pool resize --pool-id <poolname> --target-dedicated-nodes <target number>
Дальнейшие действия
Сведения о взаимодействии с учетной записью пакетной службы с помощью простого приложения см. в следующих учебниках.