Utilizza substitutions
nel file di configurazione della build per sostituire variabili specifiche al momento della compilazione.
Le sostituzioni sono utili per le variabili il cui valore non è noto fino a quando ora della build oppure per riutilizzare una richiesta di build esistente con variabili diverse e i relativi valori.
Cloud Build fornisce sostituzioni integrate oppure puoi definirne di personalizzate
le sostituzioni. Utilizza substitutions
nelle risorse steps
e images
della build
per risolvere i relativi valori al momento della creazione.
Questa pagina spiega come utilizzare le sostituzioni predefinite o definirne di personalizzatesubstitutions
.
Utilizzo delle sostituzioni predefinite
Cloud Build fornisce le seguenti sostituzioni predefinite per tutte le compilazioni:
$PROJECT_ID
: ID del progetto Cloud$BUILD_ID
: ID della build$PROJECT_NUMBER
: il numero del progetto$LOCATION
: la regione associata alla tua build
Cloud Build fornisce le seguenti sostituzioni predefinite per le build richiamati dai trigger:
$TRIGGER_NAME
: il nome associato all'attivatore$COMMIT_SHA
: l'ID commit associato alla build$REVISION_ID
: l'ID commit associato alla build$SHORT_SHA
: i primi sette caratteri diCOMMIT_SHA
$REPO_NAME
: il nome del repository$REPO_FULL_NAME
: il nome completo del repository, incluso l'utente o l'organizzazione$BRANCH_NAME
: il nome del tuo ufficio$TAG_NAME
: il nome del tag$REF_NAME
: il nome del ramo o tag$TRIGGER_BUILD_CONFIG_PATH
: il percorso del file di configurazione della build utilizzato durante l'esecuzione della build; altrimenti una stringa vuota configurato in linea sul trigger oppure utilizza unDockerfile
oBuildpack
.$SERVICE_ACCOUNT_EMAIL
: indirizzo email dell'account di servizio che utilizzi per creare. Questo è un account di servizio predefinito o un servizio specificato dall'utente .$SERVICE_ACCOUNT
: il nome della risorsa dell'account di servizio, nel formatoprojects/PROJECT_ID/serviceAccounts/SERVICE_ACCOUNT_EMAIL
Cloud Build fornisce il seguente valore predefinito specifico per GitHub sostituzioni disponibili per i trigger delle richieste di pull:
$_HEAD_BRANCH
: ramo principale della richiesta di pull$_BASE_BRANCH
: ramo base della richiesta di pull$_HEAD_REPO_URL
: URL del repository principale della richiesta pull$_PR_NUMBER
: numero della richiesta di pull
Se non è disponibile una sostituzione predefinita (ad esempio con le build senza origine o con le build che utilizzano l'origine dello spazio di archiviazione), le occorrenze della variabile mancante vengono sostituite con una stringa vuota.
Quando avvii una build utilizzando gcloud builds submit
, puoi specificare le variabili che normalmente provengono dalle build attivate con l'argomento --substitutions
. Nello specifico,
puoi fornire manualmente i valori per:
$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
Ad esempio, il seguente comando utilizza la sostituzione TAG_NAME
:
gcloud builds submit --config=cloudbuild.yaml \
--substitutions=TAG_NAME="test"
L'esempio seguente utilizza le sostituzioni predefinite $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"
]
}
L'esempio seguente mostra una richiesta di build che utilizza il passaggio di build docker
per la creazione
di un'immagine, quindi ne esegue il push in Container Registry utilizzando il metodo
Sostituzione $PROJECT_ID
:
In questo esempio:
- La richiesta di compilazione ha un passaggio di compilazione che utilizza il passaggio di compilazione
docker
ingcr.io/cloud-builders
per creare l'immagine Docker.- Il campo
args
nel passaggio specifica gli argomenti da passare al comandodocker
, in questo casobuild -t gcr.io/my-project/cb-demo-img .
, che verrà richiamato (dopo che$PROJECT_ID
è stato sostituito con l'ID progetto).
- Il campo
La
images
contiene il nome dell'immagine. Se la build ha esito positivo, viene eseguito il push dell'immagine in Container Registry. Se l'immagine non viene creata correttamente la build non riesce.
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"
]
}
Utilizzo di sostituzioni definite dall'utente
Puoi anche definire le tue sostituzioni. Le sostituzioni definite dall'utente devono essere conformi alle seguenti regole:
- Le sostituzioni devono iniziare con un trattino basso (
_
) e utilizzare solo lettere maiuscole e numeri (rispettando l'espressione regolare_[A-Z0-9_]+
). In questo modo si evitano conflitti con le sostituzioni integrate. Per utilizzare un'espressione che inizia con$
, devi utilizzare$$
. Thus:$FOO
is invalid since it is not a built-in substitution.$$FOO
che restituisce la stringa letterale$FOO
.
- Il numero di parametri è limitato a 200. La lunghezza di una chiave del parametro è limitata a 100 byte e la lunghezza di un valore del parametro è limitata a 4000 byte.
- Sia
$_FOO
che${_FOO}
restituiscono il valore di_FOO
. Tuttavia,${}
consente la sostituzione senza spazi circostanti, il che consente sostituzioni come${_FOO}BAR
. $$
allows you to include a literal$
in the template. Thus:$_FOO
evaluates to the value of_FOO
.$$_FOO
restituisce la stringa letterale$_FOO
.$$$_FOO
restituisce la stringa letterale$
seguita dal valore di_FOO
.
Per utilizzare le sostituzioni, usa
--substitutions
nel comandogcloud
o specificarle nel file di configurazione.L'esempio seguente mostra una configurazione di compilazione con due sostituzioni definite dall'utente chiamate
_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}" ] }
Per sostituire il valore della sostituzione specificato nel file di configurazione di compilazione, utilizza il flag
--substitutions
nel comandogcloud builds submit
. Tieni presente che le sostituzioni sono una mappatura di variabili a valori anziché ad array o sequenze. Puoi sostituire i valori predefiniti delle variabili di sostituzione, ad eccezione di$PROJECT_ID
e$BUILD_ID
. Il seguente comando sostituisce il valore predefinito per_NODE_VERSION_1
specificato nel file di configurazione di compilazione riportato sopra:gcloud builds submit --config=cloudbuild.yaml \ --substitutions=_NODE_VERSION_1="v6.9.4",_NODE_VERSION_2="v6.9.5" .
Per impostazione predefinita, la compilazione restituisce un errore se manca una variabile di sostituzione o una sostituzione. Tuttavia, puoi impostare l'opzione
ALLOW_LOOSE
per saltare questo controllo.Lo snippet seguente stampa "hello world" e definisce una sostituzione inutilizzata. Poiché l'opzione di sostituzione
ALLOW_LOOSE
è impostata, la compilazione andrà a buon fine nonostante la sostituzione mancante.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 la build viene richiamata da un trigger, l'opzione
ALLOW_LOOSE
è impostata da predefinito. In questo caso, la build non restituirà un errore se è presente o una variabile di sostituzione mancante. Non puoi eseguire l'override dell'opzioneALLOW_LOOSE
per le build richiamate dagli attivatori.Se non viene specificata l'opzione
ALLOW_LOOSE
, le chiavi non corrispondenti nella mappatura delle sostituzioni o nella richiesta di compilazione causeranno un errore. Ad esempio, se la tua richiesta di build include$_FOO
e la mappatura delle sostituzioni non definisce_FOO
, tu riceveranno un errore dopo aver eseguito la build o aver richiamato un trigger se include variabili di sostituzione.Le seguenti variabili di sostituzione contengono sempre un valore predefinito di stringa vuota anche se non imposti l'opzione
ALLOW_LOOSE
:$REPO_NAME
$REPO_FULL_NAME
$BRANCH_NAME
$TAG_NAME
$COMMIT_SHA
$SHORT_SHA
Quando definisci una variabile di sostituzione, non sei limitato alle stringhe statiche. Hai anche accesso al payload dell'evento che ha richiamato il tuo trigger. Questi parametri sono disponibili come associazioni del payload. Puoi anche applicare espansioni dei parametri bash sulle variabili di sostituzione e archivia la stringa risultante come nuova variabile di sostituzione. Per saperne di più, consulta la sezione Utilizzo delle associazioni di payload e delle espansioni di parametri bash nelle sostituzioni.
Sostituzioni dinamiche
Puoi fare riferimento al valore di un'altra variabile all'interno di una sostituzione definita dall'utente impostando l'opzione
dynamicSubstitutions
sutrue
nel file di configurazione della build. Se la compilazione viene invocata da un attivatore, il campodynamicSubstitutions
è sempre impostato sutrue
e non deve essere specificato nel file di configurazione della compilazione. Se la compilazione viene invocata manualmente, devi impostare il campodynamicSubstitutions
sutrue
affinché le espansioni dei parametri bash siano interpretate durante l'esecuzione della compilazione.Il seguente file di configurazione di compilazione mostra la variabile di sostituzione
${_IMAGE_NAME}
che fa riferimento alla variabile${PROJECT_ID}
. La Il campodynamicSubstitutions
è impostato sutrue
, quindi il riferimento viene applicata quando richiami manualmente una build: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 } }
Per ulteriori informazioni, consulta la sezione Applicare le espansioni dei parametri bash.
Mappatura delle sostituzioni alle variabili di ambiente
Gli script non supportano direttamente le sostituzioni, ma supportano le variabili di ambiente. Puoi mappare le sostituzioni alle variabili di ambiente, in modo automatico tutte contemporaneamente o manualmente definendo personalmente ogni variabile di ambiente.
Sostituzioni mappa automaticamente
A livello di build. Per mappare automaticamente tutte le sostituzioni a le variabili di ambiente, che saranno disponibili durante tutta la build, imposta
automapSubstitutions
sutrue
come opzione a livello di build. Per Ad esempio, il seguente file di configurazione di compilazione mostra sostituzione$_USER
e sostituzione predefinita$PROJECT_ID
mappata a variabili di 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" } }
A livello di passaggio. Per mappare automaticamente tutte le sostituzioni e rendere disponibili come variabili di ambiente in un solo passaggio,
automapSubstitutions
atrue
in questo passaggio. Nell'esempio seguente, solo il secondo passaggio mostrerà le sostituzioni correttamente, perché è l'unico con la mappatura delle sostituzioni automatiche abilitata: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" }
Inoltre, puoi rendere disponibili le sostituzioni come ambiente variabili nell'intera build, per poi ignorarle in un unico passaggio. Imposta
automapSubstitutions
sutrue
a livello di compilazione, quindi imposta lo stesso campo sufalse
nel passaggio in cui vuoi ignorare le sostituzioni. Nella nell'esempio seguente, anche se le sostituzioni di mappatura sono abilitate a livello di build, l'ID progetto non verrà stampato nel secondo passaggio perchéautomapSubstitutions
è impostato sufalse
in questo passaggio: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" }
Mappare le sostituzioni manualmente
Puoi mappare manualmente le sostituzioni alle variabili di ambiente. Ogni variabile di ambiente viene definita a livello di passaggio utilizzando il campo
env
e l'ambito delle variabili è limitato al passaggio in cui sono definite. Questo campo accetta un elenco di chiavi e valori.L'esempio seguente mostra come mappare la sostituzione
$PROJECT_ID
alla variabile di ambienteBAR
:YAML
steps: - name: 'ubuntu' env: - 'BAR=$PROJECT_ID' script: 'echo $BAR'
JSON
{ "steps": [ { "name": "ubuntu", "env": [ "BAR=$PROJECT_ID" ], "script": "echo $BAR" } ] }
Passaggi successivi
- Scopri come utilizzare le associazioni di payload e le espansioni dei parametri bash nelle sostituzione.
- Scopri come creare un file di configurazione della build di base.
- Scopri come creare e gestire i trigger di build.
- Scopri come eseguire manualmente le build in Cloud Build.
Puoi specificare le variabili in uno dei due modi seguenti: $_FOO
o ${_FOO}
: