Exercício - Criar um pipeline de DevOps do Azure para implantar seu aplicativo nativo da nuvem

Concluído

Seu gerente deseja que você altere o CI/CD do aplicativo eShop das empresas para usar o Azure Pipelines. Agora você criará um Pipeline de DevOps do Azure para criar e implantar seu serviço de produtos.

Criar um pipeline de DevOps do Azure

Importante

Antes de começar, você precisará ter uma conta do Azure DevOps. Se você não tiver um, você pode criar um gratuitamente em dev.azure.com.

  1. Inicie sessão no dev.azure.com.
  2. Selecione + Novo projeto.
  3. Para o nome do projeto, insira a implantação do eShop.
  4. Deixe a Visibilidade definida como Privada, selecione Criar.
  5. À esquerda, selecione Pipelines e, em seguida, selecione Create Pipeline.
  6. Na página Conectar, em Onde está seu código?, selecione GitHub.
  7. Se solicitado, entre no GitHub e autorize o Azure Pipelines a acessar sua conta do GitHub.
  8. Em Selecione um repositório, selecione seu repositório bifurcado.
  9. Na página Configurar, selecione a opção Implantar no Serviço Kubernetes do Azure.
  10. No painel Implantar no Serviço Kubernetes do Azure, selecione sua assinatura do Azure e selecione Continuar.
  11. Se solicitado, faça logon na sua assinatura do Azure.
  12. Para o Cluster, selecione o cluster AKS que você criou na unidade anterior aks-eshop.
  13. Para o namespace, deixe Existing selecionado e, em seguida, selecione padrão.
  14. Para o Registro de Contêiner, selecione o Registro de Contêiner do Azure que você criou na unidade anterior, por exemplo, acseshop186748394.
  15. Para o Nome da imagem, insira productservice.
  16. Para a Porta de serviço, digite 8080.
  17. Selecione Validar e configurar.

Revise o arquivo YAML do pipeline

O Azure Pipelines usa arquivos YAML para definir as etapas para criar e implantar seu aplicativo. O arquivo YAML é armazenado em seu repositório GitHub e foi criado automaticamente para você, com base nas informações fornecidas.

Vamos rever o arquivo YAML:

trigger:
- main

resources:
- repo: self

variables:

  # Container registry service connection established during pipeline creation
  dockerRegistryServiceConnection: '3bcbb23c-6fca-4ff0-8719-bfbdb64a89b1'
  imageRepository: 'productservice'
  containerRegistry: 'acseshop186748394.azurecr.io'
  dockerfilePath: '**/Dockerfile'
  tag: '$(Build.BuildId)'
  imagePullSecret: 'acseshop18674839414442d34-auth'

  # Agent VM image name
  vmImageName: 'ubuntu-latest'


stages:
- stage: Build
  displayName: Build stage
  jobs:
  - job: Build
    displayName: Build
    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)

    - upload: manifests
      artifact: manifests

- stage: Deploy
  displayName: Deploy stage
  dependsOn: Build

  jobs:
  - deployment: Deploy
    displayName: Deploy
    pool:
      vmImage: $(vmImageName)
    environment: 'PhilStollerymod9cloudnativeexercisecode-1959.default'
    strategy:
      runOnce:
        deploy:
          steps:
          - task: KubernetesManifest@0
            displayName: Create imagePullSecret
            inputs:
              action: createSecret
              secretName: $(imagePullSecret)
              dockerRegistryEndpoint: $(dockerRegistryServiceConnection)

          - task: KubernetesManifest@0
            displayName: Deploy to Kubernetes cluster
            inputs:
              action: deploy
              manifests: |
                $(Pipeline.Workspace)/manifests/deployment.yml
                $(Pipeline.Workspace)/manifests/service.yml
              imagePullSecrets: |
                $(imagePullSecret)
              containers: |
                $(containerRegistry)/$(imageRepository):$(tag)

As seções de gatilho e recursos definem quando o pipeline deve ser executado. Nesse caso, o pipeline será executado quando uma alteração for confirmada na ramificação principal do repositório.

A seção de variáveis define as variáveis usadas no pipeline. As variáveis são usadas para definir o Registro de Contêiner do Azure e o Dockerfile a ser usado.

O YAML então define um trabalho de compilação que usa o agente ubuntu-latest . O trabalho usa a tarefa Docker para criar e enviar a imagem por push para o Registro de Contêiner do Azure.

A última etapa é implantar o serviço de produto atualizado no AKS. O trabalho usa a tarefa KubernetesManifest para implantar a imagem no AKS.

Executar o pipeline

No canto superior direito da página Revisar seu pipeline YAML , selecione Salvar e executar. No painel Salvar e executar:

  1. Selecione Criar uma nova ramificação para esta confirmação.
  2. Deixe todas as outras opções definidas como padrão.
  3. Selecione Guardar e executar.

Monitorar e solucionar problemas do pipeline

Os Pipelines do Azure são monitorados e gerenciados a partir do portal do Azure DevOps. Vamos examinar a saída da execução do pipeline que você criou.

A screenshot showing the status of an Azure Pipeline.

A página de resumo mostra todos os estágios do pipeline em execução. Você pode selecionar um estágio para visualizar as etapas com mais detalhes. Em um momento, você verá que o pipeline falhou. Selecione o estágio Build .

A screenshot of the build stage in a pipeline that has failed.

No estágio de compilação, você pode ver que a compilação falhou. Selecione a etapa Criar e enviar uma imagem por push para o Registro de Contêiner do Azure. O erro no arquivo de log mostra:

##[error]Unhandled: No Dockerfile matching  /home/vsts/work/1/s/**/Dockerfile  was found.

Corrigir o erro

Em DevOps, volte para a página de resumo do pipeline. Você vai editar o pipeline criado para corrigir o erro.

  1. No canto superior direito, selecione o menu Mais ações e, em seguida, selecione Editar pipeline.

  2. A linha 17 do arquivo YAML define o Dockerfile a ser usado e, por padrão, o pipeline espera que haja um arquivo chamado Dockerfile na raiz do repositório.

    A eShop usa um arquivo docker diferente para o serviço do produto chamado DockerfileProducts. Edite a Linha 17 para ser:

      dockerfilePath: '**/DockerfileProducts'
    
  3. Selecione Guardar.

  4. No painel Salvar, selecione Salvar.

  5. Selecione Executar e, em seguida, no painel Executar pipeline , selecione Executar.

    Assista à conclusão do estágio Build. O estágio Implantar pausa até que você o selecione e permita que ele seja executado.

    A screenshot showing the completed pipeline.

    O pipeline é concluído com êxito. Selecione o estágio Implantar para exibir as etapas.

    A screenshot showing the Deploy stage and the successfully completed steps.