Usa substitutions en el archivo de configuración de compilación para sustituir variables específicas en el momento de la compilación.
Las sustituciones son útiles para las variables cuyo valor no se conoce hasta el momento de la compilación o para reutilizar una solicitud de compilación con diferentes valores de variable.
Cloud Build proporciona sustituciones predefinidas, pero también puedes definir tus propias sustituciones. Usa substitutions en los archivos steps y images de tu compilación
para resolver sus valores en tiempo de compilación.
En esta página se explica cómo usar las sustituciones predeterminadas o definir las suyas propiassubstitutions.
Usar sustituciones predeterminadas
Cloud Build proporciona las siguientes sustituciones predeterminadas para todas las compilaciones:
$PROJECT_ID: ID de tu proyecto de Cloud$BUILD_ID: ID de tu compilación$PROJECT_NUMBER: tu número de proyecto$LOCATION: la región asociada a tu compilación
Cloud Build proporciona las siguientes sustituciones predeterminadas para las compilaciones invocadas por activadores:
$TRIGGER_NAME: el nombre asociado a tu activador$COMMIT_SHA: el ID de la confirmación asociado a tu compilación$REVISION_ID: el ID de la confirmación asociado a tu compilación$SHORT_SHA: los siete primeros caracteres deCOMMIT_SHA$REPO_NAME: el nombre de tu repositorio$REPO_FULL_NAME: el nombre completo de tu repositorio, incluido el usuario o la organización$BRANCH_NAME: el nombre de tu sucursal$TAG_NAME: el nombre de la etiqueta$REF_NAME: el nombre de tu rama o etiqueta$TRIGGER_BUILD_CONFIG_PATH: la ruta al archivo de configuración de compilación que se usa durante la ejecución de la compilación. De lo contrario, se usará una cadena vacía si la compilación se configura de forma insertada en el activador o usa unDockerfileo unBuildpack.$SERVICE_ACCOUNT_EMAIL: correo de la cuenta de servicio que estás usando para la compilación. Puede ser una cuenta de servicio predeterminada o una cuenta de servicio especificada por el usuario.$SERVICE_ACCOUNT: el nombre del recurso de la cuenta de servicio, con el formatoprojects/PROJECT_ID/serviceAccounts/SERVICE_ACCOUNT_EMAIL
Cloud Build proporciona las siguientes sustituciones predeterminadas específicas de GitHub que están disponibles para los activadores de solicitudes de extracción:
$_HEAD_BRANCH: rama principal de la solicitud de extracción$_BASE_BRANCH: rama base de la solicitud de extracción$_HEAD_REPO_URL: URL del repositorio principal de la solicitud de extracción$_PR_NUMBER: número de la solicitud de extracción
Si no hay una sustitución predeterminada disponible (por ejemplo, en compilaciones sin fuente o en compilaciones que usan una fuente de almacenamiento), las instancias de la variable que falte se sustituirán por una cadena vacía.
Al iniciar una compilación con gcloud builds submit, puedes especificar variables que normalmente proceden de compilaciones activadas con el argumento --substitutions. En concreto, puede proporcionar manualmente los valores de los siguientes atributos:
$TRIGGER_NAME$COMMIT_SHA$REVISION_ID$SHORT_SHA$REPO_NAME$REPO_FULL_NAME$BRANCH_NAME$TAG_NAME$REF_NAME$TRIGGER_BUILD_CONFIG_PATH$SERVICE_ACCOUNT_EMAIL$SERVICE_ACCOUNT
Por ejemplo, el siguiente comando usa la sustitución TAG_NAME:
gcloud builds submit --config=cloudbuild.yaml \
--substitutions=TAG_NAME="test"
En el siguiente ejemplo se usan las sustituciones predeterminadas $BUILD_ID, $PROJECT_ID, $PROJECT_NUMBER y $REVISION_ID.
YAML
steps:
# Uses the ubuntu build step:
# to run a shell script; and
# set env variables for its execution
- name: 'ubuntu'
args: ['bash', './myscript.sh']
env:
- 'BUILD=$BUILD_ID'
- 'PROJECT_ID=$PROJECT_ID'
- 'PROJECT_NUMBER=$PROJECT_NUMBER'
- 'REV=$REVISION_ID'
# Uses the docker build step to build an image called my-image
- name: 'gcr.io/cloud-builders/docker'
args: ['build', '-t', 'gcr.io/$PROJECT_ID/my-image', '.']
# my-image is pushed to Container Registry
images:
- 'gcr.io/$PROJECT_ID/my-image'
JSON
{
"steps": [{
"name": "ubuntu",
"args": [
"bash",
"./myscript.sh"
],
"env": [
"BUILD=$BUILD_ID",
"PROJECT_ID=$PROJECT_ID",
"PROJECT_NUMBER=$PROJECT_NUMBER",
"REV=$REVISION_ID"
]
}, {
"name": "gcr.io/cloud-builders/docker",
"args": ["build", "-t", "gcr.io/$PROJECT_ID/my-image", "."]
}],
"images": [
"gcr.io/$PROJECT_ID/my-image"
]
}
En el ejemplo siguiente se muestra una solicitud de compilación que usa el paso de compilación docker para compilar una imagen y, a continuación, la inserta en Container Registry mediante la sustitución $PROJECT_ID predeterminada:
En este ejemplo:
- La solicitud de compilación tiene un paso de compilación que usa el paso de compilación
dockerengcr.io/cloud-builderspara compilar la imagen Docker.- El campo
argsdel paso especifica los argumentos que se deben transferir al comandodocker. En este caso, se invocarábuild -t gcr.io/my-project/cb-demo-img .(después de sustituir$PROJECT_IDpor el ID de tu proyecto).
- El campo
El campo
imagescontiene el nombre de la imagen. Si la compilación se realiza correctamente, la imagen resultante se envía a Container Registry. Si la compilación no crea la imagen correctamente, fallará.
YAML
steps:
- name: gcr.io/cloud-builders/docker
args: ["build", "-t", "gcr.io/$PROJECT_ID/cb-demo-img", "."]
images:
- gcr.io/$PROJECT_ID/cb-demo-img
JSON
{
"steps": [{
"name": "gcr.io/cloud-builders/docker",
"args": ["build", "-t", "gcr.io/$PROJECT_ID/cb-demo-img", "."]
}],
"images": [
"gcr.io/$PROJECT_ID/cb-demo-img"
]
}
Usar sustituciones definidas por el usuario
También puedes definir tus propias sustituciones. Las sustituciones definidas por el usuario deben cumplir las siguientes reglas:
- Las sustituciones deben empezar por un guion bajo (
_) e incluir solo letras mayúsculas y números (respetando la expresión regular_[A-Z0-9_]+). De esta forma, se evitan conflictos con las sustituciones integradas. Para usar una expresión que empiece por$, debes usar$$. Thus:$FOOis invalid since it is not a built-in substitution.$$FOO, que se evalúa como la cadena literal$FOO.
- El número de parámetros está limitado a 200. La longitud de una clave de parámetro es de 100 bytes como máximo y la de un valor de parámetro, de 4000 bytes.
- Tanto
$_FOOcomo${_FOO}dan como resultado el valor de_FOO. Sin embargo,${}permite que la sustitución funcione sin espacios alrededor, lo que permite sustituciones como${_FOO}BAR. $$allows you to include a literal$in the template. Thus:$_FOOevaluates to the value of_FOO.$$_FOOda como resultado la cadena literal$_FOO.$$$_FOOse evalúa como la cadena literal$seguida del valor de_FOO.
Para usar las sustituciones, usa el argumento
--substitutionsen el comandogcloudo especifícalas en el archivo de configuración.En el siguiente ejemplo se muestra una configuración de compilación con dos sustituciones definidas por el usuario llamadas
_NODE_VERSION_1y_NODE_VERSION_2:YAML
steps: - name: 'gcr.io/cloud-builders/docker' args: ['build', '--build-arg', 'node_version=${_NODE_VERSION_1}', '-t', 'gcr.io/$PROJECT_ID/build-substitutions-nodejs-${_NODE_VERSION_1}', '.'] - name: 'gcr.io/cloud-builders/docker' args: ['build', '--build-arg', 'node_version=${_NODE_VERSION_2}', '-t', 'gcr.io/$PROJECT_ID/build-substitutions-nodejs-${_NODE_VERSION_2}', '.'] substitutions: _NODE_VERSION_1: v6.9.1 # default value _NODE_VERSION_2: v6.9.2 # default value images: [ 'gcr.io/$PROJECT_ID/build-substitutions-nodejs-${_NODE_VERSION_1}', 'gcr.io/$PROJECT_ID/build-substitutions-nodejs-${_NODE_VERSION_2}' ]JSON
{ "steps": [{ "name": "gcr.io/cloud-builders/docker", "args": [ "build", "--build-arg", "node_version=${_NODE_VERSION_1}", "-t", "gcr.io/$PROJECT_ID/build-substitutions-nodejs-${_NODE_VERSION_1}", "." ] }, { "name": "gcr.io/cloud-builders/docker", "args": [ "build", "--build-arg", "node_version=${_NODE_VERSION_2}", "-t", "gcr.io/$PROJECT_ID/build-substitutions-nodejs-${_NODE_VERSION_2}", "." ] }], "substitutions": { "_NODE_VERSION_1": "v6.9.1" "_NODE_VERSION_1": "v6.9.2" }, "images": [ "gcr.io/$PROJECT_ID/build-substitutions-nodejs-${_NODE_VERSION_1}", "gcr.io/$PROJECT_ID/build-substitutions-nodejs-${_NODE_VERSION_2}" ] }Para anular el valor de sustitución que has especificado en el archivo de configuración de compilación, usa la marca
--substitutionsen el comandogcloud builds submit. Ten en cuenta que las sustituciones son una asignación de variables a valores, no a matrices ni a secuencias. Puedes anular los valores predeterminados de las variables de sustitución, excepto$PROJECT_IDy$BUILD_ID. El siguiente comando anula el valor predeterminado de_NODE_VERSION_1especificado en el archivo de configuración de compilación anterior:gcloud builds submit --config=cloudbuild.yaml \ --substitutions=_NODE_VERSION_1="v6.9.4",_NODE_VERSION_2="v6.9.5" .De forma predeterminada, la compilación devuelve un error si falta una variable de sustitución o una sustitución. Sin embargo, puedes seleccionar la opción
ALLOW_LOOSEpara saltarte esta comprobación.El siguiente fragmento imprime "hello world" y define una sustitución que no se usa. Como se ha definido la opción de sustitución
ALLOW_LOOSE, la compilación se realizará correctamente a pesar de que falte la sustitución.YAML
steps: - name: 'ubuntu' args: ['echo', 'hello world'] substitutions: _SUB_VALUE: unused options: substitutionOption: 'ALLOW_LOOSE'JSON
{ "steps": [ { "name": "ubuntu", "args": [ "echo", "hello world" ] } ], "substitutions": { "_SUB_VALUE": "unused" }, "options": { "substitution_option": "ALLOW_LOOSE" } }Si una compilación se invoca mediante un activador, la opción
ALLOW_LOOSEse define de forma predeterminada. En este caso, la compilación no devolverá un error si falta una variable de sustitución o una sustitución. No puedes anular la opciónALLOW_LOOSEen las compilaciones invocadas por activadores.Si no se especifica la opción
ALLOW_LOOSE, se producirá un error si hay claves sin correspondencia en la asignación de sustituciones o en la solicitud de compilación. Por ejemplo, si tu solicitud de compilación incluye$_FOOy la asignación de sustituciones no define_FOO, recibirás un error después de ejecutar la compilación o invocar un activador si este incluye variables de sustitución.Las siguientes variables de sustitución siempre contienen un valor predeterminado de cadena vacía, aunque no definas la opción
ALLOW_LOOSE:$REPO_NAME$REPO_FULL_NAME$BRANCH_NAME$TAG_NAME$COMMIT_SHA$SHORT_SHA
Al definir una variable de sustitución, no tienes que limitarte a cadenas estáticas. También tienes acceso a la carga útil del evento que ha invocado el activador. Están disponibles como enlaces de carga útil. También puede aplicar expansiones de parámetros bash a variables de sustitución y almacenar la cadena resultante como una nueva variable de sustitución. Para obtener más información, consulta Usar vinculaciones de carga útil y expansiones de parámetros bash en sustituciones.
Sustituciones dinámicas
Puedes hacer referencia al valor de otra variable en una sustitución definida por el usuario configurando la opción
dynamicSubstitutionscomotrueen el archivo de configuración de compilación. Si una compilación se invoca mediante un activador, el campodynamicSubstitutionssiempre se define comotruey no es necesario especificarlo en el archivo de configuración de la compilación. Si la compilación se invoca manualmente, debes asignar el valortrueal campodynamicSubstitutionspara que las expansiones de parámetros de bash se interpreten al ejecutar la compilación.El siguiente archivo de configuración de compilación muestra la variable de sustitución
${_IMAGE_NAME}que hace referencia a la variable${PROJECT_ID}. El campodynamicSubstitutionsse define comotruepara que la referencia se aplique al invocar una compilación manualmente:YAML
steps: - name: 'gcr.io/cloud-builders/docker' args: ['build', '-t', '${_IMAGE_NAME}', '.'] substitutions: _IMAGE_NAME: 'gcr.io/${PROJECT_ID}/test-image' options: dynamicSubstitutions: trueJSON
{ "steps": [ { "name": "gcr.io/cloud-builders/docker", "args": [ "build", "-t", "${_IMAGE_NAME}", "." ] } ], "substitutions": { "_IMAGE_NAME": "gcr.io/${PROJECT_ID}/test-image" }, "options": { "dynamic_substitutions": true } }Para obtener más información, consulta Aplicar expansiones de parámetros de bash.
Asignar sustituciones a variables de entorno
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_IDa la variable de entornoBAR:YAML
steps: - name: 'ubuntu' env: - 'BAR=$PROJECT_ID' script: 'echo $BAR'JSON
{ "steps": [ { "name": "ubuntu", "env": [ "BAR=$PROJECT_ID" ], "script": "echo $BAR" } ] }Siguientes pasos
- Consulta cómo usar vinculaciones de carga útil y expansiones de parámetros bash en sustituciones.
- Consulta cómo crear un archivo básico de configuración de versiones.
- Consulta cómo crear y gestionar activadores de compilación.
- Consulta cómo ejecutar compilaciones manualmente en Cloud Build.
Puedes especificar variables de dos formas: $_FOO o ${_FOO}: