替換變數值

在建構設定檔中使用 substitutions 可在建構時間替換特定變數。

對於值在建構之前仍未知的變數,或者以不同變數值重複使用現有建構要求而言,substitutions 很實用。

Cloud Build 提供內建 substitutions,您也可以定義自己的 substitutions。在建構的 stepsimages 中使用 substitutions,即可在建構時解析其值。

本頁面說明如何使用預設替代變數,或定義您自己的 substitutions

使用預設 substitutions

Cloud Build 為所有建構作業提供下列預設替代項目:

  • $PROJECT_ID:Cloud 專案 ID
  • $BUILD_ID:版本 ID
  • $PROJECT_NUMBER:您的專案編號
  • $LOCATION:與建構相關聯的區域

Cloud Build 為觸發條件叫用的建構作業提供下列預設替換項目:

  • $TRIGGER_NAME:與觸發條件相關聯的名稱
  • $COMMIT_SHA:與建構相關聯的提交 ID
  • $REVISION_ID:與建構相關聯的提交 ID
  • $SHORT_SHACOMMIT_SHA 的前七個字元
  • $REPO_NAME:存放區名稱
  • $REPO_FULL_NAME:存放區的完整名稱,包括使用者或機構
  • $BRANCH_NAME:分支版本名稱
  • $TAG_NAME:代碼名稱
  • $REF_NAME:分支版本或標記名稱
  • $TRIGGER_BUILD_CONFIG_PATH:建構執行期間使用的建構設定檔路徑;如果建構在觸發事件中內嵌設定,或使用 DockerfileBuildpack,則為空字串。
  • $SERVICE_ACCOUNT_EMAIL:您用於建構的服務帳戶電子郵件地址。這可能是預設服務帳戶,也可能是使用者指定的服務帳戶。
  • $SERVICE_ACCOUNT:服務帳戶的資源名稱,格式為 projects/PROJECT_ID/serviceAccounts/SERVICE_ACCOUNT_EMAIL

Cloud Build 提供下列 GitHub 專屬的預設替換值,可用於提取要求觸發條件:

  • $_HEAD_BRANCH:提取要求的主分支
  • $_BASE_BRANCH:提取要求的基礎分支
  • $_HEAD_REPO_URL:拉取要求的首要存放區網址
  • $_PR_NUMBER:提取要求編號

如果預設 substitution 無法使用 (例如不適用於無原始碼建構,或使用儲存空間原始碼的建構),系統會將出現的遺失變數取代為空字串。

使用 gcloud builds submit 啟動建構時,您可以使用 --substitutions 引數指定通常來自已觸發建構的變數。具體而言,您可以手動提供下列項目的值:

  • $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

例如,下列指令使用 TAG_NAME substitution:

gcloud builds submit --config=cloudbuild.yaml \     --substitutions=TAG_NAME="test" 

以下範例使用預設替換值 $BUILD_ID$PROJECT_ID$PROJECT_NUMBER$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"   ] } 

以下範例顯示建構要求如何使用 docker 建構步驟建構映像檔,然後使用預設 $PROJECT_ID substitution 將映像檔推送至 Container Registry:

在這個例子中:

  • 建構要求有一個建構步驟,使用 gcr.io/cloud-builders 中的 docker 建構步驟來建構 Docker 映像檔。
    • 步驟中的 args 欄位會指定要傳送至 docker 指令的引數,在這個範例中會叫用 build -t gcr.io/my-project/cb-demo-img . (將 $PROJECT_ID 替換為您的專案 ID 之後)。
  • images 欄位包含圖片的名稱。如果建構成功,系統會將產生的映像檔推送至 Container Registry。如果建構未成功建立映像檔,建構將會失敗。

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"   ] } 

使用使用者定義的 substitutions

