Use substitutions em seu arquivo de configuração da build para substituir variáveis
específicas no momento da build.
As substituições são úteis para variáveis cujo valor não é conhecido até o momento da criação ou para reutilizar uma solicitação de versão existente com diferentes valores variáveis.
O Cloud Build fornece substituições integradas ou você pode definir as próprias substituições. Use substitutions no steps e no images do build para resolver os valores no tempo da compilação.
Nesta página, explicamos como usar substituições padrão ou definir sua própria substitutions.
Como usar substituições padrão
O Cloud Build fornece as seguintes substituições padrão para todas as versões:
$PROJECT_ID: ID do projeto do Cloud$BUILD_ID: ID da sua versão$PROJECT_NUMBER: o ID do seu projeto$LOCATION: a região associada ao build
O Cloud Build fornece as seguintes substituições padrão para versões invocadas por gatilhos:
$TRIGGER_NAME: o nome associado ao gatilho$COMMIT_SHA: o ID de confirmação associado à sua versão$REVISION_ID: o ID de confirmação associado à sua versão$SHORT_SHA: os primeiros sete caracteres deCOMMIT_SHA$REPO_NAME: o nome do seu repositório$REPO_FULL_NAME: o nome completo do repositório, incluindo o usuário ou a organização$BRANCH_NAME: o nome da sua ramificação$TAG_NAME: o nome da sua tag$REF_NAME: o nome da ramificação ou tag$TRIGGER_BUILD_CONFIG_PATH: o caminho para o arquivo de configuração do build usado durante a execução. Caso contrário, uma string vazia se o build estiver configurado inline no gatilho ou usar umDockerfileouBuildpack.$SERVICE_ACCOUNT_EMAIL: e-mail da conta de serviço que você está usando para o build. Pode ser uma conta de serviço padrão ou uma conta de serviço especificada pelo usuário.$SERVICE_ACCOUNT: o nome do recurso da conta de serviço, no formatoprojects/PROJECT_ID/serviceAccounts/SERVICE_ACCOUNT_EMAIL
O Cloud Build fornece as seguintes substituições padrão específicas do GitHub disponíveis para acionadores de solicitação de envio:
$_HEAD_BRANCH: head branch da solicitação de envio$_BASE_BRANCH: base branch da solicitação de envio$_HEAD_REPO_URL: url da head repo da solicitação de envio$_PR_NUMBER: número da solicitação de envio
Se uma substituição padrão não estiver disponível, como versões sem código-fonte ou versões que usam um código-fonte do armazenamento, as ocorrências em que as variáveis estão ausentes serão substituídas por uma string vazia.
Ao iniciar uma versão usando gcloud builds submit, é possível especificar variáveis que normalmente viriam de versões acionadas com o --substitutionsargumento. Mais especificamente, você pode fornecer manualmente valores para:
$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 exemplo, o seguinte comando usa a substituição TAG_NAME:
gcloud builds submit --config=cloudbuild.yaml \
--substitutions=TAG_NAME="test"
No exemplo a seguir, são usadas as substituições padrão $BUILD_ID, $PROJECT_ID, $PROJECT_NUMBER e $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"
]
}
No exemplo abaixo, mostramos o uso da etapa de criação docker por uma solicitação de versão para criar uma imagem e transmiti-la para o Container Registry usando a substituição padrão $PROJECT_ID:
Neste exemplo:
- A solicitação de versão tem uma etapa de criação que usa
dockeremgcr.io/cloud-builderspara criar a imagem do Docker.- Os argumentos que serão passados para o comando
dockersão especificados pelo campoargs. Neste caso,build -t gcr.io/my-project/cb-demo-img .será invocado depois da substituição de$PROJECT_IDpelo ID do projeto.
- Os argumentos que serão passados para o comando
O campo
imagescontém o nome da imagem. Se a versão for bem-sucedida, a imagem resultante será transmitida para o Container Registry. Se a versão não criar a imagem corretamente, ela falhará.
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"
]
}
Como usar substituições definidas pelo usuário
Você também pode definir suas próprias substituições. As substituições definidas pelo usuário precisam obedecer às seguintes regras:
- É obrigatório que as substituições comecem com um sublinhado (
_) e que sejam usadas somente letras maiúsculas e números (respeitando a expressão regular_[A-Z0-9_]+). Isso evita conflitos com substituições integradas. Para usar uma expressão que comece com$, use$$. Thus:$FOOis invalid since it is not a built-in substitution.$$FOO, que avalia a string literal$FOO.
- O número de parâmetros é limitado a 200. O comprimento de uma chave de parâmetro é limitado a 100 bytes e o comprimento de um valor de parâmetro é limitado a 4000 bytes.
- Tanto
$_FOOquanto${_FOO}avaliam o valor de_FOO. No entanto,${}permite que a substituição funcione sem espaços ao redor, o que permite substituições como${_FOO}BAR. $$allows you to include a literal$in the template. Thus:$_FOOevaluates to the value of_FOO.$$_FOOavalia de acordo com a string literal$_FOO.$$$_FOOé avaliado de acordo com a string literal$seguida do valor de_FOO.
Nas substituições, use o argumento
--substitutionsno comandogcloudou especifique-o no arquivo de configuração.O exemplo a seguir mostra uma configuração de versão com duas substituições definidas pelo usuário, chamadas
_NODE_VERSION_1e_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 modificar o valor de substituição especificado no arquivo de configuração da criação, use a sinalização
--substitutionsno comandogcloud builds submit. As substituições são um mapeamento de variáveis para valores, em vez de matrizes ou sequências. É possível substituir os valores de variáveis de substituição padrão, exceto$PROJECT_IDe$BUILD_ID. O comando a seguir modifica o valor padrão de_NODE_VERSION_1especificado no arquivo de configuração da criação acima:gcloud builds submit --config=cloudbuild.yaml \ --substitutions=_NODE_VERSION_1="v6.9.4",_NODE_VERSION_2="v6.9.5" .Por padrão, a versão retornará um erro se faltar uma variável de substituição ou uma substituição. No entanto, é possível definir a opção
ALLOW_LOOSEpara pular essa verificação.O snippet a seguir imprime "hello world" e define uma substituição não usada. Como a opção de substituição
ALLOW_LOOSEestá definida, a versão será bem-sucedida, mesmo considerando a substituição ausente.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" } }se o build for invocado por um gatilho, a opção
ALLOW_LOOSEserá definida por padrão. Nesse caso, o build não retornará um erro se houver uma variável de substituição ausente ou uma substituição ausente. Não é possível modificar a opçãoALLOW_LOOSEpara builds invocados por acionadores.Se a opção
ALLOW_LOOSEnão for especificada, as chaves sem correspondência no mapeamento de substituições ou na solicitação do build resultarão em erro. Por exemplo, se a solicitação de build incluir$_FOOe o mapeamento de substituições não definir_FOO, você receberá um erro depois de executar o build ou invocar um gatilho se o acionador inclui variáveis de substituição.As seguintes variáveis de substituição sempre contêm um valor de string vazia padrão, mesmo que você não defina a opção
ALLOW_LOOSE:$REPO_NAME$REPO_FULL_NAME$BRANCH_NAME$TAG_NAME$COMMIT_SHA$SHORT_SHA
Ao definir uma variável de substituição, você não está limitado a strings estáticas. Você também tem acesso ao payload do evento que invocou o gatilho. Eles estão disponíveis como vinculações de payload. Também é possível aplicar expansões de parâmetro bash em variáveis de substituição e armazenar a string resultante como uma nova variável de substituição. Para saber mais, consulte Como usar vinculações de payload e expansões de parâmetros bash em substituições.
Substituições dinâmicas
Você pode referenciar o valor de outra variável em uma substituição definida pelo usuário configurando a opção
dynamicSubstitutionsparatrueno arquivo de configuração do build. Se o build for invocado por um gatilho, o campodynamicSubstitutionsserá sempre definido paratruee não precisará ser especificado no arquivo de configuração do build. Se a versão for invocada manualmente, defina o campodynamicSubstitutionsparatruepara que as expansões de parâmetro bash sejam interpretadas ao executar o build.O arquivo de configuração de build a seguir mostra a variável de substituição
${_IMAGE_NAME}que faz referência à variável${PROJECT_ID}. O campodynamicSubstitutionsé definido comotruepara que a referência seja aplicada ao invocar um build 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 mais informações, consulte Como aplicar expansões de parâmetros bash.
Como mapear substituições para variáveis de ambiente
Os scripts não têm suporte direto a substituições, mas têm suporte a variáveis de ambiente. É possível mapear substituições para variáveis de ambiente, automaticamente de uma só vez ou manualmente definindo cada variável de ambiente.
Mapear substituições automaticamente
No nível do build. Para mapear automaticamente todas as substituições para variáveis de ambiente, que estarão disponíveis em todo o build, defina
automapSubstitutionscomotruecomo uma opção no nível do build. Por exemplo, o arquivo de configuração de build a seguir mostra a substituição definida pelo usuário$_USERe a substituição padrão$PROJECT_IDmapeadas para variáveis de ambiente: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" } }No nível da etapa. Para mapear automaticamente todas as substituições e disponibilizá-las como variáveis de ambiente em uma única etapa, defina o campo
automapSubstitutionscomotruenessa etapa. No exemplo abaixo, apenas a segunda etapa mostra as substituições corretamente, porque é a única com o mapeamento de substituições automáticas ativado: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" }Além disso, é possível disponibilizar as substituições como variáveis de ambiente no build inteiro e ignorá-las em uma etapa. Defina
automapSubstitutionscomotrueno nível do build e, em seguida, defina o mesmo campo comofalsena etapa em que você quer ignorar as substituições. No exemplo abaixo, mesmo que as substituições de mapeamento estejam ativadas no nível de build, o ID do projeto não será impresso na segunda etapa porqueautomapSubstitutionsestá definido comofalsenessa etapa: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" }
Mapear substituições manualmente
É possível mapear manualmente as substituições para variáveis de ambiente. Cada variável de ambiente é definida no nível da etapa usando o campo
env, e o escopo das variáveis é restrito à etapa em que elas são definidas. Esse campo usa uma lista de chaves e valores.O exemplo a seguir mostra como mapear a substituição
$PROJECT_IDpara a variável de ambienteBAR:YAML
steps: - name: 'ubuntu' env: - 'BAR=$PROJECT_ID' script: 'echo $BAR'JSON
{ "steps": [ { "name": "ubuntu", "env": [ "BAR=$PROJECT_ID" ], "script": "echo $BAR" } ] }A seguir
- Saiba como usar vinculações de payload e expansões de parâmetros bash em substituições.
- Saiba como criar um arquivo de configuração de compilação básico.
- Saiba como criar e gerenciar gatilhos de compilação.
- Saiba como executar builds manualmente no Cloud Build.
É possível especificar variáveis de duas maneiras: $_FOO ou ${_FOO}: