Como armazenar imagens e artefatos

Se a versão produzir artefatos como imagens de contêiner, binários ou tarballs, será possível optar por armazená-los no Container Registry, no Cloud Storage ou em qualquer repositório particular de terceiros.

Veja nesta página como armazenar imagens de contêiner no Container Registry e em artefatos que não sejam contêineres no Cloud Storage.

Como armazenar imagens no Container Registry

Para armazenar uma imagem de contêiner no Container Registry depois que sua versão tiver sido concluída, adicione um campo images no arquivo de configuração de versão, apontando para uma ou mais imagens:

YAML

images: [[IMAGE_NAME], [IMAGE_NAME], ...]

Em que [IMAGE_NAME] é o nome da imagem que você quer armazenar, como gcr.io/myproject/myimage.

JSON

{
    "images": [
    [
        "IMAGE_NAME"
    ],
    [
        "IMAGE_NAME"
    ],
    "..."
    ]
}

Em que [IMAGE_NAME] é o nome da imagem que você quer armazenar, como gcr.io/myproject/myimage.

O exemplo a seguir cria uma imagem do Docker com o nome myimage e a armazena em gcr.io/myproject/:

YAML

steps:
- name: 'gcr.io/cloud-builders/docker'
  args: ['build', '-t', 'gcr.io/myproject/myimage', '.']
images: ['gcr.io/myproject/myimage']

JSON

{
    "steps": [
    {
        "name": "gcr.io/cloud-builders/docker",
        "args": [
            "build",
            "-t",
            "gcr.io/myproject/myimage",
            "."
        ]
    }
    ],
    "images": [
        "gcr.io/myproject/myimage"
    ]
}

Para armazenar a imagem no Container Registry como parte do fluxo da criação, adicione uma etapa de criação docker e passe argumentos para invocar o comando push:

YAML

steps:
- name: 'gcr.io/cloud-builders/docker'
  args: ['push', '[IMAGE_NAME]']

Em que [IMAGE_NAME] é o nome da imagem que você quer armazenar no Container Registry, como gcr.io/myproject/myimage.

JSON

{
    "steps": [
    {
        "name": "gcr.io/cloud-builders/docker",
        "args": [
            "push",
            "[IMAGE_NAME]"
        ]
    }
    ]
}

Em que [IMAGE_NAME] é o nome da imagem que você quer armazenar no Container Registry, como gcr.io/myproject/myimage.

O exemplo a seguir cria uma imagem docker chamada myimage e a armazena por meio da adição de outra etapa da criação do Docker e do envio da imagem para o Container Registry:

YAML

steps:
- name: 'gcr.io/cloud-builders/docker'
  args: ['build', '-t', 'gcr.io/myproject/myimage', '.']
- name: 'gcr.io/cloud-builders/docker'
  args: ['push', 'gcr.io/myproject/myimage']

JSON

{
    "steps": [
    {
        "name": "gcr.io/cloud-builders/docker",
        "args": [
            "build",
            "-t",
            "gcr.io/myproject/myimage",
            "."
        ]
    },
    {
        "name": "gcr.io/cloud-builders/docker",
        "args": [
            "push",
            "gcr.io/myproject/myimage"
        ]
    }
    ]
}

A diferença entre o uso do campo images e do comando push do Docker é que, se você usar o campo , a imagem armazenada será exibida nos resultados da versão. Isso inclui a página Descrição da versão para uma versão no Console do GCP, os resultados dos comandos Build.get() e gcloud builds list. No entanto, se você usar o comando push do Docker para armazenar a imagem criada, ela não será exibida nos resultados da versão.

Para armazenar uma imagem como parte do fluxo da versão e exibir a imagem nos resultados da versão , use o comando push e o campo images do Docker na configuração da versão:

YAML

steps:
- name: 'gcr.io/cloud-builders/docker'
  args: ['push', '[IMAGE_NAME]']
images: ['[IMAGE_NAME]']

Em que [IMAGE_NAME] é o nome da imagem, como gcr.io/myproject/myimage.

JSON

{
    "steps": [
    {
        "name": "gcr.io/cloud-builders/docker",
        "args": [
            "push",
            "[IMAGE_NAME]"
        ]
    }
    ],
    "images": [
        "[IMAGE_NAME]"
    ]
}

Em que [IMAGE_NAME] é o nome da imagem, como gcr.io/myproject/myimage.

No exemplo a seguir, uma imagem docker chamada myimage é criada e armazenada como parte do fluxo da versão, após a conclusão da versão:

