Configurar a ordem dos passos de compilação

Pode especificar a ordem pela qual as etapas de compilação são executadas. Por predefinição, os passos de compilação são executados sequencialmente, mas pode configurá-los para serem executados em simultâneo.

Esta página explica como configurar a ordem dos passos de compilação.

Crie a ordem dos passos e as dependências

Use o campo waitFor num passo de compilação para especificar que passos têm de ser executados antes de o passo de compilação ser executado. Se não forem fornecidos valores para waitFor, o passo de compilação aguarda que todos os passos de compilação anteriores no pedido de compilação sejam concluídos com êxito antes de ser executado.

Para executar um passo de compilação imediatamente no momento da compilação, use - no campo waitFor.

A ordem dos passos de criação no campo steps está relacionada com a ordem em que os passos são executados. Os passos são executados em série ou em simultâneo com base nas dependências definidas nos respetivos campos waitFor.

Um passo depende de todos os id no respetivo waitFor e não é iniciado até que cada dependência seja concluída com êxito.

Os passos sem o campo opcional waitFor (ou com um waitFor vazio) aguardam a conclusão bem-sucedida de todos os passos anteriores antes da execução. Por conseguinte, se nenhum passo contiver um id no respetivo campo waitFor, todos os passos são executados em série pela ordem em que são definidos.

Os passos podem depender do início da criação se waitFor contiver apenas -. Ao declarar que um passo depende apenas de -, o passo é executado imediatamente quando a compilação é iniciada. O primeiro passo definido depende implicitamente do início.

O fragmento seguinte mostra uma configuração de compilação com dois passos executados em série:

YAML

steps:
- name: foo
- name: bar

JSON

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

O fragmento seguinte mostra dois passos concorrentes que dependem do início. O terceiro passo aguarda a conclusão bem-sucedida dos dois primeiros antes de ser iniciado. Esta compilação concorrente executa os passos A e B no início da compilação. O terceiro passo aguarda implicitamente até que os dois passos anteriores estejam concluídos antes de começar. Este exemplo pode ser simplificado omitindo os campos id, que não são referenciados num waitFor subsequente.

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

O fragmento seguinte mostra passos concorrentes que dependem de um passo anterior. O passo A é executado imediatamente quando a compilação é iniciada. Os passos B e C são executados em simultâneo após a conclusão bem-sucedida do passo A. Tenha em atenção que os campos id e waitFor no passo B, e o campo id no passo C, podem ser omitidos sem alterar a ordem de execução.

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

Exemplos

O exemplo abaixo chama os passos gsutil e wget em simultâneo. Depois de concluir estes passos, é chamado o passo 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"
      ]
    }
  ]
}

O exemplo abaixo usa o campo id para identificar determinados passos de compilação. Os valores de id são usados em waitFor para definir a ordem dos passos de compilação:

  • O fetch-resources passo usa gsutil para copiar os recursos locais do Cloud Storage. Em simultâneo, o go gera, testa e instala o código-fonte.
  • Em seguida, o passo de compilação docker compila a imagem depois de todos os outros passos estarem concluídos.

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

O que se segue?