Puedes especificar el orden en el que se ejecutan los pasos de compilación. De forma predeterminada, los pasos de compilación se ejecutan de forma secuencial, pero puedes configurarlos para que se ejecuten simultáneamente.
En esta página se explica cómo configurar el orden de los pasos de compilación.
Orden y dependencias de los pasos de compilación
Usa el campo waitFor
en un paso de compilación para especificar qué pasos deben ejecutarse antes de que se ejecute el paso de compilación. Si no se proporcionan valores para waitFor
, el paso de compilación espera a que se completen correctamente todos los pasos de compilación anteriores de la solicitud de compilación antes de ejecutarse.
Para ejecutar un paso de compilación inmediatamente durante la compilación, usa -
en el campo waitFor
.
El orden de los pasos de compilación en el campo steps
se corresponde con el orden en el que se ejecutan los pasos. Los pasos se ejecutarán en serie o simultáneamente en función de las dependencias definidas en sus campos waitFor
.
Un paso depende de cada id
de su waitFor
y no se iniciará hasta que cada dependencia se haya completado correctamente.
Los pasos que no incluyan el campo opcional waitFor
(o que tengan un campo waitFor
vacío) esperarán a que se completen correctamente todos los pasos anteriores antes de ejecutarse. Por lo tanto, si ningún paso contiene un id
en su campo waitFor
, todos los pasos se ejecutarán de forma secuencial en el orden en el que se definan.
Los pasos pueden depender del inicio de la compilación si waitFor
solo contiene -
. Al declarar que un paso solo depende de -
, el paso se ejecuta inmediatamente
cuando se inicia la compilación. El primer paso definido depende implícitamente de start.
En el siguiente fragmento se muestra una configuración de compilación con dos pasos que se ejecutan en serie:
YAML
steps:
- name: foo
- name: bar
JSON
{
"steps": [{
"name": "foo"
},
{
"name": "bar"
}
]
}
El siguiente fragmento muestra dos pasos simultáneos que dependen de start. El tercer paso espera a que los dos primeros se completen correctamente antes de iniciarse. Esta compilación simultánea ejecuta los pasos A
y B
al inicio de la compilación. En el tercer paso se esperará implícitamente hasta que se hayan completado los dos pasos anteriores antes de empezar. Este ejemplo se podría simplificar omitiendo los campos id
, a los que no se hace referencia en un waitFor
posterior.
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"
}
]
}
En el siguiente fragmento se muestran pasos simultáneos que dependen de un paso anterior. El paso A
se ejecuta inmediatamente cuando se inicia la compilación. Los pasos B
y C
se ejecutan
simultáneamente después de que A
se haya completado correctamente. Ten en cuenta que los campos id
y waitFor
del paso B
, y el campo id
del paso C
, se podrían omitir sin cambiar el orden de ejecución.
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"
]
}
]
}
Ejemplos
En el siguiente ejemplo se llaman los pasos gcloud storage
y wget
simultáneamente.
Una vez completados estos pasos, se llama al paso 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/gcloud'
args: ['storage', '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/gcloud",
"args": [
"storage",
"cp",
"gs://$PROJECT_ID-data/rawdata.tgz",
"."
],
"waitFor": [
"-"
]
},
{
"name": "ubuntu",
"args": [
"./binary",
"rawdata.tgz"
]
}
]
}
En el ejemplo siguiente se usa el campo id
para identificar determinados pasos de compilación. Los valores de id
se usan en waitFor
para definir el orden de los pasos de compilación:
- En el primer
fetch-resources
paso se usagcloud storage
para copiar los recursos locales de Cloud Storage. Al mismo tiempo,go
genera, prueba e instala el código fuente. A continuación, el paso de compilación
docker
compila la imagen una vez que se han completado todos los demás pasos.
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/gcloud'
args: ['storage', '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/gcloud",
"args": [
"storage",
"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"
]
}
Siguientes pasos
- Configura Cloud Build para compilar, probar y desplegar artefactos.
- Consulta cómo ejecutar compilaciones manualmente y mediante activadores.