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

Concluído

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

Criar um pipeline do Azure DevOps

Importante

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

  1. Entre em dev.azure.com.
  2. Selecione + New project.
  3. Para o Nome do projeto, insira Implantação do eShop.
  4. Deixe a Visibilidade definida como Privada, selecione Criar.
  5. À esquerda, selecione Pipelines e, em seguida, selecione Criar pipeline.
  6. Na página Conectar, para Onde está o seu código?, selecione GitHub.
  7. Se solicitado, entre no GitHub e autorize o Azure Pipelines a acessar a sua conta do GitHub.
  8. Para Selecionar um repositório, selecione o repositório bifurcado.
  9. Na página Configurar, selecione a opção Implantar no Serviço de Kubernetes do Azure.
  10. No painel Implantar no Serviço de Kubernetes do Azure, selecione sua assinatura do Azure e selecione Continuar.
  11. Se solicitado, faça logon em sua assinatura do Azure.
  12. Para o Cluster, selecione o cluster do AKS criado na unidade anterior aks-eshop.
  13. Para o Namespace, deixe Existente selecionado e selecione o padrão.
  14. Para o Registro de contêiner, selecione o Registro de Contêiner do Azure criado na unidade anterior; por exemplo, acseshop186748394.
  15. Para o Nome da imagem, insira productservice.
  16. Para a Porta de serviço, insira 8080.
  17. Selecione Validate and configure.

Examinar o arquivo YAML do pipeline

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

Vamos examinar 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 no branch principal do repositório.

A seção 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.

Em seguida, o YAML define um trabalho de Build que usa o agente ubuntu-latest. O trabalho usa a tarefa do Docker para criar e enviar a imagem por push para o Registro de Contêiner do Azure.

O último estágio é 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 Examinar o pipeline do YAML, selecione Salvar e executar. No painel Salvar e executar:

  1. Selecione Criar um novo branch para este commit.
  2. Deixe todas as outras opções definidas como o padrão.
  3. Selecione Salvar e executar.

Monitorar e solucionar problemas do pipeline

O Azure Pipelines é monitorado e gerenciado no 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 exibir as etapas com mais detalhes. Em determinado momento, você verá que o pipeline falha. Selecione o estágio de Build.

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

No estágio de build, você pode ver que o build falha. Selecione a etapa Compilar 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

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

    O eShop usa um arquivo docker diferente para o serviço de produto chamado DockerfileProducts. Edite a linha 17 para o seguinte:

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

  4. No painel Salvar, selecione Salvar.

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

    Assista ao estágio de build concluído. O estágio de implantação 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.