YAML

steps:
- name: 'gcr.io/cloud-builders/docker'
  args: ['build', '-t', 'gcr.io/myproject/myimage', '.']
- name: 'gcr.io/cloud-builders/docker'
  args: ['push', 'gcr.io/myproject/myimage']
images: ['gcr.io/myproject/myimage']

JSON

{
    "steps": [
    {
        "name": "gcr.io/cloud-builders/docker",
        "args": [
            "build",
            "-t",
            "gcr.io/myproject/myimage",
            "."
        ]
    },
    {
        "name": "gcr.io/cloud-builders/docker",
        "args": [
            "push",
            "gcr.io/myproject/myimage"
        ]
    }
    ],
    "images": [
        "gcr.io/myproject/myimage"
    ]
}

Como armazenar artefatos no Cloud Storage

Para armazenar artefatos que não sejam de contêineres no Cloud Storage, adicione um campo artifacts no arquivo de configuração de versão com o local do intervalo para armazenar o artefato e o caminho para um ou mais artefatos:

YAML

artifacts:
  objects:
    location: [STORAGE_LOCATION]
    paths: [[ARTIFACT_PATH],[ARTIFACT_PATH], ...]

Em que,

  • [STORAGE_LOCATION]: um intervalo do Cloud Storage ou uma pasta no intervalo em que o Cloud Build precisa armazenar o artefato, como gs://mybucket ou gs://mybucket/some/folder.
  • [ARTIFACT_PATH] é o caminho para um ou mais artefatos.

JSON

{
    "artifacts": {
        "objects": {
            "location": [
                "[STORAGE_LOCATION]"
            ],
            "paths": [
            [
                "[ARTIFACT_PATH]"
            ],
            [
                "[ARTIFACT_PATH]"
            ],
            "..."
            ]
        }
    }
}

Em que,

  • [STORAGE_LOCATION]: um intervalo do Cloud Storage ou uma pasta no intervalo em que o Cloud Build precisa armazenar o artefato, como gs://mybucket ou gs://mybucket/some/folder.
  • [ARTIFACT_PATH] é o caminho para um ou mais artefatos.

Só é possível especificar um intervalo para fazer upload dos artefatos e para isso, é preciso ser o proprietário do intervalo. Você pode especificar um caminho de diretório válido no intervalo.

É possível fazer upload de um número qualquer de artefatos, mas só podem ser especificados até cem caminhos de artefatos.

Se você fizer upload de um artefato em um intervalo que já tenha um artefato com o mesmo nome, o novo artefato substituirá o atual. É possível ativar o Controle de versão do objeto do intervalo se você não quiser que o artefato mais novo substitua um artefato atual com o mesmo nome.

Depois que a versão tiver sido concluída com êxito, será possível encontrar os resultados de upload no arquivo de manifesto JSON, localizado em [STORAGE_LOCATION]/artifacts-$BUILD_ID.json.

O arquivo de manifesto JSON tem os seguintes campos:

  • location: especifica o local no Cloud Storage em que um artefato é armazenado e está no formato gs://[STORAGE_LOCATION]/[FILE_NAME]#[GENERATION_NUMBER]. É possível usar o número de geração para identificar de maneira exclusiva uma versão dos dados no intervalo do Cloud Storage.
  • file_hash: especifica o tipo de hash e o valor. O tipo de hash é sempre 2, que especifica que o hash MD5 foi realizado.

Como armazenar artefatos no Cloud Build Artifacts

O Cloud Build Artifacts permite armazenar artefatos em um serviço de repositórios escalonável e integrado. O Cloud Build Artifacts está disponível como uma versão Alfa, compatível com pacotes Maven e npm durante o período de versão Alfa. Gerencie o acesso ao repositório com o IAM e interaja com repositórios via gcloud, Console do GCP e ferramentas de pacote nativas. O Cloud Build Artifacts se integra ao Cloud Build e a outros sistemas de CI/CD. Para participar do grupo Alfa, preencha o formulário de inscrição.

Exemplos de artefatos

Os exemplos a seguir mostram como usar o campo Artifacts em um arquivo de configuração de versão. Em todos esses exemplos, substitua [VALUES_IN_BRACKETS] pelos valores apropriados.

Como fazer upload de arquivos e pastas

O arquivo de configuração de versão abaixo faz uploads de helloworld.class para gs://[STORAGE_LOCATION]/:

YAML

