Implementar no Serviço de Aplicações com o Azure Pipelines

Serviços de DevOps do Azure | Azure DevOps Server 2020 | Azure DevOps Server 2019

Nota

A partir de 1º de junho de 2024, todos os aplicativos do Serviço de Aplicativo recém-criados terão a opção de gerar um nome de host padrão exclusivo usando a convenção <app-name>-<random-hash>.<region>.azurewebsites.netde nomenclatura. Os nomes de aplicativos existentes permanecerão inalterados.

Exemplo: myapp-ds27dh7271aah175.westus-01.azurewebsites.net

Para obter mais detalhes, consulte Nome de host padrão exclusivo para recurso do Serviço de Aplicativo.

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

Os pipelines 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 Aplicativo Web do Azure (AzureWebApp) para implantar no Serviço de Aplicativo do Azure em seu pipeline. Para cenários mais complicados, como a necessidade de usar parâmetros XML em sua implantação, você pode usar a tarefa de implantação do Serviço de Aplicativo do Azure (AzureRmWebAppDeployment).

Pré-requisitos

1. Crie um pipeline para sua pilha

Os exemplos de código nesta seção pressupõem que você esteja 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 em sua organização do Azure DevOps e navegue até seu projeto.

  2. Vá para Pipelines e selecione New Pipeline.

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

    Poderá ser redirecionado para o GitHub para iniciar sessão. Em caso afirmativo, insira suas credenciais do GitHub.

  4. Quando a lista de repositórios aparecer, selecione seu repositório.

  5. Você pode ser redirecionado para o GitHub para instalar o aplicativo Azure Pipelines. Em caso afirmativo, selecione Aprovar e instalar.

  6. Quando a guia Configurar for exibida, selecione ASP.NET Core.

  7. Quando seu novo pipeline aparecer, dê uma olhada no YAML para ver o que ele faz. Quando estiver pronto, selecione Salvar e executar.

2. Adicione a tarefa de implantação

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

  2. Use o Assistente de tarefas para adicionar a tarefa do Aplicativo Web do Azure.

    Captura de ecrã da tarefa da aplicação Web do Azure.

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

  3. Escolha sua assinatura do Azure. Certifique-se de Autorizar sua conexão. A autorização cria a conexão de serviço necessária.

  4. Selecione o Tipo de aplicativo, o nome do aplicativo e a pilha de tempo de execução com base no seu aplicativo do Serviço de Aplicativo. Seu YAML completo deve ser semelhante ao código a seguir.

    variables:
      buildConfiguration: 'Release'
    
    steps:
    - 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 autorizado à sua assinatura do Azure.
    • appName: nome do seu aplicativo existente.
    • package: caminho do arquivo para o pacote ou uma pasta que contém o conteúdo do serviço de aplicativo. Curingas são suportados.

Exemplo: implantar um aplicativo .NET

Para implantar um pacote Web .zip (por exemplo, de um aplicativo Web ASP.NET) em um Aplicativo Web do Azure, use o trecho a seguir para implantar a compilação em um aplicativo.

variables:
  buildConfiguration: 'Release'

steps:
- 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: seu tipo de aplicativo Web.
  • appName: o nome do seu serviço de aplicativo existente.
  • Pacote: o caminho do arquivo para o pacote ou uma pasta que contém o conteúdo do serviço de aplicativo. Curingas são suportados.

Exemplo: implantar em um aplicativo virtual

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

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

Exemplo: Implantar em um slot

O exemplo a seguir mostra como implantar em um slot de preparo e, em seguida, trocar 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 seu serviço de aplicativo existente.
  • deployToSlotOrASE: Booleano. Implante em um slot de implantação existente ou no Ambiente do Serviço de Aplicativo do Azure.
  • resourceGroupName: Nome do grupo de recursos. Obrigatório se deployToSlotOrASE for verdadeiro.
  • slotName: Nome do slot, cujo padrão é production. Obrigatório se deployToSlotOrASE for verdadeiro.
  • Pacote: o caminho do arquivo para o pacote ou uma pasta que contém o conteúdo do serviço de aplicativo. Curingas são suportados.
  • SourceSlot: Slot enviado para produção quando SwapWithProduction for verdadeiro.
  • SwapWithProduction: Booleano. Troque o tráfego do slot de origem pela produção.

Exemplo: implantar em vários aplicativos Web

Você pode usar trabalhos em 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 idiomas, as configurações do aplicativo e as cadeias de conexão podem ser definidas como variáveis de ambiente em tempo de execução.

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

O trecho a seguir mostra um exemplo de substituição de variáveis usando a tarefa Implantar 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: Implantar condicionalmente

Para fazer isso no YAML, você pode usar 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 compilações originárias 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, consulte Especificar condições.

Exemplo: implantar usando a implantação da Web

A tarefa de implantaçãoAzureRmWebAppDeployment () do Serviço de Aplicativo do Azure pode ser implantada no Serviço de Aplicativo usando a Implantação da Web.

trigger:
- main

pool:
  vmImage: windows-latest

variables:
  buildConfiguration: 'Release'

steps:
- 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 mais frequentes

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

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

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

Nota

As transformações de arquivo e a substituição de variáveis também são suportadas pela tarefa 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 qualquer arquivo de configuração e parâmetros.

Recebo a mensagem "Pacote do Serviço de Aplicativo inválido ou caminho de pasta fornecido".

Nos pipelines YAML, dependendo do seu pipeline, pode haver uma incompatibilidade entre onde o pacote da Web criado é salvo e onde a tarefa de implantação está procurando. Por exemplo, a AzureWebApp tarefa pega o pacote da Web para implantação. Por exemplo, a tarefa AzureWebApp procura em $(System.DefaultWorkingDirectory)/**/*.zip. Se o pacote da Web for depositado em outro lugar, modifique o valor de package.

Recebo a mensagem "As opções de publicação usando webdeploy são suportadas somente ao usar o agente do Windows".

Esse erro ocorre na tarefa AzureRmWebAppDeployment quando você configura a tarefa para implantar usando a Implantação da Web, mas seu agente não está executando o Windows. Verifique se o seu YAML tem algo semelhante ao código a seguir:

pool:
  vmImage: windows-latest

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

Para obter informações de solução de problemas sobre como fazer com que a autenticação do Microsoft Entra ID funcione com a tarefa, consulte Não consigo implantar a Web no meu Serviço de Aplicativo do Azure usando a AzureRmWebAppDeployment autenticação do Microsoft Entra ID do meu agente do Windows

Próximos passos

  • Personalize seu pipeline do Azure DevOps.