Como executar scripts bash

Nesta página, explicamos como configurar o Cloud Build para executar scripts bash em uma etapa de versão. Se você não estiver familiarizado com o Cloud Build, leia as guias de início rápido e a visão geral da configuração do Build primeiro.

É possível executar scripts bash em uma etapa de versão para configurar vários fluxos de trabalho, incluindo:

  • Como executar vários comandos em uma etapa de versão.
  • Leitura do sistema de arquivos.
  • Criação em lógica, como novas tentativas ou condicionais.
  • Saída para o registro, por exemplo, executando echo $VARNAME.

Como usar o campo script

O Cloud Build fornece um campo script que pode ser usado para especificar scripts de shell para execução em uma etapa de build. O campo script usa uma única string .

É possível prefixar o valor da string com um shebang. para especificar o shell para interpretar o script. Por exemplo, adicione #!/usr/bin/env bash para especificar o shell Bash. Se você não prefixar a string de script com um Shebang, o Cloud Build vai usar #!/bin/sh, que é o shell sh básico, não o shell do Bash.

Se você especificar script em uma etapa de build, não será possível especificar args ou entrypoint na mesma etapa.

O snippet a seguir 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"
  }
  ]
}

Como usar substituições com o campo script

Os scripts não oferecem suporte direto a substituições, mas dão suporte ao ambiente variáveis. É possível mapear substituições para variáveis de ambiente da seguinte forma: automaticamente de uma só vez ou manualmente definindo cada variável de ambiente você mesmo.

As substituições de mapas são automáticas

  • No nível do build. Para mapear automaticamente todas as substituições para variáveis de ambiente, que estarão disponíveis em todo o build, Defina automapSubstitutions como true como uma opção no nível do build. Para exemplo, o arquivo de configuração de build a seguir mostra as instâncias definidas pelo usuário A substituição $_USER e a substituição padrão $PROJECT_ID mapeada 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"
      }
    }
    
  • No nível da etapa. Para mapear automaticamente todas as substituições e fazer como variáveis de ambiente em uma única etapa, defina automapSubstitutions como true. No exemplo abaixo, apenas a segunda etapa mostra as substituições corretamente, porque é a única com 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, é possível disponibilizar as substituições como variáveis de ambiente no build inteiro e ignorá-las em uma etapa. Definir automapSubstitutions como true no nível do build e, em seguida, defina os mesmos como false na etapa em que você quer ignorar as substituições. Em no exemplo a seguir, mesmo que as substituições de mapeamento estejam ativadas na nível de build, o ID do projeto não será mostrado na segunda etapa, porque automapSubstitutions é definido como false nesta etapa:

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

Mapear substituições manualmente

É possível mapear manualmente as substituições para variáveis de ambiente. Cada variável de ambiente é definida no nível da etapa usando o campo env, e o escopo das variáveis é restrito à etapa em que elas são definidas. Esse campo usa uma lista de chaves e valores.

O exemplo a seguir 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"
    }
  ]
}

Como executar scripts bash no disco

Se você tiver o script bash salvo em um arquivo, armazene-o junto com a origem da versão e faça referência ao arquivo de script no arquivo de configuração da versão:

YAML

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

JSON

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

Para usar um script bash se o bash não for o entrypoint padrão da imagem que você está usando, adicione um campo entrypoint que indique 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"
    ]
  }
  ]
}

Como executar scripts bash in-line

Para executar comandos bash usando a imagem bash, especifique bash como o name da etapa de versã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 você está usando vier com bash, mas se bash não for o ponto de entrada padrão, adicione um campo entrypoint apontando para bash. No exemplo abaixo, o ponto de entrada bash é usado para executar comandos gcloud que consultam Cloud Build para status do build, listando os builds com status 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 sinalização -c no código acima é usada para executar comandos de várias linhas. Qualquer string que você passar depois de -c será tratada como um comando. Para mais informações sobre como executar comandos bash com -c, consulte a documentação do bash.

A seguir