Armazenar artefatos no Artifact Registry

Esta página descreve como configurar o Cloud Build para armazenar artefatos criados em um repositório do Artifact Registry.

Antes de começar

  1. Se o repositório de destino não existir no Artifact Registry, crie um novo repositório.
  2. Se o Cloud Build e o repositório estiverem em projetos diferentes ou se você estiver usando uma conta de serviço especificada pelo usuário para executar builds, conceda o papel de escritor do registro de artefatos à conta de serviço do build no projeto com os repositórios.

    A conta de serviço padrão do Cloud Build tem acesso para realizar as seguintes ações com um repositório no mesmo projeto Google Cloud :

Configurar um build do Docker

Depois de conceder permissões ao repositório de destino, você estará pronto para configurar o build.

Para configurar o build:

  1. No arquivo de configuração de build, adicione a etapa para criar e marcar a imagem.

    steps:
    - name: 'gcr.io/cloud-builders/docker'
      args: [ 'build', '-t', '${_LOCATION}-docker.pkg.dev/$PROJECT_ID/${_REPOSITORY}/${_IMAGE}', '.' ]
    images:
    - '${_LOCATION}-docker.pkg.dev/$PROJECT_ID/${_REPOSITORY}/${_IMAGE}'
    

    Este snippet usa substituições do Cloud Build. Essa abordagem é útil se você quiser usar o mesmo arquivo de configuração de build para enviar imagens a repositórios de ambientes diferentes, como teste, preparo ou produção.

    • ${_LOCATION}, ${_REPOSITORY} e ${_IMAGE} são substituições definidas pelo usuário para o local, o nome e a imagem do repositório. Você especifica os valores dessas variáveis no momento da build.
    • $PROJECT_ID é uma substituição padrão que o Cloud Build resolve com o ID do projeto Google Cloud do build.

      • Se você executar o comando gcloud builds submit, o Cloud Build usará o ID do projeto ativo na sessão gcloud.
      • Se você usar um gatilho de compilação, o Cloud Build vai usar o ID do projeto em que ele está sendo executado.

      Como alternativa, use uma substituição definida pelo usuário em vez de $PROJECT_ID para especificar um ID do projeto no momento do build.

  2. Quando estiver tudo pronto para executar o build, especifique os valores para as substituições definidas pelo usuário. Por exemplo, este comando substitui:

    • us-east1 para o local do repositório
    • my-repo para o nome do repositório
    • my-image para o nome da imagem
    gcloud builds submit --config=cloudbuild.yaml \
      --substitutions=_LOCATION="us-east1",_REPOSITORY="my-repo",_IMAGE="my-image" .
    

Configurar um build do Go

Depois de conceder permissões ao repositório de destino, você estará pronto para configurar o build. As instruções a seguir descrevem como configurar seu build para fazer upload de um módulo Go para um repositório Go.

