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.

  1. 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.

  2. 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: 'nome-do-seu-repositório-de-imagens'
    • dockerfilePath: '$(Build.SourcesDirectory)/caminho/para/Dockerfile'
    • dockerRegistryServiceConnection: 'o número da sua conexão de serviço'

Criar um novo pipeline

Depois de o repositório ser criado com o seu aplicativo .NET e o respetivo ficheiro Docker, poderá criar o 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 Starter
  4. Na próxima guia Revisão, clique no botão Salvar

Criar e enviar imagem para o Registo de Contentores do Azure

Após o pipeline ser criado e salvo, será necessário editá-lo para executar as etapas de criação do contêiner, fazer o push para um registo e implantar a imagem no App Service. 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 o caminho Dockerfile: app/Dockerfile pelo caminho para o seu próprio 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.

  1. 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:
    
  2. 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
  3. 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 fluxo de trabalho passa pelas etapas para criar e fazer o push da imagem do contentor do Windows para o Registro de Contentores do Azure e implantar a imagem no Serviço de Aplicações.

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'