在 Cloud Storage 中存储构建工件

本页面介绍了如何在 Cloud Storage 中存储构建工件。

我们建议使用 Artifact Registry 存储构建工件。Artifact Registry 是一款可与 Cloud Build 集成的 Google Cloud 产品,可在私有代码库中或公共代码库中安全地存储和管理工件。通过在 Artifact Registry 中存储工件,您可以:

如需了解如何配置 Cloud Build 以在 Artifact Registry 中存储 build 中的软件包和映像,请参阅将工件存储在 Artifact Registry 中

在 Cloud Storage 中存储工件

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

YAML

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

其中:

  • [STORAGE_LOCATION]:Cloud Storage 存储桶或该存储桶中 Cloud Build 必须存储工件的文件夹,例如 gs://mybucketgs://mybucket/myproject/builds。如需查找现有存储桶的名称,请参阅列出存储桶创建新存储桶
  • [ARTIFACT_PATH]:一个或多个工件的路径。 [ARTIFACT_PATH] 相对于工作目录。该目录可以是 /workspace(即 Cloud Build 的默认工作目录),也可以是使用 dir 字段设置的工作目录。

JSON

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

其中:

  • [STORAGE_LOCATION]:Cloud Storage 存储桶或该存储桶中 Cloud Build 必须存储工件的文件夹,例如 gs://mybucketgs://mybucket/myproject/builds。如需查找现有存储桶的名称,请参阅列出存储桶创建新存储桶
  • [ARTIFACT_PATH]:一个或多个工件的路径。 [ARTIFACT_PATH] 相对于工作目录。该目录可以是 /workspace(即 Cloud Build 的默认工作目录),也可以是使用 dir 字段设置的工作目录。

在 Cloud Storage 中存储工件时,请注意以下警告:

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

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

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

构建成功完成后,您可以在位于 [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 Build 将会创建该文件夹。

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

后续步骤