Implantar no Serviço de Aplicativo usando o Azure Pipelines
Azure DevOps Services | Azure DevOps Server 2020 | Azure DevOps Server 2019
Observação
A partir de 1º de junho de 2024, todos os aplicativos recém-criados do Serviço de Aplicativo terão a opção de gerar um nome de host padrão exclusivo usando a convenção de nomenclatura <app-name>-<random-hash>.<region>.azurewebsites.net
. Os nomes de aplicativos existentes permanecerão inalterados.
Exemplo: myapp-ds27dh7271aah175.westus-01.azurewebsites.net
Para obter mais detalhes, consulte Nome do Host Padrão Exclusivo para o Recurso do Serviço de Aplicativo.
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
- Uma conta do Azure com uma assinatura ativa. Crie uma conta gratuitamente.
- Uma organização do Azure DevOps. Crie um gratuitamente.
- Uma capacidade de executar pipelines em agentes hospedados pela Microsoft. Você pode comprar um trabalho paralelo ou solicitar uma camada gratuita.
- Um aplicativo do Serviço de Aplicativo do Azure de trabalho com código hospedado no GitHub ou Azure Repos.
- .NET: Criar um aplicativo Web do ASP.NET Core no Azure
- ASP.NET: Criar um aplicativo Web do ASP.NET Framework no Azure
- JavaScript: Criar um aplicativo Web do Node.js no Serviço de Aplicativo do Azure
- Java: Criar um aplicativo Java no Serviço de Aplicativo do Azure
- Python: Criar um aplicativo Python no Serviço de Aplicativo do Azure
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.
Entre na sua organização do Azure DevOps e navegue até seu projeto.
Acesse Pipelines e selecione Novo pipeline.
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.
Quando a lista de repositórios for exibida, selecione o repositório.
Você poderá ser redirecionado ao GitHub para instalar o aplicativo do Azure Pipelines. Se sim, selecione Aprovar e instalar.
Na guia Configurar, selecione ASP.NET Core.
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
Clique no final do arquivo YAML e selecione Mostrar assistente.
Use o assistente de tarefa para adicionar a tarefa do aplicativo Web do Azure.
Como alternativa, você pode adicionar a tarefa de implantação do Serviço de Aplicativo do Azure (AzureRmWebAppDeployment).
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.
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: - 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:
- 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>'
- VirtualApplication: o nome do Aplicativo Virtual configurado no portal do Azure. Confira Configurar um aplicativo do Serviço de Aplicativo no portal do Azure para obter mais detalhes.
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 sedeployToSlotOrASE
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:
- 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:
- Modificar as definições de configuração dentro de pacotes da Web e arquivos de parâmetros XML.
- Fazer a implantação com a Implantação da Web, caso você tenha se acostumado com o processo de implantação do IIS.
- Fazer a implantação em aplicativos virtuais.
- Faça a implantação em outros tipos de aplicativo, como aplicativos de contêiner, aplicativos de funções, WebJobs ou aplicativos de API e móveis.
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
- Personalize o seu pipeline do Azure DevOps.