Compartilhar 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 complementares. Usar o Azure Pipelines como um desses fluxos de trabalho permite que você implante seu aplicativo com CI/CD que funcione 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 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, crie primeiro sua conexão de serviço, pois será solicitado que você escolha e verifique sua conexão ao criar o modelo. Uma Conexão de Serviço permite que você se conecte ao registro de sua 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 o Docker Hub ou o Registro de Contêiner do Azure, juntamente com 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.

Proteger segredos

Como estamos usando informações confidenciais que você não deseja 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: 'your-image-repo-name'
  • dockerfilePath: '$(Build.SourcesDirectory)/path/to/Dockerfile'
  • dockerRegistryServiceConnection: 'your-service-connection-number'

Criar um novo pipeline

Depois que o repositório for criado com o aplicativo .NET e o dockerfile de suporte, você poderá criar seu pipeline seguindo estas etapas.

  1. Navegue até Pipelines na barra de menus à esquerda e clique no botão Criar pipeline
  2. Na próxima tela, selecione Git do Azure Repos como a opção de repositório e selecione o repositório no qual está o código
  3. Na guia Configurar, escolha a opção Pipeline Inicial
  4. Na próxima guia Revisão, clique no botão Salvar

Criar e efetuar push da imagem para o Registro de Contêiner do Azure

Depois que o pipeline for criado e salvo, você precisará editar o pipeline para executar as etapas para criar o contêiner, efetuar push para um registro e implantar a 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 de docker para criar a imagem. Adicione o seguinte código e substitua o Dockerfile: app/Dockerfile pelo caminho para o 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 de contêiner. Para adicionar um novo estágio ao arquivo yaml, cole 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, localize a tarefa Implantação do Serviço de Aplicativo do Azure e preencha o seguinte formulário:

  • Tipo de conexão: Azure Resource Manager
  • Assinatura do Azure: your-subscription-name
  • Tipo do Serviço de Aplicativo: Aplicativo Web para Contêineres (Windows)
  • Nome do Serviço de Aplicativo: your-app-name
  • Registro ou namespace: your-azure-container-registry-namespace
  • Imagem: your-azure-container-registry-image-name

Depois de preencher, 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 efetuar push da imagem de contêiner do Windows para o Registro de Contêiner do Azure e implantar a imagem no Serviço de Aplicativo.

Veja abaixo 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'