イメージとアーティファクトの保存

ビルドでコンテナ イメージ、バイナリ、tarball などのアーティファクトが生成される場合、それらを Container Registry、Cloud Storage、非公開のサードパーティ リポジトリに保存できます。

このページでは、コンテナ イメージを Container Registry に保存する方法と、コンテナ以外のアーティファクトを Cloud Storage に保存する方法について説明します。

イメージを Container Registry に保存する

ビルドが完了した後、コンテナ イメージを Container Registry に保存するには、1 つ以上のイメージを指す 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 など)。

次の例では、myimage という名前の Docker イメージをビルドし、別の Docker ビルドステップを追加し、イメージを Container Registry に push することでそのイメージを保存しています。

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 Console のビルドの [ビルドの説明] ページや、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 に保存するには、アーティファクトを保存するバケットのロケーションと 1 つ以上のアーティファクトへのパスを設定した 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]: 1 つ以上のアーティファクトへのパス。

JSON

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

ここで

  • [STORAGE_LOCATION]: Cloud Build がアーティファクトを保存する必要のある、Cloud Storage バケットまたはバケット内のフォルダ(gs://mybucketgs://mybucket/some/folder など)。
  • [ARTIFACT_PATH]: 1 つ以上のアーティファクトへのパス。

アーティファクトをアップロードするバケットは 1 つのみ指定でき、バケットのオーナーでなければなりません。バケット内の有効なディレクトリのパスを指定できます。

アーティファクトはいくつでもアップロードできますが、アーティファクトのパスは最大で 100 個しか指定できません。

同じ名前のアーティファクトがすでにあるバケットにアーティファクトをアップロードすると、既存のアーティファクトが新しいアーティファクトに置き換えられます。同じ名前の既存のアーティファクトを新しいアーティファクトに置き換えたくない場合、バケットのオブジェクトのバージョニングを有効にできます。

ビルドが正常に完了した後、[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.classgs://[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.yamlgs://[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.classgs://[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"
            ]
        }
    }
}

ワイルドカード文字を使用して複数のアーティファクトをアップロードする

複数のアーティファクトをアップロードする場合、pathsgsutil ワイルドカード文字を使用すると複数のファイルを指定できます。

次の例では、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 バケット内にすでに存在する場合、代入変数を使用してバケット内のそのフォルダを指定できます。フォルダが存在しない場合、ビルドでエラーが返されます。

次の例では、ビルドの実行元の GCP プロジェクトの名前を含む Cloud Storage パス(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"
            ]
        }
    }
}

次のステップ

フィードバックを送信...