Implantar um contêiner personalizado no Serviço de Aplicativo usando o Azure Pipelines
O Azure DevOps permite que você hospede, crie, planeje e teste seu código com fluxos de trabalho gratuitos. Usar o Azure Pipelines como um desses fluxos de trabalho permite que você implante seu aplicativo com CI/CD que funciona com qualquer plataforma e nuvem. Um pipeline é definido como um arquivo YAML no diretório raiz do repositório.
Neste artigo, usamos o Azure Pipelines para implantar um aplicativo de contêiner do Windows no Serviço de Aplicativo a partir de um repositório Git no Azure DevOps. Ele pressupõe que você já tenha um aplicativo .NET com um dockerfile de suporte no Azure DevOps.
Pré-requisitos
- Uma conta do Azure com uma subscrição ativa. Crie uma conta gratuitamente.
- Uma organização Azure DevOps. Crie um gratuitamente.
- Um aplicativo do Windows funcional com o Dockerfile hospedado no Azure Repos.
Adicionar uma conexão de serviço
Antes de criar seu pipeline, você deve primeiro criar sua Conexão de Serviço, pois você será solicitado a escolher e verificar sua conexão ao criar seu modelo. Uma Conexão de Serviço permite que você se conecte ao seu registro de escolha (ACR ou Docker Hub) ao usar os modelos de tarefa. Ao adicionar uma nova conexão de serviço, escolha a opção Registro do Docker. O formulário a seguir solicita que você escolha Docker Hub ou Azure Container Registry junto com as informações pertinentes. Para acompanhar este tutorial, use o Registro de Contêiner do Azure. Você pode criar uma nova Conexão de Serviço seguindo as instruções aqui.
Proteja os seus segredos
Como estamos usando informações confidenciais que você não quer que outras pessoas acessem, usamos variáveis para proteger nossas informações. Crie uma variável seguindo as instruções aqui.
Para adicionar uma variável, clique no botão Variáveis ao lado do botão Salvar no canto superior direito da exibição de edição do pipeline. Selecione o botão Nova variável e insira suas informações. Adicione as variáveis abaixo com seus próprios segredos apropriados de cada recurso.
- vmImageName: 'windows-latest'
- imageRepository: 'seu-image-repo-name'
- dockerfilePath: '$(Build.SourcesDirectory)/caminho/para/Dockerfile'
- dockerRegistryServiceConnection: 'seu-serviço-número-conexão'
Criar um novo pipeline
Depois que o repositório for criado com seu aplicativo .NET e suportar dockerfile, você poderá criar seu pipeline seguindo estas etapas.
- Navegue até Pipelines na barra de menu à esquerda e clique no botão Create pipeline
- Na próxima tela, selecione Azure Repos Git como sua opção de repositório e selecione o repositório onde seu código está
- Na guia Configurar, escolha a opção Pipeline inicial
- Na próxima guia Revisão, clique no botão Salvar
Criar e enviar imagem por push para o registro de contêiner do Azure
Depois que o pipeline for criado e salvo, você precisará editá-lo para executar as etapas de criação do contêiner, envio por push para um registro e implantação da imagem no Serviço de Aplicativo. Para começar, navegue até o menu Pipelines, escolha o pipeline que você criou e clique no botão Editar.
Primeiro, você precisa adicionar a tarefa docker para poder criar a imagem. Adicione o seguinte código e substitua Dockerfile: app/Dockerfile pelo caminho para o seu Dockerfile.
trigger:
- main
pool:
vmImage: 'windows-latest'
variables:
vmImageName: 'windows-latest'
imageRepository: 'your-image-repo-name'
dockerfilePath: '$(Build.SourcesDirectory)/path/to/Dockerfile'
dockerRegistryServiceConnection: 'your-service-connection-number'
- stage: Build
displayName: Build and push stage
jobs:
- job: Build
displayName: Build job
pool:
vmImage: $(vmImageName)
steps:
- task: Docker@2
displayName: Build and push an image to container registry
inputs:
command: buildAndPush
repository: $(imageRepository)
dockerfile: $(dockerfilePath)
containerRegistry: $(dockerRegistryServiceConnection)
tags: |
$(tag)
Adicionar a tarefa de implantação do Serviço de Aplicativo
Em seguida, você precisa configurar a tarefa de implantação. Isso requer o nome da assinatura, o nome do aplicativo e o registro do contêiner. Adicione um novo estágio ao arquivo yaml colando o código abaixo.
- stage: Deploy
displayName: Deploy to App Service
jobs:
- job: Deploy
displayName: Deploy
pool:
vmImage: $(vmImageName)
steps:
Em seguida, navegue até a guia Mostrar assistente no canto superior direito e localize a tarefa de implantação do Serviço de Aplicativo do Azure e preencha o seguinte formulário:
- Tipo de conexão: Azure Resource Manager
- Subscrição do Azure: seu-nome-de-subscrição
- Tipo de Serviço de Aplicativo: Aplicativo Web para Contêineres (Windows)
- Nome do Serviço de Aplicativo: seu-nome-de-aplicativo
- Registro ou namespace: your-azure-container-registry-namespace
- Imagem: your-azure-container-registry-image-name
Depois de preenchê-los, clique no botão Adicionar para adicionar a tarefa abaixo:
- task: AzureRmWebAppDeployment@4
inputs:
ConnectionType: 'AzureRM'
azureSubscription: 'my-subscription-name'
appType: 'webAppHyperVContainer'
WebAppName: 'my-app-name'
DockerNamespace: 'myregsitry.azurecr.io'
DockerRepository: 'dotnetframework:12'
Depois de adicionar a tarefa, o pipeline estará pronto para ser executado. Clique no botão Validar e salvar e execute o pipeline. O pipeline passa pelas etapas para criar e enviar por push a imagem do contêiner do Windows para o Registro de Contêiner do Azure e implantar a imagem no Serviço de Aplicativo.
Abaixo está o exemplo do arquivo yaml completo:
trigger:
- main
pool:
vmImage: 'windows-latest'
variables:
vmImageName: 'windows-latest'
imageRepository: 'your-image-repo-name'
dockerfilePath: '$(Build.SourcesDirectory)/path/to/Dockerfile'
dockerRegistryServiceConnection: 'your-service-connection-number'
- stage: Build
displayName: Build and push stage
jobs:
- job: Build
displayName: Build job
pool:
vmImage: $(vmImageName)
steps:
- task: Docker@2
displayName: Build and push an image to container registry
inputs:
command: buildAndPush
repository: $(imageRepository)
dockerfile: $(dockerfilePath)
containerRegistry: $(dockerRegistryServiceConnection)
tags: |
$(tag)
- stage: Deploy
displayName: Deploy to App Service
jobs:
- job: Deploy
displayName: Deploy
pool:
vmImage: $(vmImageName)
steps:
- task: AzureRmWebAppDeployment@4
inputs:
ConnectionType: 'AzureRM'
azureSubscription: 'my-subscription-name'
appType: 'webAppHyperVContainer'
WebAppName: 'my-app-name'
DockerNamespace: 'myregsitry.azurecr.io'
DockerRepository: 'dotnetframework:12'