Configurazione dell'ordine dei passi di build

Puoi specificare l'ordine in cui vengono eseguiti i passaggi della build. Per impostazione predefinita, i passaggi di build vengono eseguiti in sequenza, ma puoi configurarli per l'esecuzione in contemporanea.

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

Ordine e dipendenze dei passaggi di build

Utilizza il campo waitFor in un passaggio di compilazione per specificare quali passaggi devono essere eseguiti prima di eseguire il passaggio di compilazione. Se non vengono forniti valori per waitFor, il passaggio di build attende il completamento corretto di tutti i passaggi di build precedenti nella richiesta di build prima dell'esecuzione.

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

L'ordine dei passaggi di build nel campo steps è correlato all'ordine in cui vengono eseguiti tutti i passaggi. I passaggi verranno eseguiti in sequenza o in contemporanea in base alle dipendenze definite nei relativi campi waitFor.

Un passaggio dipende da ogni id in waitFor e non verrà avviato fino a ogni dipendenza è stata completata correttamente.

I passaggi senza il campo facoltativo waitFor (o con un waitFor vuoto) aspettano il completamento di tutti i passaggi precedenti prima di essere eseguiti. Pertanto, se nessun passaggio contiene un id nel campo waitFor, tutti i passaggi verranno eseguiti in sequenza nell'ordine in cui sono definiti.

I passaggi possono dipendere dall'inizio della compilazione facendo in modo che waitFor contenga solo -. Se dichiari che un passaggio dipende solo da -, 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 che vengono eseguiti in sequenza:

YAML

steps:
- name: foo
- name: bar

JSON

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

Lo snippet seguente mostra due passaggi simultanei che dipendono entrambi dall'inizio: il il terzo passaggio attende che i primi due vengano completati correttamente prima in fase di avvio. Questa build simultanea esegue i passaggi A e B all'inizio della creare. Il terzo passaggio attenderà implicitamente il completamento di entrambi i passaggi precedenti prima di iniziare. Questo esempio può essere semplificato omettendo id campi, che non fanno 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. Passaggi B e C di corsa contemporaneamente dopo il completamento corretto di A. Tieni presente che i campi id e waitFor nel passaggio B e il campo id nel passaggio C possono 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 i passaggi gsutil e wget contemporaneamente. Una volta completati questi passaggi, viene chiamato 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 da id vengono utilizzati in waitFor per definire l'ordine dei passaggi di build:

  • Innanzitutto, fetch-resources passaggio utilizza gsutil per copiare le risorse locali da di archiviazione ideale in Cloud Storage. Contemporaneamente, go genera, testa e installa il codice sorgente.
  • Poi, il passaggio di compilazione docker genera l'immagine al termine di 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