本页面介绍了如何在 Cloud Storage 中存储构建工件。
我们建议使用 Artifact Registry 来存储构建工件。Artifact Registry 是一款 Google Cloud 产品,您可以将其与 Cloud Build 集成,以便在私有或公共代码库中安全地存储和管理工件。通过在 Artifact Registry 中存储工件,您可以:
- 管理容器元数据并扫描容器漏洞, Artifact Analysis。
- 使用 Binary Authorization 强制执行部署政策。
- 在 Google Kubernetes Engine 中使用映像流式传输, 这对大型容器映像特别有用
如需了解如何配置 Cloud Build 以将构建中的软件包和映像存储在 Artifact Registry 中,请参阅在 Artifact Registry 中存储工件。
在 Cloud Storage 中存储工件
如需在 Cloud Storage 存储非容器工件,请在构建配置文件中添加一个 artifacts
字段,并在其中提供用于存储工件的存储分区的位置以及一个或多个工件的路径:
YAML
artifacts:
objects:
location: [STORAGE_LOCATION]
paths: [[ARTIFACT_PATH],[ARTIFACT_PATH], ...]
其中:
JSON
{
"artifacts": {
"objects": {
"location": [
"[STORAGE_LOCATION]"
],
"paths": [
[
"[ARTIFACT_PATH]"
],
[
"[ARTIFACT_PATH]"
],
"..."
]
}
}
}
其中:
在 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.java
和 HelloWorld.class
和 cloudbuild.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.java
和 HelloWorld.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
中的通配符,用于指定多个
文件。
以下示例将一个名为 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"
]
}
}
}