存储构建工件

如果您的构建会生成二进制文件或压缩包之类的工件,您可以选择将这些工件存储到 Cloud Storage 或任何私有第三方代码库中。

本页面介绍了如何在 Cloud Storage 中存储构建工件。如需了解如何存储容器映像,请参阅构建容器映像

在 Cloud Storage 中存储工件

如需在 Cloud Storage 存储非容器工件,请在构建配置文件中添加一个 artifacts 字段,并在其中提供用于存储工件的存储分区的位置以及一个或多个工件的路径:

YAML

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

其中:

  • [STORAGE_LOCATION] 指定 Cloud Build 必须在哪个 Cloud Storage 存储分区(或者其中的某个文件夹)中存储工件,例如 gs://mybucketgs://mybucket/some/folder
  • [ARTIFACT_PATH]:一个或多个工件的路径。

JSON

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

其中:

  • [STORAGE_LOCATION] 指定 Cloud Build 必须在哪个 Cloud Storage 存储分区(或者其中的某个文件夹)中存储工件,例如 gs://mybucketgs://mybucket/some/folder
  • [ARTIFACT_PATH]:一个或多个工件的路径。

您只能指定一个存储分区来上传软件工件,并且您必须是此存储分区的所有者。您可以在存储分区中指定有效的目录路径。

您可以上传任意数量的软件工件,但最多只能指定一百个软件工件路径。

如果将软件工件上传到具有同名软件工件的存储分区,则新软件工件将替换现有软件工件。如果您不希望较新的软件工件替换同名的现有软件工件,则可以为存储分区启用对象版本控制

构建成功完成后,您可以在位于 [STORAGE_LOCATION]/artifacts-$BUILD_ID.json 的 JSON 清单文件中找到上传结果。

JSON 清单文件包含以下字段:

  • location:此字段指定 Cloud Storage 中存储工件的位置,格式为 gs://[STORAGE_LOCATION]/[FILE_NAME]#[GENERATION_NUMBER]。您可以使用世代编号来唯一地标识 Cloud Storage 存储分区中的数据版本。
  • file_hash:指定哈希类型和值。哈希类型始终为 2,它规定执行 MD5 哈希。

工件示例

以下示例展示了如何使用构建配置文件中的 Artifacts 字段。在所有这些示例中,将 [VALUES_IN_BRACKETS] 替换为适当的值。

上传文件和文件夹

下面的构建配置文件会将 helloworld.class 上传到 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"
            ]
        }
    }
}

要上传多个软件工件,请指定每个软件工件的路径,并以逗号分隔。以下示例将 HelloWorld.javaHelloWorld.classcloudbuild.yaml 上传到 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"
            ]
        }
    }
}

您还可以将工件上传到存储分区中的有效目录路径。以下示例将 HelloWorld.javaHelloWorld.class 上传到 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"
            ]
        }
    }
}

使用通配符上传多个工件

上传多个工件时,您可以在 paths 中使用 gsutil 通配符来指定多个文件。

以下示例将一个名为 classes 的文件用作参数,其中包含要编译的 .java 文件的名称。随后,它会将任意 .class 文件上传到指定的 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"
            ]
        }
    }
}

在存储分区位置使用替代变量

如果 Cloud Storage 存储分区中已存在一个文件夹,则可以使用替代变量来指定此存储分区中的文件夹。如果文件夹不存在,则构建将返回错误。

以下示例将工件上传到一个 Cloud Storage 路径,该路径包含运行构建的 Cloud 项目的名称(如 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"
            ]
        }
    }
}

在 Artifact Registry 中存储工件

Artifact Registry 是 Container Registry 的进化版产品。它支持 Docker 映像、Maven 软件包和 npm 软件包,让您可以将工件存储到可扩缩、集成式的代码库服务中。如需了解配置 Cloud Build 以在 Artifact Registry 中存储构建工件的说明,请参阅与 Cloud Build 集成

后续步骤