Configurazione dell'ordine dei passi di build

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

Questa pagina spiega come configurare l'ordine dei passaggi di compilazione.

Ordine dei passaggi di compilazione e dipendenze

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 compilazione aspetta che tutti i passaggi di compilazione precedenti nella richiesta di compilazione vengano completati correttamente prima di essere eseguito.

Per eseguire un passaggio di compilazione immediatamente in fase di compilazione, utilizza - nel campo waitFor.

L'ordine dei passaggi di compilazione nel campo steps si riferisce all'ordine in cui vengono eseguiti. I passaggi verranno eseguiti in sequenza o in contemporanea in base alle dipendenze definite nei relativi campi waitFor.

Un passaggio dipende da ogni id nel relativo waitFor e non verrà avviato finché ogni dipendenza non sarà 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 -, il passaggio viene eseguito immediatamente al termine della compilazione. Il primo passaggio definito dipende implicitamente da start.

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

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

Lo snippet seguente mostra due passaggi simultanei che dipendono entrambi da start. Il terzo passaggio attende il completamento dei primi due prima di avviarsi. Questa build simultanea esegue i passaggi A e B all'inizio della compilazione. 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 viene fatto riferimento in un waitFor successivo.

steps:
- name: foo
  id: A
- name: bar
  id: B
  waitFor: ['-']
- name: baz
{
    "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 compilazione. 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 possono essere omessi senza modificare l'ordine di esecuzione.

steps:
- name: foo
  id: A
- name: bar
  id: B
  waitFor:
  - A
- name: baz
  id: C
  waitFor:
  - A
{
    "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. Al termine di questi passaggi, viene chiamato il passaggio ubuntu.

YAMLJSON
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']
{
  "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 compilazione. I valori di id vengono utilizzati in waitFor per definire l'ordine dei passaggi di compilazione:

  • Innanzitutto, il passaggio fetch-resources utilizza gsutil per copiare le risorse locali da 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.

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']
{
  "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