Интеграция шаблонов Resource Manager с Azure Pipelines

Вы можете интегрировать шаблоны Azure Resource Manager (шаблоны ARM) с Azure Pipelines, чтобы обеспечить непрерывную интеграцию и непрерывное развертывание (CI/CD). В этой статье вы узнаете о двух более усовершенствованных способах развертывания шаблонов с помощью Azure Pipelines.

Выбор способа

Прежде чем продолжить работу с этой статьей, рассмотрим различные варианты развертывания шаблона ARM из конвейера.

  • Использование задачи развертывания шаблона ARM. Этот вариант — самый простой. Этот способ подходит, если вы хотите развернуть шаблон непосредственно из репозитория. Данный способ не рассматривается в этой статье, а описывается в учебнике по непрерывной интеграции шаблонов ARM с Azure Pipelines. В нем показано, как использовать задачу развертывания шаблона ARM для развертывания шаблона из репозитория GitHub.

  • Добавление задачи, запускающей сценарий Azure PowerShell. Этот вариант обеспечивает согласованность в течение всего жизненного цикла разработки, так как позволяет использовать тот же сценарий, который использовался при выполнении локальных тестов. Сценарий развертывает шаблон, но также может выполнять другие операции, такие как получение значений, которые можно использовать в качестве параметров. Этот способ описан в данной статье. Ознакомьтесь с задачей Azure PowerShell.

    Visual Studio предоставляет проект группы ресурсов Azure, включающий в себя сценарий PowerShell. Этот сценарий подготавливает артефакты из проекта и помещает их в учетную запись хранения, к которой имеет доступ Resource Manager. Артефакты — это элементы проекта, в том числе связанные шаблоны, сценарии и двоичные файлы приложения. Если вы хотите продолжить использовать сценарий из проекта, используйте задачу сценария PowerShell, описанную в этой статье.

  • Добавление задач для копирования и развертывания. Этот вариант является удобной альтернативой сценария проекта. В конвейере настраиваются две задачи. Одна задача подготавливает артефакты и помещает их в доступное расположение. Другая задача развертывает шаблон из этого расположения. Этот способ описан в данной статье. Ознакомьтесь с задачами копирования и развертывания.

Подготовка проекта

В этой статье предполагается, что ваш шаблон ARM и организация Azure DevOps готовы к созданию конвейера. Ниже показано, как обеспечить готовность к работе.

  • У вас должна быть организация Azure DevOps. Если у вас ее нет, создайте подписку бесплатно. Если у вашей команды уже есть организация Azure DevOps, убедитесь, что вы являетесь администратором проекта Azure DevOps, который вы хотите использовать.

  • Необходимо настроить подключение службы к подписке Azure. Задачи в конвейере выполняются с удостоверением субъекта-службы. Инструкции по созданию подключения см. в разделе Создание проекта DevOps.

  • У вас должен быть шаблон ARM, определяющий инфраструктуру для проекта.

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

  1. Если вы еще не добавили конвейер, необходимо создать новый конвейер. В организации Azure DevOps выберите Конвейеры и Новый конвейер.

    Снимок экрана: кнопка

  2. Укажите место хранения кода. На следующем рисунке показан выбор Azure Repos Git.

    Снимок экрана: выбор источника кода в Azure DevOps

  3. В этом источнике выберите репозиторий с кодом для проекта.

    Снимок экрана: выбор репозитория для проекта в Azure DevOps

  4. Выберите тип создаваемого конвейера. Можно выбрать Простейший конвейер.

    Снимок экрана: выбор типа конвейера для создания в Azure DevOps

Теперь все готово для добавления задачи Azure PowerShell или задач копирования файлов и развертывания.

Задача Azure PowerShell

В этом разделе показано, как настроить непрерывное развертывание с помощью одной задачи, запускающей сценарий PowerShell в проекте. Если вам нужен сценарий PowerShell, который развертывает шаблон, ознакомьтесь с файлом Deploy-AzTemplate.ps1 или Deploy-AzureResourceGroup.ps1.

Приведенный ниже YAML-файл создает задачу Azure PowerShell.

trigger:
- master

pool:
  vmImage: 'ubuntu-latest'

steps:
- task: AzurePowerShell@5
  inputs:
    azureSubscription: 'script-connection'
    ScriptType: 'FilePath'
    ScriptPath: './Deploy-AzTemplate.ps1'
    ScriptArguments: -Location 'centralus' -ResourceGroupName 'demogroup' -TemplateFile templates\mainTemplate.json
    azurePowerShellVersion: 'LatestVersion'

Если для задачи задано значение AzurePowerShell@5, конвейер использует модуль Az. Если вы используете модуль AzureRM в сценарии, задайте для задачи значение AzurePowerShell@3.

steps:
- task: AzurePowerShell@3

Для параметра azureSubscription укажите имя созданного подключения к службе.

inputs:
    azureSubscription: '<your-connection-name>'

Для параметра scriptPath укажите путь к сценарию относительно файла конвейера. Чтобы увидеть этот путь, можно просмотреть репозиторий.

ScriptPath: '<your-relative-path>/<script-file-name>.ps1'

В разделе ScriptArguments добавьте любые параметры, необходимые для сценария. В следующем примере показаны некоторые параметры сценария, но вам необходимо настроить параметры именно для вашего сценария.

