Usar o Azure Pipelines para criar e enviar imagens de contêiner por push para registros

Azure DevOps Services | Azure DevOps Server 2022 | Azure DevOps Server 2020

Este artigo orienta você pela instalação e configuração para usar o Azure Pipelines para criar e enviar por push uma imagem do Docker para um Registro de Contêiner do Azure, Docker Hub e Google Artifact Registry. Além disso, ele detalha o uso do System.AccessToken para autenticação segura em seu pipeline.

Este artigo orienta você pela instalação e configuração para usar o Azure Pipelines para criar e enviar uma imagem do Docker para um Hub do Docker e o Registro de Artefatos do Google. Além disso, ele detalha o uso do System.AccessToken para autenticação segura em seu pipeline.

Você aprenderá a criar um pipeline YAML para criar e enviar uma imagem do Docker para um registro de contêiner. A tarefa Docker@2 é usada para criar e enviar a imagem para o registro de contêiner.

Pré-requisitos

  • Um projeto do Azure DevOps.
  • Um registro de contêiner (Docker Hub, Google Artifact Registry ou Azure Container Registry).
  • Um repositório GitHub com um Dockerfile. Se você não tiver um, poderá usar o repositório de exemplo No navegador, acesse o repositório de exemplo e bifurque-o para sua conta do GitHub.
  • Docker. Se estiver usando um agente auto-hospedado, verifique se o Docker está instalado e se o mecanismo do Docker está em execução com privilégios elevados. Os agentes hospedados pela Microsoft têm o Docker pré-instalado.
  • Um projeto do Azure DevOps.
  • Um registro de contêiner (Docker Hub ou Google Artifact Registry).
  • Um repositório GitHub com um Dockerfile. Se você não tiver um, poderá usar o repositório de exemplo No navegador, acesse o repositório de exemplo e bifurque-o para sua conta do GitHub.
  • Docker. Se estiver usando um agente auto-hospedado, verifique se o Docker está instalado e se o mecanismo do Docker está em execução com privilégios elevados. Os agentes hospedados pela Microsoft têm o Docker pré-instalado.

Criar uma conexão de serviço de Registro do Docker

Antes de enviar imagens de contêiner por push para um registro, você precisa criar uma conexão de serviço no Azure DevOps. Essa conexão de serviço armazena as credenciais necessárias para autenticar com segurança no registro de contêiner. Vá para a página Conexões de serviço em seu projeto do Azure DevOps para criar uma nova conexão de serviço e selecione o tipo de conexão do Registro do Docker.

Há diferentes processos para criar uma conexão de serviço para um Docker Hub e um Google Artifact Registry.

Escolha a opção Docker Hub em Conexão de serviço de Registro do Docker e forneça seu nome de usuário e senha para criar uma conexão de serviço do Docker.

Criar um Azure Pipeline para criar e enviar por push uma imagem do Docker

A tarefa Docker@2 foi projetada para simplificar o processo de criação, envio por push e gerenciamento de imagens do Docker em seu Azure Pipelines. Essa tarefa dá suporte a uma ampla variedade de comandos do Docker, incluindo compilar, enviar, fazer logon, fazer logout, iniciar, parar e executar.

As etapas a seguir descrevem como criar um pipeline YAML que usa a tarefa Docker@2 para criar e enviar a imagem.

  1. Navegue até o projeto do Azure DevOps e selecione Pipelines no menu à esquerda.

  2. Selecione Novo pipeline para criar um novo pipeline.

  3. Selecione GitHub ou GitHub Enterprise Server como o local para o código-fonte.

  4. Caso ainda não tenha feito isso, autorize o Azure Pipelines a se conectar à sua conta do GitHub Enterprise Server.

    1. Selecione Conectar ao GitHub Enterprise Server.
    2. Insira detalhes da sua conta e selecione Verificar e salvar.
  5. Selecione seu repositório. Se você for redirecionado para o GitHub

  6. Selecione o modelo de pipeline inicial para criar uma configuração básica de pipeline.

  7. Substitua o conteúdo do azure-pipelines.yml pelo seguinte código.

  8. Com base em se você está implantando um aplicativo Linux ou Windows, defina vmImage, respectivamente, como ubuntu-latest ou windows-latest. Se você estiver usando um agente auto-hospedado, defina vmImage como o nome do pool que contém o agente auto-hospedado com capacidade do Docker. Você pode adicionar a propriedade para garantir que um agente com o demands: docker Docker instalado seja selecionado.

  9. Substitua <docker connection> pelo nome da conexão de serviço do Docker que você criou anteriormente.

  10. Substitua <target repository name> pelo nome do repositório no registro de contêiner para o qual você deseja enviar a imagem. Por exemplo, <your-docker-hub-username>/<repository-name>.

    
     trigger:
     - main
    
     pool:
     vmImage: 'ubuntu-latest' 
    
     variables:
     repositoryName: '<target repository name>'
    
     steps:
     - task: Docker@2
     inputs:
     containerRegistry: '<docker connection>'
     repository: $(repositoryName)
     command: 'buildAndPush'
     Dockerfile: '**/Dockerfile'
    
    
  11. Quando terminar, selecione Salvar e executar.

  12. Ao salvar o arquivo azure-pipelines.yml no repositório, você será solicitado a adicionar uma mensagem de confirmação. Insira uma mensagem e selecione Salvar e executar.

