Configurer l'ordre des étapes de compilation

Vous pouvez spécifier l'ordre dans lequel vos étapes de compilation sont exécutées. Par défaut, les étapes de compilation s'exécutent de manière séquentielle, mais vous pouvez les configurer pour qu'elles exécutent simultanément.

Cette page explique comment configurer l'ordre des étapes de compilation.

Ordre des étapes de compilation et dépendances

Utilisez le champ waitFor dans une étape de compilation pour spécifier les étapes à exécuter avant l'exécution de l'étape de compilation. Si aucune valeur n'est fournie pour le champ waitFor, l'étape de compilation attend que toutes les étapes de compilation précédentes dans la requête de compilation soient terminées avant de s'exécuter.

Pour exécuter immédiatement une étape de compilation au moment de la compilation, saisissez - dans le champ waitFor.

L'ordre des étapes de compilation du champ steps correspond à l'ordre d'exécution des étapes. Les étapes seront exécutées en série ou simultanément en fonction des dépendances définies dans leurs champs waitFor.

Une étape dépend de chaque id dans son champ waitFor et ne sera lancée que lorsque chaque dépendance sera terminée.

Les étapes ne disposant pas du champ waitFor facultatif (ou disposant d'un champ waitFor vide) attendent que toutes les étapes précédentes se soient terminées avant de s'exécuter. Par conséquent, si aucune étape ne contient de id dans son champ waitFor, toutes les étapes sont exécutées en série dans l'ordre dans lequel elles ont été définies.

Les étapes peuvent dépendre du début de la compilation si le champ waitFor ne contient que -. En déclarant qu'une étape ne dépend que de -, l'étape s'exécute immédiatement au démarrage de la compilation. La première étape définie dépend implicitement du démarrage.

L'extrait de code suivant montre une configuration de compilation avec deux étapes exécutées en série :

YAML

steps:
- name: foo
- name: bar

JSON

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

L'extrait de code suivant montre deux étapes simultanées qui dépendent toutes les deux du démarrage ; la troisième étape attend que les deux premières se terminent avec succès avant de se lancer. Cette compilation simultanée exécute les étapes A et B au début de la compilation. La troisième étape attend implicitement que les deux étapes précédentes soient terminées avant de démarrer. Cet exemple peut être simplifié en omettant les champs id, auxquels il n'est pas fait référence ultérieurement dans un champ waitFor.

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

L'extrait de code suivant montre les étapes simultanées qui dépendent d'une étape précédente. L'étape A s'exécute immédiatement au démarrage de la compilation. Les étapes B et C s'exécutent simultanément une fois l'étape A terminée. Notez que les champs id et waitFor de l'étape B, ainsi que le champ id de l'étape C, peuvent être omis sans modifier l'ordre d'exécution.

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

Exemples

L'exemple ci-dessous appelle les étapes gsutil et wget simultanément. Une fois ces étapes terminées, l'étape ubuntu est appelée.

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'exemple ci-dessous utilise le champ id pour identifier certaines étapes de compilation. Les valeurs de id sont utilisées dans le champ waitFor pour définir l'ordre des étapes de compilation :

  • Tout d'abord, l'étape fetch-resources utilise gsutil pour copier les ressources locales depuis Cloud Storage. Simultanément, go génère, teste et installe le code source.
  • Ensuite, l'étape de compilation docker compile l'image une fois que toutes les autres étapes sont terminées.

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

Étape suivante