Para configurar o build:

  1. Para fazer upload de um módulo Go para o repositório Go no build, adicione as seguintes etapas ao arquivo de configuração do build:

    steps:
    - name: gcr.io/cloud-builders/gcloud
    args:
    - 'artifacts'
    - 'go'
    - 'upload'
    - '--project=$PROJECT_ID'
    - '--location=${_LOCATION}'
    - '--repository=${_REPOSITORY}'
    - '--module-path=${_MODULE_PATH}'
    - '--version=$TAG_NAME'
    

    O arquivo de configuração de build inclui substituições do Cloud Build. Essa abordagem é útil se você quiser usar o mesmo arquivo de configuração de build para fazer upload de pacotes para repositórios de ambientes diferentes, como teste, preparo ou produção.

    • ${_LOCATION}, ${_REPOSITORY} e ${_MODULE_PATH} são substituições definidas pelo usuário para o local, o nome e o caminho do módulo do repositório. Você especifica os valores dessas variáveis no momento da criação.
    • $PROJECT_ID e $TAG_NAME são substituições padrão que o Cloud Build substitui pelo seguinte:

      • $PROJECT_ID é substituído pelo ID do projeto Google Cloud para o build.

        • Se você executar o comando gcloud builds submit, o Cloud Build usará o ID do projeto ativo na sessão gcloud.
        • Se você usar um gatilho de compilação, o Cloud Build vai usar o ID do projeto em que ele está sendo executado.

        Como alternativa, use uma substituição definida pelo usuário em vez de $PROJECT_ID para especificar um ID do projeto no momento do build.

      • $TAG_NAME é substituído pelo nome da tag para oferecer suporte à convenção do Go de usar tags do Git como números de versão.

  2. Para instalar o pacote do repositório Go, adicione as seguintes etapas ao arquivo de configuração do build para:

    • Adicione um endpoint regional do Cloud Build no local do repositório ao arquivo .netrc.
    • Execute a ferramenta de auxiliar de credenciais para atualizar os tokens OAuth.
    • Execute o comando go run. Também é possível mudar para go build para compilar o módulo, go test para executar testes ou go mod tidy para fazer o download das dependências.

    Para a etapa de comando go, o GOPROXY é definido como o repositório do Cloud Build que hospeda dependências particulares. É possível adicionar o proxy público à lista GOPROXY separada por vírgulas se o módulo tiver dependências públicas.

    steps:
    - name: golang
      entrypoint: go
      args: ['run', 'github.com/GoogleCloudPlatform/artifact-registry-go-tools/cmd/auth@v0.1.0', 'add-locations', '--locations=${_LOCATION}']
      env:
      # Set GOPROXY to the public proxy to pull the credential helper tool
      - 'GOPROXY=https://proxy.golang.org'
    - name: golang
      entrypoint: go
      args: ['run', 'github.com/GoogleCloudPlatform/artifact-registry-go-tools/cmd/auth@v0.1.0', 'refresh']
      env:
      # Set GOPROXY to the public proxy to pull the credential helper tool
      - 'GOPROXY=https://proxy.golang.org'
    - name: golang
      entrypoint: go
      args: ['run', '.']
      env:
      - 'GOPROXY=https://${_LOCATION}-go.pkg.dev/${_PROJECT_ID}/${_REPOSITORY}'
    options:
      env:
      # Disable GO sumdb checks for private modules.
      - 'GONOSUMDB=${_MODULE_PATH}'
    
  3. Quando estiver tudo pronto para executar o build, especifique os valores para as substituições definidas pelo usuário. Por exemplo, este comando substitui:

    • us-east1 para o local do repositório
    • my-project para o ID do projeto
    • my-repo para o nome do repositório
    • example.com/greetings para o caminho do módulo
    gcloud builds submit --config=cloudbuild.yaml \
      --substitutions=_LOCATION="us-east1",_PROJECT_ID="my-project",_REPOSITORY="my-repo",_MODULE_PATH="example.com/greetings" .
    

Configurar um build Java

Depois de conceder permissões ao repositório de destino, você estará pronto para configurar o build. As instruções a seguir descrevem como configurar seu build para fazer upload de um pacote Java para um repositório Maven.

Para configurar o build:

  1. Configure a autenticação para Maven. Certifique-se de especificar o projeto de destino e o repositório corretos no arquivo pom.xml.

  2. No arquivo de configuração de versão do Cloud Build, adicione a etapa para fazer upload do pacote com o Maven:

    steps:
    - name: gcr.io/cloud-builders/mvn
      args: ['deploy']
    
  3. Quando o arquivo de configuração de build estiver pronto, inicie o build com o seguinte comando:

    gcloud builds submit
    

Configurar um build do Node.js

Depois de conceder permissões ao repositório de destino, você estará pronto para configurar o build. As instruções a seguir descrevem como configurar seu build para fazer upload de um pacote do Node.js para um repositório do npm.

Para configurar o build:

  1. Adicione o repositório do Artifact Registry ao arquivo .npmrc no projeto do Node.js. Ele fica no diretório com o arquivo package.json.

    @SCOPE:registry=https://LOCATION-npm.pkg.dev/PROJECT_ID/REPOSITORY
    //LOCATION-npm.pkg.dev/PROJECT_ID/REPOSITORY/:always-auth=true
    
    • SCOPE-NAME é o nome do escopo do npm a ser associado ao repositório. O uso de escopos garante que você sempre publique e instale pacotes do repositório correto.
    • PROJECT_ID é o ID do Google Cloud projeto.
    • LOCATION é o local regional ou multirregional do repositório.
    • REPOSITORY é o nome do repositório.
  2. Adicione um script ao arquivo package.json no seu projeto que atualize o token de acesso para autenticação com o repositório.

    "scripts": {
     "artifactregistry-login": "npx google-artifactregistry-auth"
    }
    
  3. No arquivo de configuração da versão, adicione a etapa para fazer upload do pacote para o repositório.

    steps:
    - name: gcr.io/cloud-builders/npm
      args: ['run', 'artifactregistry-login']
    - name: gcr.io/cloud-builders/npm
      args: ['publish', '${_PACKAGE}']
    

    ${_PACKAGE} é uma substituição do Cloud Build que representa o diretório do projeto do Node.js. É possível especificar o diretório ao executar o comando para executar o build.

    Por exemplo, este comando faz upload do pacote de um diretório chamado src:

    gcloud builds submit --config=cloudbuild.yaml \
        --substitutions=_PACKAGE="src" .
    