Ao usar agentes auto-hospedados, verifique se o Docker está instalado no host do agente e se o mecanismo/daemon do Docker está sendo executado com privilégios elevados.

Para criar a imagem, o Docker deve estar instalado no host do agente e o mecanismo/daemon do Docker deve estar em execução com privilégios elevados. Use as etapas a seguir para criar o pipeline usando o editor de pipeline YAML.

  1. Acesse sua coleção e crie um projeto.

  2. No projeto, selecione Pipelines.

  3. Selecione Criar pipeline.

  4. Selecione GitHub Enterprise Server como o local para seu código-fonte.

  5. Caso ainda não tenha feito isso, autorize o Azure Pipelines a se conectar à sua conta do GitHub Enterprise Server.

    1. Selecione Conectar ao GitHub Enterprise Server.
    2. Insira detalhes da sua conta e selecione Verificar e salvar.
  6. Selecione seu repositório. Se você for redirecionado ao GitHub para instalar o aplicativo Azure Pipelines, selecione Aprovar e instalar.

  7. Para configurar o pipeline, selecione o modelo Criar uma imagem do Docker.

  8. No editor de pipeline YAML, substitua o conteúdo do arquivo YAML pelo código a seguir. Substitua o nome do pool pelo nome do pool que contém seu agente auto-hospedado com a funcionalidade do Docker.

  9. Com base em se você está implantando um aplicativo Linux ou Windows, defina vmImage, respectivamente, como ubuntu-latest ou windows-latest.

  10. Substitua <target repository name> pelo nome do repositório no registro de contêiner para o qual você deseja enviar a imagem. Por exemplo, <your-docker-hub-username>/<repository-name>.

  11. Substitua <docker connection> pelo nome da conexão de serviço do Docker que você criou anteriormente.

    
    trigger:
    - main
    
    pool:
    name: default
    demands: docker
    
    variables:
    repositoryName: '<target repository name>'
    
    steps:
    - task: Docker@2
    inputs:
    containerRegistry: '<docker connection>'
    repository: $(repositoryName)
    command: 'buildAndPush'
    Dockerfile: '**/Dockerfile'
    
    
  12. Selecione Salvar e executar.

  13. Na página Salvar e executar, selecione Salvar e executar novamente.

Você pode assistir à execução do pipeline e exibir os logs para ver a imagem do Docker sendo criada e enviada por push para o registro de contêiner.

Usando System.AccessToken para autenticação em Docker@2 tarefa

Você pode autenticar com um registro de contêiner usando o System.AccessToken fornecido pelo Azure DevOps. Esse token permite acesso seguro a recursos em seu pipeline sem expor credenciais confidenciais.

No exemplo de pipeline YAML a seguir, a tarefa Docker@2 é usada para entrar no registro de contêiner e enviar a imagem do Docker. O System.AccessToken é definido como uma variável de ambiente para autenticar os comandos do Docker.

Substitua <docker connection> pelo nome da conexão do serviço de registro do Docker. Substitua <your repository> pelo nome do repositório do Docker.

trigger:
- main

pool:
  vmImage: 'ubuntu-latest'

variables:
  SYSTEM_ACCESSTOKEN: $(System.AccessToken)

steps:
- task: Docker@2
  inputs:
    command: login
    containerRegistry: '<docker connection>'
  env:
    SYSTEM_ACCESSTOKEN: $(System.AccessToken)

- task: Docker@2
  inputs:
    command: buildAndPush
    repository: '<your repository>'
    dockerfile: '**/Dockerfile'
    tags: |
      $(Build.BuildId)
  env:
    SYSTEM_ACCESSTOKEN: $(System.AccessToken)