Cloud Storage へのビルド アーティファクトの保存

このページでは、Cloud Storage にビルド アーティファクトを保存する方法について説明します。

ビルド アーティファクトの保存には Artifact Registry を使用することをおすすめします。Artifact Registry は、Cloud Build と統合して、限定公開リポジトリまたは公開リポジトリにアーティファクトを安全に保存して管理できるGoogle Cloud プロダクトです。Artifact Registry にアーティファクトを保存すると、次のことが可能になります。

ビルドのパッケージとイメージを Artifact Registry に保存するように Cloud Build を構成する手順については、Artifact Registry にアーティファクトを保存するをご覧ください。

アーティファクトを 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/myproject/builds など)。 既存のバケットの名前を確認するには、バケットを一覧表示するまたは新しいバケットを作成するをご覧ください。
  • [ARTIFACT_PATH]: 1 つ以上のアーティファクトへのパス。[ARTIFACT_PATH] は作業ディレクトリを基準とします。これは、Cloud Build のデフォルトの作業ディレクトリである /workspace と、dir フィールドを使用して設定した作業ディレクトリのいずれかになります。

JSON

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

ここで

  • [STORAGE_LOCATION]: Cloud Build がアーティファクトを保存する必要のある、Cloud Storage バケットまたはバケット内のフォルダ(gs://mybucketgs://mybucket/myproject/builds など)。 既存のバケットの名前を確認するには、バケットを一覧表示するまたは新しいバケットを作成するをご覧ください。
  • [ARTIFACT_PATH]: 1 つ以上のアーティファクトへのパス。[ARTIFACT_PATH] は作業ディレクトリを基準とします。これは、Cloud Build のデフォルトの作業ディレクトリである /workspace と、dir フィールドを使用して設定した作業ディレクトリのいずれかになります。

アーティファクトを Cloud Storage に保存する際には、以下の注意点があります。

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

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

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

ビルドが正常に完了した後、[STORAGE_LOCATION]/artifacts-$BUILD_ID.json にある JSON マニフェスト ファイルでアップロードの結果を確認できます。

JSON マニフェスト ファイルには、次のフィールドがあります。

  • location: アーティファクトが gs://[STORAGE_LOCATION]/[FILE_NAME]#[GENERATION_NUMBER] 形式で保存される Cloud Storage 内の場所を指定します。世代番号を使用して、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"
            ]
        }
    }
}

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

複数のアーティファクトをアップロードする場合、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 によって作成されます。

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

次のステップ