Use substitutions
no ficheiro de configuração de compilação para substituir variáveis específicas no momento da compilação.
As substituições são úteis para variáveis cujo valor não é conhecido até ao momento da compilação ou para reutilizar um pedido de compilação existente com valores de variáveis diferentes.
O Cloud Build oferece substituições incorporadas ou pode definir as suas próprias substituições. Use substitutions
no steps
da compilação e no images
para resolver os respetivos valores no momento da compilação.
Esta página explica como usar substituições predefinidas ou definir as suas próprias
substitutions
.
Usar substituições predefinidas
O Cloud Build fornece as seguintes substituições predefinidas para todas as compilações:
$PROJECT_ID
: ID do seu projeto do Google Cloud$BUILD_ID
: ID da sua compilação$PROJECT_NUMBER
: o número do seu projeto$LOCATION
: a região associada à sua compilação
O Cloud Build fornece as seguintes substituições predefinidas para compilações invocadas por acionadores:
$TRIGGER_NAME
: o nome associado ao acionador$COMMIT_SHA
: o ID de confirmação associado à sua compilação$REVISION_ID
: o ID de confirmação associado à sua compilação$SHORT_SHA
: os primeiros sete carateres deCOMMIT_SHA
$REPO_NAME
: o nome do seu repositório$REPO_FULL_NAME
: o nome completo do seu repositório, incluindo o utilizador ou a organização$BRANCH_NAME
: o nome da sua filial$TAG_NAME
: o nome da sua etiqueta$REF_NAME
: o nome da sua ramificação ou etiqueta$TRIGGER_BUILD_CONFIG_PATH
: o caminho para o ficheiro de configuração de compilação usado durante a execução da compilação; caso contrário, uma string vazia se a compilação estiver configurada inline no acionador ou usar umDockerfile
ou umBuildpack
.$SERVICE_ACCOUNT_EMAIL
: email da conta de serviço que está a usar para a compilação. Esta é uma conta de serviço predefinida ou uma conta de serviço especificada pelo utilizador.$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 predefinidas específicas do GitHub disponíveis para acionadores de pedidos de obtenção:
$_HEAD_BRANCH
: ramo principal do pedido de envio$_BASE_BRANCH
: ramo base do pedido de envio$_HEAD_REPO_URL
: URL do repositório principal do pedido de obtenção$_PR_NUMBER
: número do pedido de envio
Se não estiver disponível uma substituição predefinida (como com compilações sem origem ou com compilações que usam a origem de armazenamento), as ocorrências da variável em falta são substituídas por uma string vazia.
Quando inicia uma compilação com gcloud builds submit
, pode especificar variáveis que normalmente provêm de compilações acionadas com o argumento --substitutions
. Especificamente, 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 comando seguinte usa a substituição TAG_NAME
:
gcloud builds submit --config=cloudbuild.yaml \
--substitutions=TAG_NAME="test"
O exemplo seguinte usa as substituições predefinidas $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"
]
}
O exemplo abaixo mostra um pedido de compilação que usa o passo de compilação docker
para compilar
uma imagem e, em seguida, envia a imagem para o Container Registry usando a substituição
$PROJECT_ID
predefinida:
Neste exemplo:
- O pedido de compilação tem um passo de compilação, que usa o passo de compilação
docker
emgcr.io/cloud-builders
para compilar a imagem do Docker.- O campo
args
no passo especifica os argumentos a transmitir para o comandodocker
. Neste caso,build -t gcr.io/my-project/cb-demo-img .
é invocado (depois de$PROJECT_ID
ser substituído pelo ID do seu projeto).
- O campo
O campo
images
contém o nome da imagem. Se a compilação for bem-sucedida, a imagem resultante é enviada para o Container Registry. Se a imagem não for criada com êxito pela compilação, a compilação falha.
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 substituições definidas pelo utilizador
Também pode definir as suas próprias substituições. As substituições definidas pelo utilizador têm de estar em conformidade com as seguintes regras:
- As substituições têm de começar por um caráter de sublinhado (
_
) e usar apenas letras maiúsculas e números (respeitando a expressão regular_[A-Z0-9_]+
). Isto evita conflitos com substituições incorporadas. Para usar uma expressão que comece por$
, tem de usar$$
. Thus:$FOO
is invalid since it is not a built-in substitution.$$FOO
, que é avaliada como a string literal$FOO
.
- O número de parâmetros está limitado a 200. O comprimento de uma chave de parâmetro está limitado a 100 bytes e o comprimento de um valor de parâmetro está limitado a 4000 bytes.
- Ambas as expressões
$_FOO
e${_FOO}
são avaliadas como o valor de_FOO
. No entanto,${}
permite que a substituição funcione sem espaços circundantes, o que permite substituições como${_FOO}BAR
. $$
allows you to include a literal$
in the template. Thus:$_FOO
evaluates to the value of_FOO
.$$_FOO
avalia a string literal$_FOO
.$$$_FOO
avalia a string literal$
seguida do valor de_FOO
.
Para usar as substituições, use o
--substitutions
argumento no comandogcloud
ou especifique-os no ficheiro de configuração.O exemplo seguinte mostra uma configuração de compilação com duas substituições definidas pelo utilizador denominadas
_NODE_VERSION_1
e_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 substituir o valor de substituição especificado no ficheiro de configuração de compilação, use a flag
--substitutions
no comandogcloud builds submit
. Tenha em atenção que as substituições são um mapeamento de variáveis para valores e não para matrizes ou sequências. Pode substituir os valores das variáveis de substituição predefinidas, exceto para$PROJECT_ID
e$BUILD_ID
. O comando seguinte substitui o valor predefinido de_NODE_VERSION_1
especificado no ficheiro de configuração de compilação acima:gcloud builds submit --config=cloudbuild.yaml \ --substitutions=_NODE_VERSION_1="v6.9.4",_NODE_VERSION_2="v6.9.5" .
Por predefinição, a compilação devolve um erro se houver uma variável de substituição em falta ou uma substituição em falta. No entanto, pode definir a opção
ALLOW_LOOSE
para ignorar esta verificação.O fragmento seguinte imprime "hello world" e define uma substituição não utilizada. Uma vez que a opção de substituição
ALLOW_LOOSE
está definida, a compilação vai ser bem-sucedida apesar da substituição em falta.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 a sua compilação for invocada por um acionador, a opção
ALLOW_LOOSE
é definida por predefinição. Neste caso, a compilação não devolve um erro se houver uma variável de substituição em falta ou uma substituição em falta. Não pode substituir a opçãoALLOW_LOOSE
para compilações invocadas por acionadores.Se a opção
ALLOW_LOOSE
não for especificada, as chaves não correspondentes no mapeamento de substituições ou no pedido de compilação resultam num erro. Por exemplo, se o pedido de compilação incluir$_FOO
e o mapeamento de substituições não definir_FOO
, recebe um erro após executar a compilação ou invocar um acionador se o acionador incluir variáveis de substituição.As seguintes variáveis de substituição contêm sempre um valor de string vazio predefinido, mesmo que não defina a opção
ALLOW_LOOSE
:$REPO_NAME
$REPO_FULL_NAME
$BRANCH_NAME
$TAG_NAME
$COMMIT_SHA
$SHORT_SHA
Quando define uma variável de substituição, não está limitado a strings estáticas. Também tem acesso à carga útil do evento que invocou o seu acionador. Estes estão disponíveis como associações de carga útil. Também pode aplicar expansões de parâmetros bash em variáveis de substituição e armazenar a string resultante como uma nova variável de substituição. Para saber mais, consulte o artigo Usar associações de carga útil e expansões de parâmetros bash em substituições.
Substituições dinâmicas
Pode fazer referência ao valor de outra variável numa substituição definida pelo utilizador definindo a opção
dynamicSubstitutions
comotrue
no ficheiro de configuração de compilação. Se a sua compilação for invocada por um acionador, o campodynamicSubstitutions
é sempre definido comotrue
e não precisa de ser especificado no ficheiro de configuração da compilação. Se a compilação for invocada manualmente, tem de definir o campodynamicSubstitutions
comotrue
para que as expansões de parâmetros bash sejam interpretadas quando executar a compilação.O ficheiro de configuração de compilação seguinte mostra a variável de substituição
${_IMAGE_NAME}
que faz referência à variável${PROJECT_ID}
. O campodynamicSubstitutions
está definido comotrue
, pelo que a referência é aplicada quando invoca uma compilação 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: true
JSON
{ "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 o artigo Aplicar expansões de parâmetros bash.
Mapeamento de substituições para variáveis de ambiente
Os scripts não suportam diretamente substituições, mas suportam variáveis de ambiente. Pode mapear substituições para variáveis de ambiente, quer automaticamente de uma só vez, quer manualmente definindo cada variável de ambiente por si.
Mapeie substituições automaticamente
Ao nível da criação. Para mapear automaticamente todas as substituições para variáveis de ambiente, que vão estar disponíveis durante toda a compilação, defina
automapSubstitutions
comotrue
como opção ao nível da compilação. Por exemplo, o ficheiro de configuração de compilação seguinte mostra a substituição$_USER
definida pelo utilizador e a substituição$PROJECT_ID
predefinida mapeadas 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" } }
Ao nível do passo. Para mapear automaticamente todas as substituições e torná-las disponíveis como variáveis de ambiente num único passo, defina o campo
automapSubstitutions
comotrue
nesse passo. No exemplo seguinte, apenas o segundo passo mostra as substituições corretamente, porque é o único 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, pode disponibilizar as substituições como variáveis de ambiente em toda a compilação e, em seguida, ignorá-las num passo. Defina
automapSubstitutions
comotrue
ao nível da compilação e, em seguida, defina o mesmo campo comofalse
no passo em que quer ignorar as substituições. No exemplo seguinte, embora as substituições de mapeamento estejam ativadas ao nível da compilação, o ID do projeto não é impresso no segundo passo, porqueautomapSubstitutions
está definido comofalse
nesse passo: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" }
Mapeie substituições manualmente
Pode mapear manualmente as substituições para variáveis de ambiente. Todas as variáveis de ambiente são definidas ao nível do passo através do campo
env
, e o âmbito das variáveis está restrito ao passo onde são definidas. Este campo recebe uma lista de chaves e valores.O exemplo seguinte mostra como mapear a substituição
$PROJECT_ID
para 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" } ] }
O que se segue?
- Saiba como usar associações de payload e expansões de parâmetros bash em substituições.
- Saiba como criar um ficheiro de configuração de compilação básico.
- Saiba como criar e gerir acionadores de compilação.
- Saiba como executar compilações manualmente no Cloud Build.
Pode especificar variáveis de duas formas: $_FOO
ou ${_FOO}
: