Executar scripts bash

Esta página explica como configurar o Cloud Build para executar scripts bash num passo de compilação. Se for um utilizador recente do Cloud Build, leia os inícios rápidos e a vista geral da configuração de compilação primeiro.

Pode executar scripts bash num passo de compilação para configurar vários fluxos de trabalho, incluindo:

  • Executar vários comandos num passo de compilação.
  • Ler a partir do sistema de ficheiros.
  • Incorporar lógica, como novas tentativas ou condições.
  • Produzir resultados no registo, por exemplo, executar echo $VARNAME.

Usar o campo script

O Cloud Build fornece um campo script que pode usar para especificar scripts de shell a executar num passo de compilação. O campo script aceita um valor de string único.

Pode prefixar o valor da string com um shebang para especificar a shell que vai interpretar o script. Por exemplo, adicione #!/usr/bin/env bash para especificar a shell Bash. Se não prefixar a string do script com um shebang, o Cloud Build usa #!/bin/sh, que é a shell sh básica, e não a shell Bash.

Se especificar script num passo de compilação, não pode especificar args nem entrypoint no mesmo passo.

O seguinte fragmento demonstra o campo script:

YAML

steps:
- name: 'bash'
  script: |
    #!/usr/bin/env bash
    echo "Hello World"
- name: 'ubuntu'
  script: echo hello
- name: 'python'
  script: |
    #!/usr/bin/env python
    print('hello from python')

JSON

{
  "steps": [
  {
    "name": "bash",
    "script": "#!/usr/bin/env bash echo 'Hello World'"
  },
  {
    "name": "ubuntu",
    "script": "echo hello"
  },
  {
    "name": "python",
    "script": "#!/usr/bin/env python\nprint('hello from python')\n"
  }
  ]
}

Usar substituições com o campo script

Os scripts não suportam diretamente substituições, mas suportam variáveis de ambiente. Pode mapear substituições para variáveis de ambiente, quer automaticamente de uma só vez, quer manualmente definindo cada variável de ambiente por si.

Mapeie substituições automaticamente

  • Ao nível da criação. Para mapear automaticamente todas as substituições para variáveis de ambiente, que vão estar disponíveis durante toda a compilação, defina automapSubstitutions como true como opção ao nível da compilação. Por exemplo, o ficheiro de configuração de compilação seguinte mostra a substituição $_USER definida pelo utilizador e a substituição $PROJECT_ID predefinida mapeadas para variáveis de ambiente:

    YAML

    steps:
    - name: 'ubuntu'
      script: |
        #!/usr/bin/env bash
        echo "Hello $_USER"
    - name: 'ubuntu'
      script: |
        #!/usr/bin/env bash
        echo "Your project ID is $PROJECT_ID"
    options:
      automapSubstitutions: true
    substitutions:
      _USER: "Google Cloud"
    

    JSON

    {
      "steps": [
        {
          "name": "ubuntu",
          "script": "#!/usr/bin/env bash echo 'Hello $_USER'"
        },
        {
          "name": "ubuntu",
          "script": "#!/usr/bin/env bash echo 'Your project ID is $PROJECT_ID'"
        }
      ],
      "options": {
        "automap_substitutions": true
      },
      "substitutions": {
        "_USER": "Google Cloud"
      }
    }
    
  • Ao nível do passo. Para mapear automaticamente todas as substituições e torná-las disponíveis como variáveis de ambiente num único passo, defina o campo automapSubstitutions como true nesse passo. No exemplo seguinte, apenas o segundo passo mostra as substituições corretamente, porque é o único com o mapeamento de substituições automáticas ativado:

    YAML

    steps:
    - name: 'ubuntu'
      script: |
        #!/usr/bin/env bash
        echo "Hello $_USER"
    - name: 'ubuntu'
      script: |
        #!/usr/bin/env bash
        echo "Your project ID is $PROJECT_ID"
      automapSubstitutions: true
    substitutions:
      _USER: "Google Cloud"
    

    JSON

    {
      "steps": [
        {
          "name": "ubuntu",
          "script": "#!/usr/bin/env bash echo 'Hello $_USER'"
        },
        {
          "name": "ubuntu",
          "script": "#!/usr/bin/env bash echo 'Your project ID is $PROJECT_ID'",
          "automap_substitutions": true
        }
      ],
      },
      "substitutions": {
        "_USER": "Google Cloud"
      }
    

    Além disso, pode disponibilizar as substituições como variáveis de ambiente em toda a compilação e, em seguida, ignorá-las num passo. Defina automapSubstitutions como true ao nível da compilação e, em seguida, defina o mesmo campo como false no passo em que quer ignorar as substituições. No exemplo seguinte, embora as substituições de mapeamento estejam ativadas ao nível da compilação, o ID do projeto não é impresso no segundo passo, porque automapSubstitutions está definido como false nesse passo:

    YAML

    steps:
    - name: 'ubuntu'
      script: |
        #!/usr/bin/env bash
        echo "Hello $_USER"
    - name: 'ubuntu'
      script: |
        #!/usr/bin/env bash
        echo "Your project ID is $PROJECT_ID"
      automapSubstitutions: false
    options:
      automapSubstitutions: true
    substitutions:
      _USER: "Google Cloud"
    

    JSON

    {
      "steps": [
        {
          "name": "ubuntu",
          "script": "#!/usr/bin/env bash echo 'Hello $_USER'"
        },
        {
          "name": "ubuntu",
          "script": "#!/usr/bin/env bash echo 'Your project ID is $PROJECT_ID'",
          "automap_substitutions": false
        }
      ],
      "options": {
        "automap_substitutions": true
      },
      },
      "substitutions": {
        "_USER": "Google Cloud"
      }
    

