このページでは、Cloud Storage にビルド アーティファクトを保存する方法について説明します。
ビルド アーティファクトの保存には、Artifact Registry を使用することをおすすめします。Artifact Registry は、Cloud Build と統合して、限定公開リポジトリまたは公開リポジトリにアーティファクトを安全に保存して管理できる Google Cloud プロダクトです。アーティファクトを Artifact Registry に保存すると、次のことが可能になります。
- Artifact Analysis を使用して、コンテナのメタデータを管理し、コンテナの脆弱性をスキャンします。
- Binary Authorization を使用してデプロイ ポリシーを適用します。
- Google Kubernetes Engine のイメージ ストリーミングを使用します。これは、大規模なコンテナ イメージに特に有用です。
ビルドのパッケージとイメージを 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://mybucket
、gs://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://mybucket
、gs://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.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 によって作成されます。
次の例では、ビルドの実行元の 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"
]
}
}
}
次のステップ
Go
プロジェクトのビルド方法を学習する。- 手動でビルドを開始する方法と、トリガーを使用してビルドを開始する方法を学習する。
- ビルドエラーをトラブルシューティングする方法について学習する。