Implantar no Serviço de Aplicativo usando o Azure Pipelines

Azure DevOps Services | Azure DevOps Server 2020 | Azure DevOps Server 2019

Use o Azure Pipelines para implantar automaticamente o seu aplicativo Web no Serviço de Aplicativo do Azure em cada build bem-sucedido. O Azure Pipelines permite criar, testar e implantar com CI (integração contínua) e CD (entrega contínua) usando o Azure DevOps.

Os pipelines do YAML são definidos usando um arquivo YAML em seu repositório. Uma etapa é o menor bloco de construção de um pipeline e pode ser um script ou tarefa (script pré-empacotado). Saiba mais sobre os principais conceitos e componentes que compõem um pipeline.

Você usará a tarefa do Aplicativo Web do Azure (AzureWebApp) para implantação no Serviço de Aplicativo do Azure no pipeline. Para cenários mais complicados, como a necessidade de usar parâmetros XML na implantação, use a tarefa de implantação do Serviço de Aplicativo do Azure (AzureRmWebAppDeployment).

Pré-requisitos

1. Criar um pipeline para a pilha

Os exemplos de código nesta seção pressupõem que você está implantando um aplicativo Web ASP.NET. Você pode adaptar as instruções para outras estruturas.

Saiba mais sobre o suporte ao ecossistema do Azure Pipelines.

  1. Entre na sua organização do Azure DevOps e navegue até seu projeto.

  2. Acesse Pipelines e selecione Novo pipeline.

  3. Quando solicitado, selecione o local do código-fonte: Azure Repos Git ou GitHub.

    Você pode ser redirecionado para o GitHub para então entrar. Nesse caso, insira suas credenciais do GitHub.

  4. Quando a lista de repositórios for exibida, selecione o repositório.

  5. Você poderá ser redirecionado ao GitHub para instalar o aplicativo do Azure Pipelines. Se sim, selecione Aprovar e instalar.

  6. Na guia Configurar, selecione ASP.NET Core.

  7. Quando o novo pipeline for exibido, observe o YAML para ver o que ele faz. Ao final, selecione Salvar e executar.

2. Adicionar a tarefa de implantação

  1. Clique no final do arquivo YAML e selecione Mostrar assistente.

  2. Use o assistente de tarefa para adicionar a tarefa do aplicativo Web do Azure.

    Screenshot of Azure web app task.

    Como alternativa, você pode adicionar a tarefa de implantação do Serviço de Aplicativo do Azure (AzureRmWebAppDeployment).

  3. Escolha sua assinatura do Azure. Não se esqueça de Autorizar a sua conexão. A autorização criará a conexão de serviço necessária.

  4. Selecione o Tipo de aplicativo, o Nome do aplicativo e a Pilha de runtime com base no aplicativo do Serviço de Aplicativo. O YAML completo será semelhante ao código a seguir.

    variables:
      buildConfiguration: 'Release'
    
    steps:
    - script: dotnet build --configuration $(buildConfiguration)
      displayName: 'dotnet build $(buildConfiguration)'
    - task: DotNetCoreCLI@2
      inputs:
        command: 'publish'
        publishWebProjects: true
    - task: AzureWebApp@1
      inputs:
        azureSubscription: '<service-connection-name>'
        appType: 'webAppLinux'
        appName: '<app-name>'
        package: '$(System.DefaultWorkingDirectory)/**/*.zip'
    
    • azureSubscription: nome da conexão de serviço autorizada com a sua assinatura do Azure.
    • appName: nome do aplicativo existente.
    • package: caminho de arquivo para o pacote ou uma pasta que traz o conteúdo do serviço de aplicativo. Há suporte para caracteres curinga.

Exemplo: implantar um aplicativo .NET

Para implantar um pacote da Web .zip (por exemplo, de um aplicativo Web ASP.NET) em um Aplicativo Web do Azure, use o snippet a seguir para implantar o build em um aplicativo.

variables:
  buildConfiguration: 'Release'

steps:
- script: dotnet build --configuration $(buildConfiguration)
  displayName: 'dotnet build $(buildConfiguration)'
- task: DotNetCoreCLI@2
  inputs:
    command: 'publish'
    publishWebProjects: true
- task: AzureWebApp@1
  inputs:
    azureSubscription: '<service-connection-name>'
    appType: 'webAppLinux'
    appName: '<app-name>'
    package: '$(System.DefaultWorkingDirectory)/**/*.zip'
  • azureSubscription: sua assinatura do Azure.
  • appType: o tipo de aplicativo Web.
  • appName: o nome do serviço de aplicativo existente.
  • package: o caminho do arquivo para o pacote ou uma pasta que contém o conteúdo do serviço de aplicativo. Há suporte para caracteres curinga.