Configurar um build do Python

Depois de conceder permissões ao repositório de destino, você estará pronto para configurar o build. As instruções a seguir descrevem como configurar seu build para fazer upload de um pacote Python em um repositório Python e instalar o pacote usando pip.

Para criar e contêinerizar um aplicativo Python e enviá-lo a um repositório do Docker, consulte Como criar aplicativos Python na documentação do Cloud Build.

Para configurar o build:

  1. No diretório com o arquivo de configuração do build do Cloud Build, crie um arquivo chamado requirements.txt com as seguintes dependências:

    twine
    keyrings.google-artifactregistry-auth
    
    • O Twine é usado para fazer upload de pacotes para o Artifact Registry.
    • keyrings.google-artifactregistry-auth é o back-end de keyring do Artifact Registry que processa a autenticação com o Artifact Registry para pip e Twine.
  2. Para fazer upload de um pacote Python para o repositório Python no build, adicione as seguintes etapas ao arquivo de configuração do build:

    steps:
    - name: python
      entrypoint: pip
      args: ["install", "-r", "requirements.txt", "--user"]
    - name: python
      entrypoint: python
      args:
      - '-m'
      - 'twine'
      - 'upload'
      - '--repository-url'
      - 'https://${_LOCATION}-python.pkg.dev/$PROJECT_ID/${_REPOSITORY}/'
      - 'dist/*'
    

    Neste snippet, a primeira etapa instala o Twine e o back-end do keyring do Artifact Registry. A segunda etapa faz o upload dos arquivos Python criados no subdiretório dist. Ajuste os caminhos para requirements.txt e seus arquivos Python criados se eles não corresponderem ao snippet.

    O caminho do repositório inclui substituições do Cloud Build. Essa abordagem é útil se você quiser usar o mesmo arquivo de configuração de build para fazer upload de pacotes para repositórios de ambientes diferentes, como teste, preparo ou produção.

    • ${_LOCATION} e ${_REPOSITORY} são substituições definidas pelo usuário para o local, o nome do repositório e o nome do pacote. Você especifica os valores dessas variáveis no momento do build.
    • $PROJECT_ID é uma substituição padrão que o Cloud Build resolve com o ID do projeto Google Cloud do build.

      • Se você executar o comando gcloud builds submit, o Cloud Build usará o ID do projeto ativo na sessão gcloud.
      • Se você usar um gatilho de compilação, o Cloud Build vai usar o ID do projeto em que ele está sendo executado.

      Como alternativa, use uma substituição definida pelo usuário em vez de $PROJECT_ID para especificar um ID do projeto no momento do build.

  3. Para instalar o pacote do repositório Python, adicione uma etapa ao arquivo de configuração do build que execute o comando pip install.

      steps:
      - name: python
        entrypoint: pip
        args:
        - 'install'
        - '--index-url'
        - 'https://${_LOCATION}-python.pkg.dev/$PROJECT_ID/${_REPOSITORY}/simple/'
        - '${_PACKAGE}'
        - '--verbose'
    

    Esse snippet inclui uma substituição ${_PACKAGE} adicional para o nome do pacote.

  4. Quando estiver tudo pronto para executar o build, especifique os valores para as substituições definidas pelo usuário. Por exemplo, este comando substitui:

    • us-east1 para o local do repositório
    • my-repo para o nome do repositório
    • my-package para o nome do pacote
    gcloud builds submit --config=cloudbuild.yaml \
      --substitutions=_LOCATION="us-east1",_REPOSITORY="my-repo",_PACKAGE="my-package" .
    

Armazenar artefatos em um registro privado usando certificados autoassinados

Se você tiver uma autoridade de certificação particular e precisar armazenar artefatos em um registro particular, configure o arquivo de configuração do build para usar certificados autoassinados. Para fazer isso, adicione uma etapa de build que envie seu certificado ao sistema host para que ele fique disponível para etapas de build subsequentes. Exemplo:

- name: gcr.io/cloud-builders/docker
  args:
    - run
    - --rm
    - --volume=/etc/docker/certs.d/:/etc/docker/certs.d/
    - --volume=certificates:/certificates
    - ubuntu
    - bash
    - -c
    - |
      cp /certificates/ca.crt /etc/docker/certs.d/quay.apps.cloud.inter
  volumes:
    - name: certificates
      path: /certificates

A seguir