ScriptArguments: -Location 'centralus' -ResourceGroupName 'demogroup' -TemplateFile templates\mainTemplate.json

После нажатия кнопки Сохранить конвейер сборки запустится автоматически. Вернитесь к сводке по конвейеру сборки и просмотрите его состояние.

Снимок экрана: представление результатов конвейера в Azure DevOps

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

Задачи копирования и развертывания

В этом разделе показано, как настроить непрерывное развертывание с помощью двух задач. Первая задача подготавливает артефакты и перемещает их в учетную запись хранения, а вторая выполняет развертывание шаблона.

Чтобы скопировать файлы в учетную запись хранения, субъекту-службе для подключения к службе должна быть назначена роль участника данных BLOB-объекта хранилища или владельца данных BLOB-объекта хранилища. Дополнительные сведения см. в статье Начало работы с AzCopy.

В следующем фрагменте YAML показана задача копирования файлов Azure.

trigger:
- master

pool:
  vmImage: 'windows-latest'

steps:
- task: AzureFileCopy@4
  inputs:
    SourcePath: 'templates'
    azureSubscription: 'copy-connection'
    Destination: 'AzureBlob'
    storage: 'demostorage'
    ContainerName: 'projecttemplates'
  name: AzureFileCopy

Несколько частей этой задачи следует изменить в соответствии с вашей средой. Параметр SourcePath указывает расположение артефактов относительно файла конвейера.

SourcePath: '<path-to-artifacts>'

Для параметра azureSubscription укажите имя созданного подключения к службе.

azureSubscription: '<your-connection-name>'

В качестве имен хранилища и контейнера укажите имена учетной записи хранения и контейнера, которые будут использоваться для хранения артефактов. Эта учетная запись хранения должна существовать.

storage: '<your-storage-account-name>'
ContainerName: '<container-name>'

После создания задачи копирования файлов можно приступить к добавлению задачи для развертывания подготовленного шаблона.

В следующем фрагменте YAML показана задача развертывания шаблона Azure Resource Manager.

- task: AzureResourceManagerTemplateDeployment@3
  inputs:
    deploymentScope: 'Resource Group'
    azureResourceManagerConnection: 'copy-connection'
    subscriptionId: 'aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e'
    action: 'Create Or Update Resource Group'
    resourceGroupName: 'demogroup'
    location: 'West US'
    templateLocation: 'URL of the file'
    csmFileLink: '$(AzureFileCopy.StorageContainerUri)templates/mainTemplate.json$(AzureFileCopy.StorageContainerSasToken)'
    csmParametersFileLink: '$(AzureFileCopy.StorageContainerUri)templates/mainTemplate.parameters.json$(AzureFileCopy.StorageContainerSasToken)'
    deploymentMode: 'Incremental'
    deploymentName: 'deploy1'

Следует подробнее рассмотреть несколько частей этой задачи.

  • deploymentScope: выберите область развертывания из этих вариантов: Management Group, Subscription и Resource Group. Дополнительные сведения об областях см. в разделе Области развертывания.

  • azureResourceManagerConnection: укажите имя созданного подключения к службе.

  • subscriptionId: укажите идентификатор целевой подписки. Это свойство применяется, только если в качестве области развертывания выбрана группа ресурсов или подписка.

  • resourceGroupName и location: укажите имя и расположение группы ресурсов, в которую требуется выполнить развертывание. Задача создаст группу ресурсов, если она еще не существует.

    resourceGroupName: '<resource-group-name>'
    location: '<location>'
    
  • csmFileLink: укажите ссылку на подготовленный шаблон. При задании этого значения используйте переменные, возвращаемые задачей копирования файлов. В следующем примере создается ссылка на шаблон mainTemplate.json. Папка templates включается в область действия, так как задача копирования файлов скопировала файл именно в нее. В конвейере укажите путь к шаблону и имя шаблона.

    csmFileLink: '$(AzureFileCopy.StorageContainerUri)templates/mainTemplate.json$(AzureFileCopy.StorageContainerSasToken)'
    

Конвейер будет выглядеть следующим образом:

trigger:
- master

pool:
  vmImage: 'windows-latest'

steps:
- task: AzureFileCopy@4
  inputs:
    SourcePath: 'templates'
    azureSubscription: 'copy-connection'
    Destination: 'AzureBlob'
    storage: 'demostorage'
    ContainerName: 'projecttemplates'
  name: AzureFileCopy
- task: AzureResourceManagerTemplateDeployment@3
  inputs:
    deploymentScope: 'Resource Group'
    azureResourceManagerConnection: 'copy-connection'
    subscriptionId: 'aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e'
    action: 'Create Or Update Resource Group'
    resourceGroupName: 'demogroup'
    location: 'West US'
    templateLocation: 'URL of the file'
    csmFileLink: '$(AzureFileCopy.StorageContainerUri)templates/mainTemplate.json$(AzureFileCopy.StorageContainerSasToken)'
    csmParametersFileLink: '$(AzureFileCopy.StorageContainerUri)templates/mainTemplate.parameters.json$(AzureFileCopy.StorageContainerSasToken)'
    deploymentMode: 'Incremental'
    deploymentName: 'deploy1'

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

Следующие шаги