本頁說明如何將建構構件儲存在 Cloud Storage 中。
建議使用 Artifact Registry 儲存建構構件。Artifact Registry 是一項Google Cloud 產品,可與 Cloud Build 整合,在私人或公開存放區中安全地儲存及管理構件。將構件儲存在 Artifact Registry 中,即可執行下列操作:
- 使用 Artifact Analysis 管理容器中繼資料,並掃描容器安全漏洞。
- 使用二進位授權強制執行部署政策。
- 在 Google Kubernetes Engine 中使用映像檔串流,這對大型容器映像檔特別有益。
如要瞭解如何設定 Cloud Build,將建構作業中的套件和映像檔儲存在 Artifact Registry,請參閱「在 Artifact Registry 中儲存構件」。
將成果儲存在 Cloud Storage 中
如要將非容器構件儲存於 Cloud Storage,請在建構設定檔中新增 artifacts 欄位,其中包含要儲存構件的 bucket 位置及一或多個構件的路徑:
YAML
artifacts:
objects:
location: [STORAGE_LOCATION]
paths: [[ARTIFACT_PATH],[ARTIFACT_PATH], ...]
其中
[STORAGE_LOCATION]:Cloud Build 儲存構件時必須處於的 Cloud Storage bucket 或 bucket 內的資料夾,例如gs://mybucket或gs://mybucket/myproject/builds。如要查看現有 bucket 的名稱,請參閱列出 bucket或建立新 bucket。[ARTIFACT_PATH]:一或多個構件的路徑。[ARTIFACT_PATH]是相對於工作目錄的路徑。這可以是/workspace,也就是 Cloud Build 的預設工作目錄,也可以是您使用dir欄位設定的工作目錄。
JSON
{
"artifacts": {
"objects": {
"location": [
"[STORAGE_LOCATION]"
],
"paths": [
[
"[ARTIFACT_PATH]"
],
[
"[ARTIFACT_PATH]"
],
"..."
]
}
}
}
其中
將成果儲存在 Cloud Storage 時,請注意下列注意事項:
您只能指定一個值區來上傳成果,而且您必須是值區的擁有者。您可以在值區中指定有效目錄路徑。
您可以上傳任意數量的成果,但只能指定最多一百個成果路徑。
如果您將成果上傳至一個值區,而這個值區中已經有名稱相同的成果,則新成果將取代現有成果。如果您不想讓新成果取代名稱相同的現有成果,可為值區啟用物件版本管理功能。
建構建構成功完成之後,您可以在 JSON 資訊清單檔案中找到上傳結果,該檔案位於 [STORAGE_LOCATION]/artifacts-$BUILD_ID.json。
JSON 資訊清單檔案有下列欄位:
location:這個欄位指定在 Cloud Storage 中儲存構件的位置,格式為gs://[STORAGE_LOCATION]/[FILE_NAME]#[GENERATION_NUMBER]。您可以使用版本編號專門識別 Cloud Storage bucket 中的資料版本。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"
]
}
}
}
在值區位置中使用 substitution 變數
您可以使用替代變數指定 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"
]
}
}
}