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
comotrue
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 campoautomapSubstitutions
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
comotrue
en el nivel de compilación y, a continuación, define el mismo campo comofalse
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 porqueautomapSubstitutions
se ha definido comofalse
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
- Consulta cómo iniciar una compilación manualmente.
- Consulta cómo automatizar compilaciones con activadores.
- Consulta cómo configurar el orden de los pasos de compilación.
- Consulta cómo usar compiladores personalizados y aportados por la comunidad.