Ejecuta secuencias de comandos de Bash

En esta página, se explica cómo configurar Cloud Build para ejecutar secuencias de comandos de Bash dentro de un paso de compilación. Si eres nuevo en Cloud Build, primero lee las guías de inicio rápido y la descripción general de la configuración de compilación.

Puedes ejecutar secuencias de comandos de Bash dentro de un paso de compilación para configurar varios flujos de trabajo, incluidos los siguientes:

  • Ejecución de varios comandos en un paso de compilación
  • Lectura del sistema de archivos.
  • Compilación en lógica, como reintentos o condicionales
  • Resultados del registro, por ejemplo, ejecución de echo $VARNAME

Usa 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 anteponer el valor de cadena con un shebang para especificar la shell que interpretará la secuencia de comandos. Por ejemplo, agrega #!/usr/bin/env bash para especificar la shell de Bash. Si no antepones la cadena de secuencia de comandos con un shebang, Cloud Build usa #!/bin/sh, que es la shell sh básica, no la shell de 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"
  }
  ]
}

Usa sustituciones con el campo script

Las secuencias de comandos no admiten sustituciones directamente, pero sí admiten variables de entorno. Puedes asignar sustituciones a variables de entorno, ya sea de forma automática o manual, definiendo cada variable de entorno por tu cuenta.

Asigna sustituciones de forma automática

  • A nivel de la compilación. Para asignar automáticamente todas las sustituciones a variables de entorno, que estarán disponibles durante toda la compilación, establece automapSubstitutions en true como una opción a nivel de la compilación. Por ejemplo, el siguiente archivo de configuración de compilación muestra la sustitución definida por el usuario $_USER y la sustitución predeterminada $PROJECT_ID 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 del paso. Para asignar automáticamente todas las sustituciones y hacer que estén disponibles como variables de entorno en un solo paso, establece el campo automapSubstitutions en true en ese paso. En el siguiente ejemplo, solo el segundo paso mostrará las sustituciones correctamente, ya que es el único con la asignación automática de sustituciones habilitada:

    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, luego, ignorarlas en un paso. Establece automapSubstitutions en true a nivel de la compilación y, luego, establece el mismo campo en false en el paso en el que deseas ignorar las sustituciones. En el siguiente ejemplo, aunque la asignación de sustituciones está habilitada a nivel de la compilación, el ID del proyecto no se imprimirá en el segundo paso, ya que automapSubstitutions está establecido en 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"
      }
    

Asigna sustituciones de forma manual

Puedes asignar las sustituciones a variables de entorno de forma manual. Cada variable de entorno se define a nivel del paso con el env campo, y el alcance de las variables se limita al paso en el que se definen. Este campo toma 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"
    }
  ]
}

Ejecuta secuencias de comandos Bash en el disco

Si tu secuencia de comandos de Bash se guardó en un archivo, almacena el archivo junto con la fuente de compilación y haz referencia a este archivo en tu 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 el archivo si Bash no es el punto de entrada predeterminado de la imagen que usas, agrega 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"
    ]
  }
  ]
}

Ejecuta secuencias de comandos Bash intercaladas

Para ejecutar comandos Bash con la imagen bash, especifica bash como el 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 usas viene ya preparada con bash, pero si bash no es el punto de entrada predeterminado, agrega un campo entrypoint que apunte a bash. En el siguiente ejemplo, se usa el punto de entrada bash para ejecutar comandos gcloud que consultan a Cloud Build sobre el estado de la compilación y enumeran las compilaciones con un estado 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 en el código anterior se usa para ejecutar comandos de varias líneas. Cualquier string que pases después de -c se trata como un comando. Para obtener más información sobre la ejecución de comandos de bash con -c, consulta la documentación de bash.

¿Qué sigue?