steps:
- name: 'gcr.io/cloud-builders/javac'
  args: ['HelloWorld.java']
artifacts:
  objects:
    location: 'gs://[STORAGE_LOCATION]/'
    paths: ['HelloWorld.class']

JSON

{
    "steps": [
    {
        "name": "gcr.io/cloud-builders/javac",
        "args": [
            "HelloWorld.java"
        ]
    }
    ],
    "artifacts": {
        "objects": {
            "location": "gs://[STORAGE_LOCATION]/",
            "paths": [
                "HelloWorld.class"
            ]
        }
    }
}

Para fazer upload de mais de um artefato, especifique o caminho para cada artefato separado por uma vírgula. O exemplo a seguir faz uploads de HelloWorld.java, HelloWorld.class e cloudbuild.yaml para gs://[STORAGE_LOCATION]/:

YAML

steps:
- name: 'gcr.io/cloud-builders/javac'
  args: ['HelloWorld.java']
artifacts:
  objects:
    location: 'gs://[STORAGE_LOCATION]/'
    paths: ['HelloWorld.java', 'HelloWorld.class', 'cloudbuild.yaml']

JSON

{
    "steps": [
    {
        "name": "gcr.io/cloud-builders/javac",
        "args": [
            "HelloWorld.java"
        ]
    }
    ],
    "artifacts": {
        "objects": {
            "location": "gs://[STORAGE_LOCATION]/",
            "paths": [
                "HelloWorld.java",
                "HelloWorld.class",
                "cloudbuild.yaml"
            ]
        }
    }
}

Também é possível fazer upload dos artefatos para um caminho de diretório válido no intervalo. O exemplo a seguir faz upload de HelloWorld.java e HelloWorld.class para gs://[BUCKET_NAME]/[FOLDER_NAME]:

YAML

steps:
- name: 'gcr.io/cloud-builders/javac'
  args: ['HelloWorld.java']
artifacts:
  objects:
    location: 'gs://[BUCKET_NAME]/[FOLDER_NAME]'
    paths: ['HelloWorld.java', 'HelloWorld.class']

JSON

{
    "steps": [
    {
        "name": "gcr.io/cloud-builders/javac",
        "args": [
            "HelloWorld.java"
        ]
    }
    ],
    "artifacts": {
        "objects": {
            "location": "gs://[BUCKET_NAME]/[FOLDER_NAME]",
            "paths": [
                "HelloWorld.java",
                "HelloWorld.class"
            ]
        }
    }
}

Como usar caracteres curinga para fazer upload de mais de um artefato

Ao fazer o upload de vários artefatos, use caracteres curinga da gsutil em paths para especificar vários arquivos.

O argumento usado no exemplo a seguir é um arquivo chamado classes, contendo os nomes dos arquivos .java a serem compilados. Em seguida, é feito o upload de qualquer arquivo .class para o intervalo especificado do Cloud Storage:

YAML

steps:
- name: 'gcr.io/cloud-builders/javac'
  args: ['@classes']
artifacts:
  objects:
    location: 'gs://[STORAGE_LOCATION]/'
    paths: ['*.class']

JSON

{
    "steps": [
    {
        "name": "gcr.io/cloud-builders/javac",
        "args": [
            "@classes"
        ]
    }
    ],
    "artifacts": {
        "objects": {
            "location": "gs://[STORAGE_LOCATION]/",
            "paths": [
                "*.class"
            ]
        }
    }
}

Como usar variáveis de substituição no local do intervalo

É possível usar variáveis de substituição para especificar uma pasta dentro do intervalo do Cloud Storage, se a pasta já estiver no intervalo. A versão retornará um erro se a pasta não existir.

No exemplo abaixo, é feito o upload dos artefatos para um caminho do Cloud Storage que inclui o nome do projeto do GCP em que a compilação foi executada (como gs://mybucket/myproject/):

YAML

steps:
- name: 'gcr.io/cloud-builders/javac'
  args: ['@classes']
artifacts:
  objects:
    location: 'gs://[BUCKET_NAME]/$PROJECT_ID'
    paths: ['helloworld.class']

JSON

{
    "steps": [
    {
        "name": "gcr.io/cloud-builders/javac",
        "args": [
            "@classes"
        ]
    }
    ],
    "artifacts": {
        "objects": {
            "location": "gs://[BUCKET_NAME]/$PROJECT_ID",
            "paths": [
                "helloworld.class"
            ]
        }
    }
}

A seguir