ビルドステップの実行順序を指定できます。デフォルトでは、ビルドステップは順番に実行されますが、同時に実行するように構成することもできます。
このページでは、ビルドステップの順序を構成する方法について説明します。
ビルドステップの順序と依存関係
ビルドステップで waitFor
フィールドを使用して、そのビルドステップの前に実行する必要のあるステップを指定します。waitFor
の値が指定されない場合、ビルドステップは、ビルド リクエスト内の先行するすべてのビルドステップが正常に完了するまで待機した後に実行されます。
ビルドステップをビルド時にすぐに実行するには、waitFor
フィールドで -
を使用します。
steps
フィールド内のビルドステップの順序は、ステップが実行される順序に関係します。ステップは waitFor
フィールド内で定義された依存関係に基づいて、順次または同時に実行されます。
ステップは、その waitFor
内のすべての id
に依存し、各依存関係が正常に終了するまで開始しません。
オプションの waitFor
フィールドを使用しない(または waitFor
が空の)ステップは、先行するすべてのステップが正常に終了するまで開始しません。したがって、waitFor
フィールドに id
が含まれるステップがない場合、すべてのステップが定義された順序で 1 つずつ順番に実行されます。
ステップに -
のみが含まれた waitFor
があると、ビルドの開始に依存できます。ステップが -
のみに依存すると宣言した場合、そのステップはビルド開始時にすぐに実行されます。最初に定義されたステップは、暗黙的に開始に依存します。
次のスニペットは、連続して実行される 2 つのステップを含むビルド構成を示しています。
YAML
steps:
- name: foo
- name: bar
JSON
{
"steps": [{
"name": "foo"
},
{
"name": "bar"
}
]
}
次のスニペットは、開始に依存する 2 つの同時ステップを示しています。3 番目のステップは、最初の 2 つのステップが正常に終了した後、開始します。この同時ビルドは、ビルドの開始時点でステップの A
と B
を実行します。3 番目のステップは、先行する両方のステップが完了するまで、暗黙的に待機します。この例は、後続の waitFor
で参照されていない id
フィールドを省略することで簡略化できます。
YAML
steps:
- name: foo
id: A
- name: bar
id: B
waitFor: ['-']
- name: baz
JSON
{
"steps": [
{
"name": "foo",
"id": "A"
},
{
"name": "bar",
"id": "B",
"waitFor": ["-"]
},
{
"name": "baz"
}
]
}
次のスニペットは、前のステップに依存する同時ステップを示しています。ステップ A
は、ビルド開始時にすぐに実行されます。ステップ B
と C
は、A
が正常に完了した後に同時に実行されます。ステップ B
の id
と waitFor
の各フィールドと、ステップ C
の id
フィールドは、省略しても実行順序が変化しないことに注意してください。
YAML
steps:
- name: foo
id: A
- name: bar
id: B
waitFor:
- A
- name: baz
id: C
waitFor:
- A
JSON
{
"steps": [
{
"name": "foo",
"id": "A"
},
{
"name": "bar",
"id": "B",
"waitFor": [
"A"
]
},
{
"name": "baz",
"id": "C",
"waitFor": [
"A"
]
}
]
}
例
以下の例では、gsutil
ステップと wget
ステップを同時に呼び出しています。
これらのステップが完了した後、ubuntu
ステップが呼び出されます。
YAML
steps:
# Download the binary and the data in parallel.
- name: 'gcr.io/cloud-builders/wget'
args: ['https://example.com/binary']
- name: 'gcr.io/cloud-builders/gsutil'
args: ['cp', 'gs://$PROJECT_ID-data/rawdata.tgz', '.']
waitFor: ['-'] # The '-' indicates that this step begins immediately.
# Run the binary on the data, once both are downloaded.
- name: 'ubuntu'
args: ['./binary', 'rawdata.tgz']
JSON
{
"steps": [
{
"name": "gcr.io/cloud-builders/wget",
"args": [
"https://example.com/binary"
]
},
{
"name": "gcr.io/cloud-builders/gsutil",
"args": [
"cp",
"gs://$PROJECT_ID-data/rawdata.tgz",
"."
],
"waitFor": [
"-"
]
},
{
"name": "ubuntu",
"args": [
"./binary",
"rawdata.tgz"
]
}
]
}
以下の例では、id
フィールドを使用して、特定のビルドステップを特定します。id
の値は、ビルドステップの順序を定義するために waitFor
で使用されます。
- 最初に、
fetch-resources
ステップでgsutil
を使用して Cloud Storage のローカル リソースをコピーします。同時に、go
でソースコードを生成、テスト、インストールします。 その後、他のすべてのステップが完了してから、
docker
ビルドステップでイメージがビルドされます。
YAML
steps:
- name: 'gcr.io/cloud-builders/go'
args: ['generate']
- name: 'gcr.io/cloud-builders/go'
args: ['test', './...']
- name: 'gcr.io/cloud-builders/go'
args: ['install', 'mytarget']
id: 'go-install'
- name: 'gcr.io/cloud-builders/gsutil'
args: ['cp', '-r', './somefiles', 'gs://my-resource-bucket/somefiles']
waitFor: ['-'] # The '-' indicates that this step begins immediately.
id: 'fetch-resources'
- name: 'gcr.io/cloud-builders/docker'
args: ['build', '-t', 'gcr.io/$PROJECT_ID/mytarget', '.']
waitFor: ['go-install', 'fetch-resources']
images: ['gcr.io/$PROJECT_ID/mytarget']
JSON
{
"steps": [
{
"name": "gcr.io/cloud-builders/go",
"args": [
"generate"
]
},
{
"name": "gcr.io/cloud-builders/go",
"args": [
"test",
"./..."
]
},
{
"name": "gcr.io/cloud-builders/go",
"args": [
"install",
"mytarget"
],
"id": "go-install"
},
{
"name": "gcr.io/cloud-builders/gsutil",
"args": [
"cp",
"-r",
"./somefiles",
"gs://my-resource-bucket/somefiles"
],
"waitFor": [
"-"
],
"id": "fetch-resources"
},
{
"name": "gcr.io/cloud-builders/docker",
"args": [
"build",
"-t",
"gcr.io/$PROJECT_ID/mytarget",
"."
],
"waitFor": [
"go-install",
"fetch-resources"
]
}
],
"images": [
"gcr.io/$PROJECT_ID/mytarget"
]
}
次のステップ
- アーティファクトのビルド、テスト、デプロイを行うように、Cloud Build を構成する。
- ビルドを手動で実行する方法とトリガーを使用して実行する方法を学習する。