Configura el orden de los pasos de compilación

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 manera secuencial, pero puedes configurarlos para que se ejecuten en simultáneo.

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 del paso de compilación para especificar qué pasos se deben ejecutar antes que dicho paso. Si no se proporciona ningún valor en waitFor, el paso de compilación no se ejecutará hasta que todos los pasos de compilación de la solicitud de compilación se completen de manera correcta.

Para ejecutar un paso de compilación de forma inmediata en el tiempo de compilación, usa - en el campo waitFor.

Los pasos de compilación del campo steps siguen el orden en el que se ejecutan. Los pasos se ejecutarán en serie o de forma simultánea según las dependencias definidas en los campos waitFor.

Los pasos dependen del id del campo waitFor, y no se iniciarán hasta que cada dependencia se complete de manera correcta.

Los pasos que no cuenten con el campo opcional waitFor (o cuyo campo waitFor esté vacío) no se ejecutarán hasta que todos los pasos anteriores se completen de manera correcta. Por lo tanto, si ningún paso contiene un id en el campo waitFor, todos los pasos se ejecutarán en serie según el orden en el que se definieron.

Los pasos pueden depender del inicio de la compilación si waitFor solo contiene -. Si declaras que un paso depende solo de -, este se ejecutará de forma inmediata cuando se inicie la compilación. El primer paso definido depende, de forma implícita, del inicio.

En el siguiente fragmento, se muestra una configuración de compilación con dos pasos que se ejecutan de forma consecutiva:

YAML

steps:
- name: foo
- name: bar

JSON

{
    "steps": [{
        "name": "foo"
    },
    {
        "name": "bar"
    }
    ]
}

En el fragmento siguiente, se muestran dos pasos simultáneos que dependen del inicio. El tercer paso espera a que los dos primeros se completen de forma correcta antes de iniciarse. Esta compilación simultánea ejecuta los pasos A y B al comienzo de la compilación. Antes de comenzar, el tercer paso esperará, de forma implícita, hasta que los dos pasos anteriores finalicen. Este ejemplo se podría simplificar si se omiten los campos id, que no aparecen en ningún 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 de forma inmediata cuando comienza la compilación. Los pasos B y C se ejecutan en simultáneo una vez que A se completa de manera correcta. 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 llama a los pasos gsutil y wget de forma simultánea. Cuando se completan 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/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"
      ]
    }
  ]
}

En el siguiente ejemplo, se usa el campo id para identificar ciertos pasos de compilación. Los valores de id se usan en waitFor para definir el orden de los pasos de compilación, como se indica a continuación:

  • Primero, en el paso fetch-resources se usa gsutil para copiar los recursos locales desde Cloud Storage. Al mismo tiempo, go genera, prueba y, luego, instala el código fuente.
  • Luego, una vez que se completan los otros pasos, el paso de compilación docker compila la imagen.

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"
  ]
}

¿Qué sigue?