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
automapSubstitutionscomotrueen las opciones de nivel de compilación. Por ejemplo, el siguiente archivo de configuración de compilación muestra la sustitución$_USERdefinida por el usuario y la sustitución$PROJECT_IDpredeterminada 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
trueal campoautomapSubstitutionsen 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
automapSubstitutionscomotrueen el nivel de compilación y, a continuación, define el mismo campo comofalseen 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 porqueautomapSubstitutionsse ha definido comofalseen 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.