Integrar modelos do Resource Manager com Azure Pipelines

Você pode integrar modelos do Azure Resource Manager (modelos ARM) com o Azure Pipelines para integração contínua e implantação contínua (CI/CD). Neste artigo, você aprende duas maneiras mais avançadas de implantar modelos com o Azure Pipelines.

Selecionar sua opção

Antes de prosseguir com este artigo, vamos considerar as diferentes opções para implantar um modelo do ARM de um pipeline.

  • Usar uma tarefa de implantação de modelo do ARM. Essa opção é a mais fácil. Essa abordagem funciona quando você deseja implantar um modelo diretamente de um repositório. Essa opção não é abordada neste artigo. Em vez disso, é abordada no tutorial Integração contínua de modelos do ARM com Azure Pipelines. Ele mostra como usar a tarefa de implantação de modelo do ARM para implantar um modelo do seu repositório GitHub.

  • Adicionar tarefa que executa um script do Azure PowerShell. Essa opção tem a vantagem de fornecer consistência em todo o ciclo de vida de desenvolvimento, pois você pode usar o mesmo script que usou ao executar testes locais. O script implanta o modelo, mas também pode executar outras operações, como obter valores para usar como parâmetros. Essa opção é mostrada neste artigo. Consulte Tarefa do Azure PowerShell.

    O Visual Studio fornece o Projeto do grupo de recursos do Azure que inclui um script do PowerShell. O script prepara os artefatos do seu projeto para uma conta de armazenamento que o Gerenciador de Recursos pode acessar. Os artefatos são itens em seu projeto, como modelos vinculados, scripts e binários de aplicativos. Se você quiser continuar usando o script do projeto, use a tarefa Script do PowerShell mostrada neste artigo.

  • Adicionar tarefas para copiar e implantar tarefas. Essa opção oferece uma alternativa conveniente para o script do projeto. Você configura duas tarefas no pipeline. Uma tarefa prepara os artefatos para um local acessível. A outra implanta o modelo desse local. Essa opção é mostrada neste artigo. Consulte Copiar e implantar tarefas.

Preparar seu projeto

Este artigo pressupõe que o modelo do ARM e a organização do Azure DevOps estão prontos para criar o pipeline. As etapas a seguir mostram como se certificar de que você está pronto:

  • Você tem uma organização do Azure DevOps. Caso não tenha uma, crie uma gratuitamente. Se sua equipe já tiver uma organização do Azure DevOps, verifique se você é um administrador do projeto do Azure DevOps que deseja usar.

  • Você configurou uma conexão de serviço para sua assinatura do Azure. As tarefas no pipeline são executadas sob a identidade da entidade de serviço. Para obter as etapas para criar a conexão, consulte Criar um projeto DevOps.

  • Você tem um modelo do ARM que define a infraestrutura para seu projeto.

Criar um pipeline

  1. Se você ainda não adicionou um pipeline anteriormente, precisará criar um novo pipeline. Na organização do Azure DevOps, selecione Pipelines e Novo pipeline.

    Captura de tela do botão Adicionar novo pipeline

  2. Especifique o local em que seu código está armazenado. A imagem a seguir mostra a seleção do Azure Repos Git.

    Captura de tela da seleção da fonte de código no Azure DevOps

  3. Nessa fonte, selecione o repositório que tem o código para seu projeto.

    Captura de tela da seleção do repositório para o projeto no Azure DevOps

  4. Selecione o tipo de pipeline a ser criado. Você pode selecionar Pipeline inicial.

    Captura de tela da seleção do tipo de pipeline a ser criado no Azure DevOps

Você está pronto para adicionar uma tarefa do Azure PowerShell ou copiar arquivo e implantar tarefas.

Tarefa do Azure PowerShell

Esta seção mostra como configurar a implantação contínua usando uma única tarefa que executa o script do PowerShell em seu projeto. Se você precisar de um script do PowerShell que implanta um modelo, consulte Deploy-AzTemplate.ps1 ou Deploy-AzureResourceGroup.ps1.

O seguinte arquivo YAML cria uma Tarefa do 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'

Quando você define a tarefa como AzurePowerShell@5, o pipeline usa o módulo Az. Se você estiver usando o módulo AzureRM em seu script, defina a tarefa como AzurePowerShell@3.

steps:
- task: AzurePowerShell@3

Para azureSubscription, forneça o nome da conexão de serviço que você criou.

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

Para scriptPath, forneça o caminho relativo do arquivo de pipeline para o script. Você pode procurar em seu repositório para ver o caminho.

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

Em ScriptArguments, forneça todos os parâmetros necessários para o script. O exemplo a seguir mostra alguns parâmetros para um script, mas você precisará personalizar os parâmetros para o script.

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

Quando você seleciona Salvar, o pipeline de build é executado automaticamente. Volte para o resumo do pipeline de build e veja o status.

Captura de tela da exibição de resultados do pipeline no Azure DevOps

Você pode selecionar o pipeline em execução no momento para ver detalhes sobre as tarefas. Quando ele for concluído, você verá os resultados de cada etapa.

Copiar e implantar tarefas

Esta seção mostra como configurar implantação contínua usando duas tarefas. A primeira tarefa prepara os artefatos para uma conta de armazenamento e a segunda, implanta o modelo.

Para copiar arquivos para uma conta de armazenamento, a entidade de serviço para a conexão de serviço deve ser atribuída à função de proprietário de dados de blob de armazenamento ou de dados de blob de armazenamento. Para obter mais informações, consulte Introdução ao AzCopy.

O YAML a seguir mostra a tarefa de cópia de arquivo do 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

Há várias partes dessa tarefa a serem revisadas para o seu ambiente. O SourcePath indica o local dos artefatos em relação ao arquivo de pipeline.

SourcePath: '<path-to-artifacts>'

Para azureSubscription, forneça o nome da conexão de serviço que você criou.

azureSubscription: '<your-connection-name>'

Para o armazenamento e o nome do contêiner, forneça os nomes da conta de armazenamento e do contêiner que você deseja usar para armazenar os artefatos. A conta de armazenamento deve existir.

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

Depois de criar a tarefa de cópia de arquivo, você estará pronto para adicionar a tarefa para implantar o modelo preparado.

O YAML a seguir mostra a tarefa de implantação de modelo do 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'

Há várias partes dessa tarefa a serem examinadas com mais detalhes.

  • deploymentScope: Selecione o escopo de implantação nas opções: Management Group, Subscription, e Resource Group. Para saber mais sobre os escopos, confira Escopos de implantação.

  • azureResourceManagerConnection: Forneça o nome da conexão de serviço que você criou.

  • subscriptionId: Forneça a ID da assinatura de destino. Essa propriedade só se aplica ao escopo de implantação do grupo de recursos e ao escopo de implantação da assinatura.

  • resourceGroupName e location : forneça o nome e o local do grupo de recursos no qual você deseja implantar. A tarefa cria o grupo de recursos, caso ele não exista.

    resourceGroupName: '<resource-group-name>'
    location: '<location>'
    
  • csmFileLink: Forneça o link para o modelo de preparo. Ao definir o valor, use variáveis retornadas da tarefa de cópia de arquivo. O exemplo a seguir contém links para um modelo chamado mainTemplate.json. A pasta denominada modelos está incluída porque a tarefa de cópia de arquivo copiou o arquivo. Em seu pipeline, forneça o caminho para o modelo e o nome do seu modelo.

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

Sua pipeline tem essa aparência:

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'

Quando você seleciona Salvar, o pipeline de build é executado automaticamente. No quadro Trabalhos, selecione Trabalho para ver o status do trabalho.

Próximas etapas