Exemplo: implantação em um aplicativo virtual

Por padrão, sua implantação ocorre com o aplicativo raiz no Aplicativo Web do Azure. Você pode fazer a implantação em um aplicativo virtual específico usando a propriedade VirtualApplication da tarefa de implantação do Serviço de Aplicativo do Azure (AzureRmWebAppDeployment):

- task: AzureRmWebAppDeployment@4
  inputs:
    VirtualApplication: '<name of virtual application>'

Exemplo: implantação em um slot

O exemplo a seguir mostra como implantar em um slot de preparo e, em seguida, alternar para um slot de produção:

- task: AzureWebApp@1
  inputs:
    azureSubscription: '<service-connection-name>'
    appType: webAppLinux
    appName: '<app-name>'
    deployToSlotOrASE: true
    resourceGroupName: '<name of resource group>'
    slotName: staging
    package: '$(Build.ArtifactStagingDirectory)/**/*.zip'

- task: AzureAppServiceManage@0
  inputs:
    azureSubscription: '<service-connection-name>'
    appType: webAppLinux
    WebAppName: '<app-name>'
    ResourceGroupName: '<name of resource group>'
    SourceSlot: staging
    SwapWithProduction: true
  • azureSubscription: sua assinatura do Azure.
  • appType: (opcional) Use webAppLinux para implantar em um aplicativo Web no Linux.
  • appName: o nome do serviço de aplicativo existente.
  • deployToSlotOrASE: booliano. Implantar em um slot de implantação existente ou no Ambiente do Serviço de Aplicativo do Azure.
  • resourceGroupName: nome do grupo de recursos. Necessário se deployToSlotOrASE for usado.
  • slotName: Nome do slot, padrão para production. Necessário se deployToSlotOrASE for usado.
  • package: o caminho do arquivo para o pacote ou uma pasta que contém o conteúdo do serviço de aplicativo. Há suporte para caracteres curinga.
  • SourceSlot: slot enviado para produção quando SwapWithProduction for verdadeiro.
  • SwapWithProduction: booliano. Troque o tráfego do slot de origem pela produção.

Exemplo: implantação em vários aplicativos Web

Você pode usar trabalhos no seu arquivo YAML para configurar um pipeline de implantações. Usando trabalhos, você pode controlar a ordem de implantação em vários aplicativos Web.

jobs:
- job: buildandtest
  pool:
    vmImage: ubuntu-latest
 
  steps:
  # publish an artifact called drop
  - task: PublishPipelineArtifact@1
    inputs:
      targetPath: '$(Build.ArtifactStagingDirectory)' 
      artifactName: drop
  
  # deploy to Azure Web App staging
  - task: AzureWebApp@1
    inputs:
      azureSubscription: '<service-connection-name>'
      appType: <app type>
      appName: '<staging-app-name>'
      deployToSlotOrASE: true
      resourceGroupName: <group-name>
      slotName: 'staging'
      package: '$(Build.ArtifactStagingDirectory)/**/*.zip'

- job: deploy
  dependsOn: buildandtest
  condition: succeeded()

  pool: 
    vmImage: ubuntu-latest  
  
  steps:
    # download the artifact drop from the previous job
  - task: DownloadPipelineArtifact@2
    inputs:
      source: 'current'
      artifact: 'drop'
      path: '$(Pipeline.Workspace)'

  - task: AzureWebApp@1
    inputs:
      azureSubscription: '<service-connection-name>'
      appType: <app type>
      appName: '<production-app-name>'
      resourceGroupName: <group-name>
      package: '$(Pipeline.Workspace)/**/*.zip'

Exemplo: fazer substituições de variáveis

Para a maioria das pilhas de linguagem, as configurações do aplicativo e as cadeias de conexão podem ser definidas como variáveis de ambiente no runtime.

Mas há outras razões pelas quais você deseja fazer substituições de variáveis no Web.config. Neste exemplo, o arquivo Web.config contém uma cadeia de conexão chamada connectionString. Você pode alterar o valor dele antes da implantação em cada aplicativo Web. Você pode fazer isso aplicando uma transformação Web.config ou substituindo variáveis no seu arquivo Web.config.

O seguinte snippet mostra um exemplo de substituição de variável usando a tarefa Implantação do Serviço de Aplicativo do Azure (AzureRmWebAppDeployment):