您也可以定義自己的 substitutions。使用者定義的 substitutions 必須符合下列規則:

  • Substitutions 的開頭必須為底線 (_),且只能使用大寫字母和數字 (遵循規則運算式 _[A-Z0-9_]+),這樣就能避免與內建替換項目發生衝突。如要使用開頭為 $ 的運算式,您必須使用 $$. Thus:
    • $FOO is invalid since it is not a built-in substitution.
    • $$FOO 評估為常值字串 $FOO
  • 參數數量上限為 200 個,參數金鑰的長度上限為 100 個位元組,參數值的長度上限為 4000 個位元組。
  • 您可以使用下列其中一種方式指定變數:$_FOO${_FOO}

    • $_FOO${_FOO} 的計算結果都是 _FOO 的值。不過,${} 不用空格就可以成功 substitution,進而允許使用像是 ${_FOO}BAR 這樣的 substitutions。
    • $$ allows you to include a literal $ in the template. Thus:
      • $_FOO evaluates to the value of _FOO.
      • $$_FOO 的評估結果為常值字串 $_FOO
      • $$$_FOO 的評估結果為常值字串 $,後面接 _FOO 的值。

      如要使用替換值,請在 gcloud 指令中使用 --substitutions 引數,或在設定檔中指定。

      以下範例顯示具有兩個使用者定義 substitutions 的建構設定,名稱分別為 _NODE_VERSION_1_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}"     ] } 

      如要覆寫您在建構設定檔中指定的 substitution 值,請在 gcloud builds submit 指令中使用 --substitutions 標記。請注意,substitutions 是變數與值的對應,而不是變數與陣列或序列的對應。您可以覆寫預設的替換變數值,但 $PROJECT_ID$BUILD_ID 除外。下列指令會覆寫在上述建構設定檔中指定的 _NODE_VERSION_1 預設值:

      gcloud builds submit --config=cloudbuild.yaml \   --substitutions=_NODE_VERSION_1="v6.9.4",_NODE_VERSION_2="v6.9.5" . 

      根據預設,如果有遺失的 substitution 變數或遺失的 substitution,建構會傳回錯誤,但是,您可以設定 ALLOW_LOOSE 選項,略過這項檢查。

      下列程式碼片段會顯示「hello world」,並定義未使用的 substitution。由於已設定 ALLOW_LOOSE substitution 選項,因此,即使遺失 substitution,建構也會成功。

      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"     } } 

      如果您的建構作業是由觸發條件叫用,系統會預設設定 ALLOW_LOOSE 選項。在這種情況下,如果有遺失的 substitution 變數或遺失的 substitution,建構不會傳回錯誤。您無法針對觸發條件所叫用的建構作業覆寫 ALLOW_LOOSE 選項。

      如果未指定 ALLOW_LOOSE 選項,則替換對應或建構要求中的不相符金鑰會導致發生錯誤。舉例來說,如果建構要求包含 $_FOO,而替換對應未定義 _FOO,則在執行建構作業或叫用觸發條件 (如果觸發條件包含替換變數) 後,您會收到錯誤訊息。

      即使您未設定 ALLOW_LOOSE 選項,下列替換變數仍會一律包含預設的空字串值:

      • $REPO_NAME
      • $REPO_FULL_NAME
      • $BRANCH_NAME
      • $TAG_NAME
      • $COMMIT_SHA
      • $SHORT_SHA

      定義替代變數時,不必侷限於靜態字串。您也可以存取觸發條件所叫用的事件酬載。這些值可做為酬載繫結。您也可以對替代變數套用 bash 參數擴充功能,並將產生的字串儲存為新的替代變數。詳情請參閱「在替代變數中使用酬載繫結與 bash 參數擴展」一文。

      動態替換

      您可以在建構設定檔中將 dynamicSubstitutions 選項設為 true,藉此在使用者定義的替換項目中參照其他變數的值。如果版本是由觸發事件叫用,dynamicSubstitutions 欄位一律會設為 true,因此無須在建構設定檔中指定。如果您是手動叫用建構作業,則必須將 dynamicSubstitutions 欄位設為 true,才能在執行建構作業時解讀 bash 參數展開作業。

      下列建構設定檔顯示替換變數 ${_IMAGE_NAME} 參照變數 ${PROJECT_ID}dynamicSubstitutions 欄位已設為 true,因此系統會在手動叫用建構作業時套用參照:

      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    } } 

      詳情請參閱「套用 bash 參數展開功能」。

      將替換項目對應至環境變數

      指令碼不直接支援替換,但支援環境變數。您可以將替換項目對應至環境變數,方法是一次自動全部對應,或手動定義每個環境變數。

      自動對應替換

      • 在建構層級。如要自動將所有替代項目對應至環境變數,並在整個建構期間使用這些變數,請在建構層級將 automapSubstitutions 設為 true 做為選項。舉例來說,以下建構設定檔顯示使用者定義的替代值 $_USER 和預設替代值 $PROJECT_ID 對應至環境變數:

        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"   } } 
      • 在步驟層級。如要自動對應所有替換項目,並在單一步驟中將這些項目設為可用的環境變數,請在該步驟中將 automapSubstitutions 欄位設為 true。在下列範例中,只有第二個步驟會正確顯示替換項目,因為只有這個步驟啟用了自動替換對應功能:

        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"   } 

        此外,您也可以在整個建構作業中將替換項目設為環境變數,然後在單一步驟中忽略這些變數。請在建構層級將 automapSubstitutions 設為 true,然後在要略過替換的步驟中將相同欄位設為 false。在以下範例中,即使在建構層級啟用對應替換功能,系統也不會在第二個步驟中列印專案 ID,因為 automapSubstitutions 已在該步驟中設為 false

        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"   } 

      手動對應

      您可以手動將替換項目對應至環境變數。每個環境變數都會在步驟層級使用env 欄位定義,且變數的範圍僅限於定義變數的步驟。這個欄位會接受鍵和值的清單。

      以下範例說明如何將替換項目 $PROJECT_ID 對應至環境變數 BAR

      YAML

      steps: - name: 'ubuntu'   env:   - 'BAR=$PROJECT_ID'   script: 'echo $BAR' 

      JSON

      {   "steps": [     {       "name": "ubuntu",       "env": [         "BAR=$PROJECT_ID"       ],       "script": "echo $BAR"     }   ] } 

      後續步驟