儲存映像檔與成果

如果建構產生容器映像檔、二進位檔或 TAR 壓縮檔等成果,您可以選擇將其儲存在 Container Registry、Cloud Storage 或任何私人第三方存放區中。

本頁面說明如何將容器映像檔儲存在 Container Registry 中,以及如何將非容器成果儲存在 Cloud Storage 中。

將映像檔儲存於 Container Registry

如要在建構完成後將容器映像檔儲存於 Container Registry,請在建構設定檔中新增 images 欄位,並指向一個或多個映像檔:

YAML

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

其中 [IMAGE_NAME] 是您要儲存的映像檔名稱,例如 gcr.io/myproject/myimage

JSON

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

其中 [IMAGE_NAME] 是您要儲存的映像檔名稱,例如 gcr.io/myproject/myimage

下列範例會建構名為 myimage 的 Docker 映像檔,並將其儲存在 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"
    ]
}

如要將映像檔儲存於 Container Registry,做為建構流程的一部分,請新增一個 docker 建構步驟,並傳入引數,以叫用 push 指令:

YAML

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

其中 [IMAGE_NAME] 是您要儲存在 Container Registry 中的映像檔名稱,例如 gcr.io/myproject/myimage

JSON

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

其中 [IMAGE_NAME] 是您要儲存在 Container Registry 中的映像檔名稱,例如 gcr.io/myproject/myimage

下列範例會透過新增其他 Docker 建構步驟並將映像檔推送至 Container Registry,來建構名為 myimage 的 docker 映像檔,並儲存該映像檔:

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"
        ]
    }
    ]
}

使用 images 欄位與 Docker push 指令的區別在於,如果您使用 images 欄位,儲存的映像檔將顯示在建構結果中。這包括 GCP 主控台中的「Build description」(建構說明) 頁面、Build.get() 的結果和 gcloud builds list 的結果。然而,如果您使用 Docker push 指令儲存建構的映像檔,映像檔將不會顯示在建構結果中。

如要將儲存映像檔做為建構流程的一部分,並於建構結果中顯示映像檔,請使用 Docker push 指令和建構設定中的 images 欄位:

YAML

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

其中 [IMAGE_NAME] 是映像檔的名稱,例如 gcr.io/myproject/myimage

JSON

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

其中 [IMAGE_NAME] 是映像檔的名稱,例如 gcr.io/myproject/myimage

下列範例會建構名為 myimage 的 docker 映像檔,並做為建構流程的一部分,在建構完成之後儲存映像檔:

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"
    ]
}

將成果儲存在 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]:一或多個成果的路徑。

您只能指定一個值區來上傳成果,而且您必須是值區的擁有者。您可以在值區中指定有效目錄路徑。

您可以上傳任意數量的成果,但只能指定最多一百個成果路徑。

如果您將成果上傳至一個值區,而這個值區中已經有名稱相同的成果,則新成果將取代現有成果。如果您不想讓新成果取代名稱相同的現有成果,可為值區啟用物件版本管理功能

建構建構成功完成之後,您可以在 JSON 資訊清單檔案中找到上傳結果,該檔案位於 [STORAGE_LOCATION]/artifacts-$BUILD_ID.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"
            ]
        }
    }
}

在值區位置中使用 substitution 變數

如果資料夾已存在於值區中,您可以使用 substitution 變數指定 Cloud Storage 值區內的資料夾。如果資料夾不存在,建構將傳回錯誤。

以下範例會將成果上傳至 Cloud Storage 路徑,該路徑中包含執行建構時所在的 GCP 專案名稱 (例如 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"
            ]
        }
    }
}

後續步驟

傳送您對下列選項的寶貴意見...

這個網頁
Cloud Build