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
Uso del 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 agregar el prefijo shebang al valor de la cadena para especificar la shell a fin de interpretar la secuencia de comandos. Por ejemplo, agrega #!/usr/bin/env bash
para especificar la shell Bash. Si no agregas un prefijo a la string de secuencia de comandos con Shebang, Cloud Build usa #!/bin/sh
, que es la shell básica de sh, no la 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"
}
]
}
Usa sustituciones con el campo script
Las secuencias de comandos no admiten sustituciones directamente, pero admiten variables de entorno. Puedes asignar sustituciones a variables de entorno, ya sea de forma automática a la vez o de forma manual si defines cada variable de entorno por tu cuenta.
Asigna sustituciones automáticamente
A nivel de compilación: Para asignar automáticamente todas las sustituciones a las variables de entorno, que estarán disponibles durante toda la compilación, configura
automapSubstitutions
comotrue
como opción a nivel de compilación. Por ejemplo, en el siguiente archivo de configuración de compilación, se muestra la sustitución definida por el usuario$_USER
y la sustitución predeterminada$PROJECT_ID
asignadas a las 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" } }
En el nivel del paso. Para asignar de forma automática todas las sustituciones y hacer que estén disponibles como variables de entorno en un solo paso, configura el campo
automapSubstitutions
comotrue
en ese paso. En el siguiente ejemplo, solo el segundo paso mostrará las sustituciones de manera correcta, 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, luego, ignorarlas en un solo paso. Configura
automapSubstitutions
comotrue
a nivel de compilación y, luego, configura el mismo campo comofalse
en el paso en el que deseas ignorar las sustituciones. En el siguiente ejemplo, aunque las sustituciones de asignación están habilitadas en el nivel de compilación, el ID del proyecto no se imprimirá en el segundo paso porqueautomapSubstitutions
se establece enfalse
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 manualmente
Puedes asignar las sustituciones a variables de entorno de forma manual. Cada variable de entorno se define a nivel del paso mediante el campo env
, y el alcance de las variables se restringe 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 de Bash intercalada (heredadas)
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 estás usando viene empaquetada previamente 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 de gcloud
que consultan a Cloud Build con respecto al estado de la compilación y muestra una lista de compilaciones con estado de error.
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?
- Obtén más información para iniciar una compilación de forma manual.
- Aprende a automatizar compilaciones con activadores.
- Obtén más información para configurar el orden de los pasos de compilación.
- Obtén más información para usar creadores y creadores personalizados creados por la comunidad.