jobs:
- job: test
  variables:
    connectionString: <test-stage connection string>
  steps:
  - task: AzureRmWebAppDeployment@4
    inputs:
      azureSubscription: '<Test stage Azure service connection>'
      WebAppName: '<name of test stage web app>'
      enableXmlVariableSubstitution: true

- job: prod
  dependsOn: test
  variables:
    connectionString: <prod-stage connection string>
  steps:
  - task: AzureRmWebAppDeployment@4
    inputs:
      azureSubscription: '<Prod stage Azure service connection>'
      WebAppName: '<name of prod stage web app>'
      enableXmlVariableSubstitution: true

Exemplo: implantação condicional

Para fazer isso no YAML, use uma das seguintes técnicas:

  • Isole as etapas de implantação em um trabalho separado e adicione uma condição a esse trabalho.
  • Adicione uma condição à etapa.

O exemplo a seguir mostra como usar condições de etapa para implantar somente builds originados da ramificação principal:

- task: AzureWebApp@1
  condition: and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/main'))
  inputs:
    azureSubscription: '<service-connection-name>'
    appName: '<app-name>'

Para saber mais sobre condições, confira Especificar condições.

Exemplo: implantação por meio da Implantação da Web

A tarefa de implantação do Serviço de Aplicativo do Azure (AzureRmWebAppDeployment) pode ser implantada no Serviço de Aplicativo por meio da Implantação da Web.

trigger:
- main

pool:
  vmImage: windows-latest

variables:
  buildConfiguration: 'Release'

steps:
- script: dotnet build --configuration $(buildConfiguration)
  displayName: 'dotnet build $(buildConfiguration)'
- task: DotNetCoreCLI@2
  inputs:
    command: 'publish'
    publishWebProjects: true
    arguments: '--configuration $(buildConfiguration)'
    zipAfterPublish: true
- task: AzureRmWebAppDeployment@4
  inputs:
    ConnectionType: 'AzureRM'
    azureSubscription: '<service-connection-name>'
    appType: 'webApp'
    WebAppName: '<app-name>'
    packageForLinux: '$(System.DefaultWorkingDirectory)/**/*.zip'
    enableCustomDeployment: true
    DeploymentType: 'webDeploy'

Perguntas frequentes

Qual é a diferença entre as tarefas AzureWebApp e AzureRmWebAppDeployment?

A tarefa Aplicativo Web do Azure (AzureWebApp) é a maneira mais simples de fazer uma implantação em um Aplicativo Web do Azure. Por padrão, sua implantação ocorre com o aplicativo raiz no Aplicativo Web do Azure.

A tarefa Implantação do Serviço de Aplicativo do Azure (AzureRmWebAppDeployment) pode lidar com cenários mais personalizados, como:

Observação

As transformações de arquivo e a substituição de variável também são compatíveis com a tarefa de Transformação de Arquivo separada para uso no Azure Pipelines. Você pode usar a tarefa Transformação de Arquivo para aplicar transformações de arquivo e substituições de variáveis em quaisquer arquivos de configuração e de parâmetros.

Recebi a mensagem: “Pacote do Serviço de Aplicativo ou caminho de pasta inválido fornecido”.

Em pipelines YAML, dependendo do pipeline, pode haver uma incompatibilidade entre o local em que o pacote da Web compilado é salvo e o local em que a tarefa de implantação procura por ele. Por exemplo, a tarefa AzureWebApp seleciona o pacote da Web para implantação. Por exemplo, a tarefa AzureWebApp examina $(System.DefaultWorkingDirectory)/**/*.zip. Se o pacote da Web for depositado em outro lugar, modifique o valor de package.

Recebi a mensagem: “Só há suporte à publicação com as opções da Implantação da Web durante o uso do agente do Windows”.

Esse erro ocorre na tarefa AzureRmWebAppDeployment quando você configura a tarefa a ser implantada usando a Implantação da Web, mas o agente não executa o Windows. Verifique se o YAML tem algo semelhante ao seguinte código:

pool:
  vmImage: windows-latest

A Implantação da Web não funciona quando desabilito a autenticação básica

Para obter informações de solução de problemas sobre como habilitar a autenticação do Microsoft Entra ID com a tarefa AzureRmWebAppDeployment, confira Não consigo usar a Implantação da Web no Serviço de Aplicativo do Azure usando a autenticação do Microsoft Entra ID por meio do agente do Windows

Próximas etapas