Vous pouvez spécifier l'ordre dans lequel vos étapes de compilation sont exécutées. Par défaut, les étapes de compilation s'exécutent de manière séquentielle, mais vous pouvez les configurer pour qu'elles exécutent simultanément.
Cette page explique comment configurer l'ordre des étapes de compilation.
Ordre des étapes de compilation et dépendances
Utilisez le champ waitFor
dans une étape de compilation pour spécifier les étapes à exécuter avant l'exécution de l'étape de compilation. Si aucune valeur n'est fournie pour le champ waitFor
, l'étape de compilation attend que toutes les étapes de compilation précédentes dans la requête de compilation soient terminées avant de s'exécuter.
Pour exécuter immédiatement une étape de compilation au moment de la compilation, saisissez -
dans le champ waitFor
.
L'ordre des étapes de compilation du champ steps
correspond à l'ordre d'exécution des étapes. Les étapes seront exécutées en série ou simultanément en fonction des dépendances définies dans leurs champs waitFor
.
Une étape dépend de chaque id
dans son champ waitFor
et ne sera lancée que lorsque chaque dépendance sera terminée.
Les étapes ne disposant pas du champ waitFor
facultatif (ou disposant d'un champ waitFor
vide) attendent que toutes les étapes précédentes se soient terminées avant de s'exécuter. Par conséquent, si aucune étape ne contient de id
dans son champ waitFor
, toutes les étapes sont exécutées en série dans l'ordre dans lequel elles ont été définies.
Les étapes peuvent dépendre du début de la compilation si le champ waitFor
ne contient que -
. En déclarant qu'une étape ne dépend que de -
, l'étape s'exécute immédiatement au démarrage de la compilation. La première étape définie dépend implicitement du démarrage.
L'extrait de code suivant montre une configuration de compilation avec deux étapes exécutées en série :
YAML
steps:
- name: foo
- name: bar
JSON
{
"steps": [{
"name": "foo"
},
{
"name": "bar"
}
]
}
L'extrait de code suivant montre deux étapes simultanées qui dépendent toutes les deux du démarrage ; la troisième étape attend que les deux premières se terminent avec succès avant de se lancer. Cette compilation simultanée exécute les étapes A
et B
au début de la compilation. La troisième étape attend implicitement que les deux étapes précédentes soient terminées avant de démarrer. Cet exemple peut être simplifié en omettant les champs id
, auxquels il n'est pas fait référence ultérieurement dans un champ waitFor
.
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"
}
]
}
L'extrait de code suivant montre les étapes simultanées qui dépendent d'une étape précédente. L'étape A
s'exécute immédiatement au démarrage de la compilation. Les étapes B
et C
s'exécutent simultanément une fois l'étape A
terminée. Notez que les champs id
et waitFor
de l'étape B
, ainsi que le champ id
de l'étape C
, peuvent être omis sans modifier l'ordre d'exécution.
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"
]
}
]
}
Exemples
L'exemple ci-dessous appelle les étapes gsutil
et wget
simultanément.
Une fois ces étapes terminées, l'étape ubuntu
est appelée.
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"
]
}
]
}
L'exemple ci-dessous utilise le champ id
pour identifier certaines étapes de compilation. Les valeurs de id
sont utilisées dans le champ waitFor
pour définir l'ordre des étapes de compilation :
- Tout d'abord, l'étape
fetch-resources
utilisegsutil
pour copier les ressources locales depuis Cloud Storage. Simultanément,go
génère, teste et installe le code source. Ensuite, l'étape de compilation
docker
compile l'image une fois que toutes les autres étapes sont terminées.
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"
]
}
Étape suivante
- Configurez Cloud Build pour compiler, tester et déployer des artefacts.
- Découvrez comment exécuter des compilations manuellement et utiliser des déclencheurs.