Configurazione dell'ordine dei passi di build

Puoi specificare l'ordine in cui vengono eseguiti i passi di build. Per impostazione predefinita, i passaggi di build vengono eseguiti in sequenza, ma puoi configurarli in modo che vengano eseguiti contemporaneamente.

In questa pagina viene spiegato come configurare l'ordine dei passi di build.

Ordine dei passaggi di creazione e dipendenze

Utilizza il campo waitFor in un passaggio di build per specificare quali passi devono essere eseguiti prima di quello di build. Se non vengono forniti valori per waitFor, il passaggio di build attende che tutti i passaggi di build precedenti nella richiesta di build vengano completati correttamente prima dell'esecuzione.

Per eseguire immediatamente un passaggio di build al momento della build, utilizza - nel campo waitFor.

L'ordine dei passaggi di build nel campo steps è relativo all'ordine in cui vengono eseguiti i passaggi. I passaggi verranno eseguiti in serie o contemporaneamente in base alle dipendenze definite nei campi waitFor.

Un passaggio dipende da ogni id nel relativo waitFor e non verrà avviato finché ogni dipendenza non viene completata correttamente.

I passaggi senza il campo facoltativo waitFor (o con un waitFor vuoto) attenderanno il completamento corretto di tutti i passaggi precedenti prima di essere eseguiti. Di conseguenza, se nessun passaggio contiene un valore id nel campo waitFor, tutti i passaggi verranno eseguiti in serie nell'ordine in cui sono stati definiti.

I passaggi possono dipendere dall'inizio della build perché waitFor contiene solo -. Dichiarando che un passaggio dipende solo da -, il passaggio viene eseguito immediatamente all'avvio della build. Il primo passaggio definito dipende implicitamente dall'inizio.

Lo snippet seguente mostra una configurazione di build con due passaggi eseguiti in serie:

YAML

steps:
- name: foo
- name: bar

JSON

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

Lo snippet seguente mostra due passaggi simultanei che dipendono dall'avvio; il terzo passaggio attende il completamento corretto dei primi due prima dell'avvio. Questa build simultanea esegue i passaggi A e B all'inizio della build. Il terzo passaggio attenderà implicitamente il completamento di entrambi i passaggi precedenti prima di iniziare. Questo esempio potrebbe essere semplificato omettendo i campi id, a cui non si fa riferimento in una waitFor successiva.

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

Lo snippet seguente mostra i passaggi simultanei che dipendono da un passaggio precedente. Il passaggio A viene eseguito immediatamente all'avvio della build. I passaggi B e C vengono eseguiti contemporaneamente dopo il completamento di A. Tieni presente che i campi id e waitFor nel passaggio B e il campo id nel passaggio C potrebbero essere omessi senza modificare l'ordine di esecuzione.

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

Esempi

L'esempio seguente chiama contemporaneamente i passaggi gsutil e wget. Una volta completati questi passaggi, viene richiamato il passaggio 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"
      ]
    }
  ]
}

L'esempio seguente utilizza il campo id per identificare determinati passaggi di build. I valori di id vengono utilizzati in waitFor per definire l'ordine dei passaggi di build:

  • In primo luogo, il passaggio fetch-resources utilizza gsutil per copiare le risorse locali da Cloud Storage. Contemporaneamente, go genera, testa e installa il codice sorgente.
  • Il passaggio di build docker crea l'immagine dopo aver completato tutti gli altri passaggi.

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

Passaggi successivi