Mapeie substituições manualmente

Pode mapear manualmente as substituições para variáveis de ambiente. Todas as variáveis de ambiente são definidas ao nível do passo através do campo env, e o âmbito das variáveis está restrito ao passo onde são definidas. Este campo recebe uma lista de chaves e valores.

O exemplo seguinte mostra como mapear a substituição $PROJECT_ID para a variável de ambiente BAR:

YAML

steps:
- name: 'ubuntu'
  env:
  - 'BAR=$PROJECT_ID'
  script: 'echo $BAR'

JSON

{
  "steps": [
    {
      "name": "ubuntu",
      "env": [
        "BAR=$PROJECT_ID"
      ],
      "script": "echo $BAR"
    }
  ]
}

Executar scripts bash no disco

Se tiver o script bash guardado num ficheiro, armazene o ficheiro juntamente com a origem da compilação e faça referência ao ficheiro de script no ficheiro de configuração da compilação:

YAML

steps:
- name: 'bash'
  args: ['./myscript.bash']

JSON

{
  "steps": [
  {
    "name": "bash",
    "args": [
      "./myscript.bash"
     ]
  }
  ]
}

Para usar um script bash no ficheiro se o bash não for o ponto de entrada predefinido da imagem que está a usar, adicione um campo entrypoint que aponte para o bash:

YAML

steps:
- name: 'gcr.io/cloud-builders/gcloud'
  entrypoint: 'bash'
  args: ['tools/myScript.sh','--foo']

JSON

{
  "steps": [
  {
    "name": "gcr.io/cloud-builders/gcloud",
    "entrypoint": "bash",
    "args": [
      "tools/myScript.sh",
      "--foo"
    ]
  }
  ]
}

Executar scripts bash inline

Para executar comandos bash com a imagem bash, especifique bash como o name do passo de compilação e o comando no campo args:

YAML

steps:
- name: 'bash'
  args: ['echo', 'I am running a bash command']

JSON

{
  "steps": [
    {
      "name": "bash",
      "args": [
        "echo",
        "I am running a bash command"
       ]
    }
  ]
}

Se a imagem que está a usar for pré-embalada com bash, mas se bash não for o ponto de entrada predefinido, adicione um campo entrypoint que aponte para bash. No exemplo abaixo, o ponto de entrada bash é usado para executar comandos gcloud que consultam o Cloud Build para obter o estado da compilação, listando as compilações com um estado de falha.

YAML

steps:
- name: 'gcr.io/google.com/cloudsdktool/cloud-sdk'
  entrypoint: 'bash'
  args:
  - '-eEuo'
  - 'pipefail'
  - '-c'
  - |-
    gcloud builds list > builds.txt
    while read line; do
        if grep -q "FAILURE" <<< "$line"; then
            echo "$line"
        fi
    done < builds.txt

JSON

{
  "steps": [
  {
    "name": "gcr.io/google.com/cloudsdktool/cloud-sdk",
    "entrypoint": "bash",
    "args": [
      "-eEuo",
      "pipefail",
      "-c",
      "gcloud builds list > builds.txt\nwhile read line; do\n    if grep -q \"FAILURE\" <<< \"$line\"; then\n        echo \"$line\"\n    fi\ndone < builds.txt"
    ]
  }
  ]
}

A flag -c no código acima é usada para executar comandos de várias linhas. Qualquer string que passe após -c é tratada como um comando. Para mais informações sobre a execução de comandos bash com o -c, consulte a documentação do bash.

O que se segue?