Ejecutar secuencias de comandos bash

En esta página se explica cómo configurar Cloud Build para ejecutar secuencias de comandos de Bash en un paso de compilación. Si es la primera vez que usas Cloud Build, consulta primero las guías de inicio rápido y el resumen de la configuración de compilación.

Puedes ejecutar scripts de bash en un paso de compilación para configurar varios flujos de trabajo, entre los que se incluyen los siguientes:

  • Ejecutar varios comandos en un paso de compilación.
  • Lectura del sistema de archivos.
  • Integrar lógica, como reintentos o condicionales.
  • Por ejemplo, al escribir en el registro, como al ejecutar echo $VARNAME.

Usar el campo script

Cloud Build proporciona un campo script que puedes usar para especificar secuencias de comandos de shell que se ejecutarán en un paso de compilación. El campo script toma un solo valor de cadena.

Puedes añadir el prefijo shebang a la cadena para especificar el shell que interpretará la secuencia de comandos. Por ejemplo, añade #!/usr/bin/env bash para especificar el shell de Bash. Si no añades un shebang al principio de la cadena de la secuencia de comandos, Cloud Build usará #!/bin/sh, que es el shell sh básico, no el shell Bash.

Si especificas script en un paso de compilación, no puedes especificar args ni entrypoint en el mismo paso.

En el siguiente fragmento se muestra el 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 sustituciones con el campo script

Las secuencias de comandos no admiten sustituciones directamente, pero sí variables de entorno. Puedes asignar sustituciones a variables de entorno de forma automática y simultánea, o bien manualmente definiendo cada variable de entorno.

Asignar sustituciones automáticamente

  • A nivel de compilación. Para asignar automáticamente todas las sustituciones a variables de entorno, que estarán disponibles durante toda la compilación, define automapSubstitutions como true en las opciones de nivel de compilación. Por ejemplo, el siguiente archivo de configuración de compilación muestra la sustitución $_USER definida por el usuario y la sustitución $PROJECT_ID predeterminada asignadas a variables de entorno:

    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"
      }
    }
    
  • A nivel de paso. Para asignar automáticamente todas las sustituciones y hacerlas disponibles como variables de entorno en un solo paso, asigna el valor true al campo automapSubstitutions en ese paso. En el siguiente ejemplo, solo en el segundo paso se mostrarán las sustituciones correctamente, ya que es el único que tiene habilitada la asignación de sustituciones automáticas:

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

    Además, puedes hacer que las sustituciones estén disponibles como variables de entorno en toda la compilación y, a continuación, ignorarlas en un solo paso. Define automapSubstitutions como true en el nivel de compilación y, a continuación, define el mismo campo como false en el paso en el que quieras ignorar las sustituciones. En el siguiente ejemplo, aunque las sustituciones de asignación estén habilitadas a nivel de compilación, el ID del proyecto no se imprimirá en el segundo paso porque automapSubstitutions se ha definido como false en ese paso:

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

Asignar sustituciones manualmente

Puedes asignar manualmente las sustituciones a variables de entorno. Cada variable de entorno se define en el nivel del paso mediante el campo env, y el ámbito de las variables se limita al paso en el que se definen. Este campo acepta una lista de claves y valores.

En el siguiente ejemplo se muestra cómo asignar la sustitución $PROJECT_ID a la variable de entorno BAR:

YAML

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

JSON

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

Ejecutar secuencias de comandos bash en el disco

Si tienes la secuencia de comandos bash guardada en un archivo, almacénalo junto con el origen de compilación y haz referencia al archivo de secuencia de comandos en el archivo de configuración de compilación:

YAML

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

JSON

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

Para usar una secuencia de comandos de Bash en un archivo si Bash no es el punto de entrada predeterminado de la imagen que estás usando, añade un campo entrypoint que apunte a 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"
    ]
  }
  ]
}

Ejecutar secuencias de comandos bash insertadas

Para ejecutar comandos de bash con la imagen bash, especifica bash como name del paso de compilación y el comando en el 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"
       ]
    }
  ]
}

Si la imagen que utilizas viene preempaquetada con bash, pero bash no es el punto de entrada predeterminado, añade un campo entrypoint que apunte a bash. En el ejemplo de abajo, se usa el punto de entrada bash para ejecutar comandos gcloud que consultan Cloud Build para obtener el estado de las compilaciones y mostrar las compilaciones con el estado "failed" (fallido).

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

La marca -c del código anterior se usa para ejecutar comandos de varias líneas. Cualquier cadena que envíes después de -c se tratará como un comando. Para obtener más información sobre cómo ejecutar comandos de bash con -c, consulta la documentación de bash.

Siguientes pasos