Utilizza substitutions nel file di configurazione della build per sostituire variabili specifiche in tempo di compilazione.
Le sostituzioni sono utili per le variabili il cui valore non è noto fino al tempo di compilazione o per riutilizzare una richiesta di build esistente con valori di variabile diversi.
Cloud Build fornisce sostituzioni integrate oppure puoi definire le tue sostituzioni. Utilizza substitutions in steps e images della build per risolvere i relativi valori in tempo di compilazione.
Questa pagina spiega come utilizzare le sostituzioni predefinite o definire le tue substitutions.
Utilizzare le sostituzioni predefinite
Cloud Build fornisce le seguenti sostituzioni predefinite per tutte le build:
$PROJECT_ID: ID del progetto Cloud$BUILD_ID: ID della build$PROJECT_NUMBER: numero del progetto$LOCATION: la regione associata alla build
Cloud Build fornisce le seguenti sostituzioni predefinite per le build richiamate dai trigger:
$TRIGGER_NAME: il nome associato al trigger$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 ramo$TAG_NAME: il nome del tag$REF_NAME: il nome del ramo o del tag$TRIGGER_BUILD_CONFIG_PATH: il percorso del file di configurazione della compilazione utilizzato durante l'esecuzione della build; in caso contrario, una stringa vuota se la build è configurata in linea sul trigger o utilizza unDockerfileoBuildpack.$SERVICE_ACCOUNT_EMAIL: l'indirizzo email del account di servizio che stai utilizzando per la build. Si tratta di un account di servizio predefinito o di un service account specificato dall'utente.$SERVICE_ACCOUNT: il nome della risorsa del account di servizio, nel formatoprojects/PROJECT_ID/serviceAccounts/SERVICE_ACCOUNT_EMAIL
Cloud Build fornisce le seguenti sostituzioni predefinite specifiche di GitHub disponibili per i trigger per richieste di pull:
$_HEAD_BRANCH: il ramo head della richiesta di pull$_BASE_BRANCH: il ramo base della richiesta di pull$_HEAD_REPO_URL: l'URL del repository head della richiesta di pull$_PR_NUMBER: il numero della richiesta di pull
Se una sostituzione predefinita non è disponibile (ad esempio con le build senza origine o con le build che utilizzano l'origine 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'
--substitutions argomento. In particolare, 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', '${_LOCATION}-docker.pkg.dev/$PROJECT_ID/${_REPOSITORY}/my-image', '.']
# my-image is pushed to Artifact Registry
images:
- '${_LOCATION}-docker.pkg.dev/$PROJECT_ID/${_REPOSITORY}/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 creare un'immagine, quindi la esegue il push in Artifact Registry utilizzando la sostituzione predefinita $PROJECT_ID:
In questo esempio:
- La richiesta di build ha un passaggio di build, che utilizza il passaggio di build
dockeringcr.io/cloud-buildersper creare l'immagine Docker.- Il campo
argsnel passaggio specifica gli argomenti da passare al comandodocker, in questo casobuild -t gcr.io/my-project/cb-demo-img ., verrà richiamato (dopo che$PROJECT_IDè stato sostituito con l'ID progetto).
- Il campo
Il
imagescampo contiene il nome dell'immagine. Se la build ha esito positivo, l'immagine risultante viene eseguita il push in Artifact Registry. Se l'immagine non viene creata correttamente dalla build, la build non andrà a buon fine.
YAML
steps:
- name: gcr.io/cloud-builders/docker
args: ["build", "-t", "${_LOCATION}-docker.pkg.dev/$PROJECT_ID/${_REPOSITORY}/cb-demo-img", "."]
images:
- '${_LOCATION}-docker.pkg.dev/$PROJECT_ID/${_REPOSITORY}/cb-demo-img'
JSON
{
"steps": [{
"name": "gcr.io/cloud-builders/docker",
"args": ["build", "-t", "${_LOCATION}-docker.pkg.dev/$PROJECT_ID/${_REPOSITORY}/cb-demo-img", "."]
}],
"images": [
"${_LOCATION}-docker.pkg.dev/$PROJECT_ID/${_REPOSITORY}/cb-demo-img"
]
}
Utilizzare le sostituzioni definite dall'utente
Puoi anche definire le tue sostituzioni. Le sostituzioni definite dall'utente devono rispettare le 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$$. For example:$FOOis invalid since it is not a built-in substitution.$$FOOche restituisce la stringa letterale$FOO.
- Il numero di parametri è limitato a 200. La lunghezza di una chiave di parametro è limitata a 100 byte e la lunghezza di un valore parametro è limitata a 4000 byte.
- Sia
$_FOOsia${_FOO}restituiscono il valore di_FOO. Tuttavia,${}consente alla sostituzione di funzionare senza spazi circostanti, consentendo sostituzioni come${_FOO}BAR. $$lets you include a literal$in the template. For example:$_FOOevaluates to the value of_FOO.$$_FOOrestituisce la stringa letterale$_FOO.$$$_FOOrestituisce la stringa letterale$seguita dal valore di_FOO.
Per utilizzare le sostituzioni, utilizza l'
--substitutionsargomento nel comandogcloudo specificale nel file di configurazione.L'esempio seguente mostra una configurazione di build con due sostituzioni definite dall'utente denominate
_NODE_VERSION_1e_NODE_VERSION_2:YAML
steps: - name: 'gcr.io/cloud-builders/docker' args: ['build', '--build-arg', 'node_version=${_NODE_VERSION_1}', '-t', '${_LOCATION}-docker.pkg.dev/$PROJECT_ID/${_REPOSITORY}/build-substitutions-nodejs-${_NODE_VERSION_1}', '.'] - name: 'gcr.io/cloud-builders/docker' args: ['build', '--build-arg', 'node_version=${_NODE_VERSION_2}', '-t', '${_LOCATION}-docker.pkg.dev/$PROJECT_ID/${_REPOSITORY}/build-substitutions-nodejs-${_NODE_VERSION_2}', '.'] substitutions: _NODE_VERSION_1: v6.9.1 # default value _NODE_VERSION_2: v6.9.2 # default value images: [ '${_LOCATION}-docker.pkg.dev/$PROJECT_ID/${_REPOSITORY}/build-substitutions-nodejs-${_NODE_VERSION_1}', '${_LOCATION}-docker.pkg.dev/$PROJECT_ID/${_REPOSITORY}/build-substitutions-nodejs-${_NODE_VERSION_2}' ]JSON
{ "steps": [{ "name": "gcr.io/cloud-builders/docker", "args": [ "build", "--build-arg", "node_version=${_NODE_VERSION_1}", "-t", "${_LOCATION}-docker.pkg.dev/$PROJECT_ID/${_REPOSITORY}/build-substitutions-nodejs-${_NODE_VERSION_1}", "." ] }, { "name": "gcr.io/cloud-builders/docker", "args": [ "build", "--build-arg", "node_version=${_NODE_VERSION_2}", "-t", "${_LOCATION}-docker.pkg.dev/$PROJECT_ID/${_REPOSITORY}/build-substitutions-nodejs-${_NODE_VERSION_2}", "." ] }], "substitutions": { "_NODE_VERSION_1": "v6.9.1", "_NODE_VERSION_2": "v6.9.2", }, "images": [ "${_LOCATION}-docker.pkg.dev/$PROJECT_ID/${_REPOSITORY}/build-substitutions-nodejs-${_NODE_VERSION_1}", "${_LOCATION}-docker.pkg.dev/$PROJECT_ID/${_REPOSITORY}/build-substitutions-nodejs-${_NODE_VERSION_2}" ] }Per sostituire il valore di sostituzione specificato nel file di configurazione della build, utilizza il flag
--substitutionsnel comandogcloud builds submit. Tieni presente che le sostituzioni sono una mappatura di variabili a valori anziché array o sequenze. Puoi sostituire i valori delle variabili di sostituzione predefinite, ad eccezione di$PROJECT_IDe$BUILD_ID. Il seguente comando sostituisce il valore predefinito di_NODE_VERSION_1specificato nel file di configurazione della build precedente:gcloud builds submit --config=cloudbuild.yaml \ --substitutions=_NODE_VERSION_1="v6.9.4",_NODE_VERSION_2="v6.9.5" .Per impostazione predefinita, la build restituisce un errore se manca una variabile di sostituzione o una sostituzione. Tuttavia, puoi impostare l'opzione
ALLOW_LOOSEper ignorare questo controllo.Il seguente snippet stampa "hello world" e definisce una sostituzione inutilizzata. Poiché è impostata l'opzione di sostituzione
ALLOW_LOOSE, la build avrà esito positivo 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 per impostazione predefinita. In questo caso, la build non restituirà un errore se manca una variabile di sostituzione o una sostituzione. Non puoi sostituire l'opzioneALLOW_LOOSEper le build richiamate dai trigger.Se l'opzione
ALLOW_LOOSEnon è specificata, le chiavi non corrispondenti nella mappatura delle sostituzioni o nella richiesta di build genereranno un errore. Ad esempio, se la richiesta di build include$_FOOe la mappatura delle sostituzioni non definisce_FOO, riceverai un errore dopo aver eseguito la build o richiamato un trigger se il trigger include variabili di sostituzione.Le seguenti variabili di sostituzione contengono sempre un valore di stringa vuota predefinito, 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 trigger. Questi sono disponibili come associazioni di payload. Puoi anche applicare le espansioni dei parametri Bash alle variabili di sostituzione e archiviare la stringa risultante come una nuova variabile di sostituzione. Per saperne di più, consulta Utilizzare le associazioni di payload e le espansioni dei 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
dynamicSubstitutionssutruenel file di configurazione della build. Se la build viene richiamata da un trigger, il campodynamicSubstitutionsè sempre impostato sutruee non deve essere specificato nel file di configurazione della build. Se la build viene richiamata manualmente, devi impostare il campodynamicSubstitutionssutrueaffinché le espansioni dei parametri bash vengano interpretate durante l'esecuzione della build.Il seguente file di configurazione della build mostra la variabile di sostituzione
${_IMAGE_NAME}che fa riferimento alla variabile${PROJECT_ID}. Il campodynamicSubstitutionsè impostato sutrue, quindi il riferimento viene applicato quando si richiama una build manualmente:YAML
steps: - name: 'gcr.io/cloud-builders/docker' args: ['build', '-t', '${_IMAGE_NAME}', '.'] substitutions: _IMAGE_NAME: '${_LOCATION}-docker.pkg.dev/${PROJECT_ID}/${_REPOSITORY}/test-image' options: dynamicSubstitutions: trueJSON
{ "steps": [ { "name": "gcr.io/cloud-builders/docker", "args": [ "build", "-t", "${_IMAGE_NAME}", "." ] } ], "substitutions": { "_IMAGE_NAME": "${_LOCATION}-docker.pkg.dev/${PROJECT_ID}/${_REPOSITORY}/test-image" }, "options": { "dynamic_substitutions": true } }Per saperne di più, consulta Applicare le espansioni dei parametri bash.
Mappare le 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, automaticamente tutte in una volta o manualmente definendo ogni variabile di ambiente.
Mappare automaticamente le sostituzioni
A livello di build. Per mappare automaticamente tutte le sostituzioni alle variabili di ambiente, che saranno disponibili durante l'intera build, imposta
automapSubstitutionssutruecome opzione a livello di build. Ad esempio, il seguente file di configurazione della build mostra la sostituzione definita dall'utente$_USERe la sostituzione predefinita$PROJECT_IDmappate alle 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 renderle disponibili come variabili di ambiente in un singolo passaggio, imposta il campo
automapSubstitutionssutruein quel passaggio. Nell'esempio seguente, solo il secondo passaggio mostrerà correttamente le sostituzioni, perché è l'unico con la mappatura automatica delle sostituzioni 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 variabili di ambiente nell'intera build, quindi ignorarle in un passaggio. Imposta
automapSubstitutionssutruea livello di build, quindi imposta lo stesso campo sufalsenel passaggio in cui vuoi ignorare le sostituzioni. Nell'esempio seguente, anche se la mappatura delle sostituzioni è abilitata a livello di build, l'ID progetto non verrà stampato nel secondo passaggio, perchéautomapSubstitutionsè impostato sufalsein quel 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 manualmente le sostituzioni
Puoi mappare manualmente le sostituzioni alle variabili di ambiente. Ogni variabile di ambiente è definita a livello di passaggio utilizzando il
envcampo, 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_IDalla 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 sostituzioni.
- Scopri come creare un file di configurazione della compilazione di base.
- Scopri come creare e gestire i trigger di build.
- Scopri come eseguire le build manualmente in Cloud Build.
Puoi specificare le variabili in uno dei due modi seguenti: $_FOO o ${_FOO}: