Partilhar via


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

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.

  1. Navegue até Pipelines na barra de menu à esquerda e clique no botão Create pipeline
  2. 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á
  3. Na guia Configurar, escolha a opção Pipeline inicial
  4. 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'