執行 bash 指令碼

本頁面說明如何設定 Cloud Build,以便在建構步驟中執行 bash 指令碼。如果您是 Cloud Build 新手,請先參閱快速入門課程建構設定總覽

您可以在建構步驟中執行 bash 指令碼,設定多個工作流程,包括:

  • 在一個建構步驟中執行多個指令。
  • 從檔案系統讀取。
  • 內建重試或條件等邏輯。
  • 輸出至記錄檔,例如執行 echo $VARNAME

使用 script 欄位

Cloud Build 提供 script 欄位,可用於指定要在建構步驟中執行的 Shell 指令碼。script 欄位會採用單一字串值。

您可以使用 shebang 為字串值加上前置字元,指定用於解讀指令碼的殼層。例如,新增 #!/usr/bin/env bash 即可指定 Bash 殼層。如果您未在指令碼字串前加上 shebang,Cloud Build 會使用 #!/bin/sh,這是基本 sh shell,而非 Bash shell。

如果您在建構步驟中指定 script,則無法在同一步驟中指定 argsentrypoint

下列程式碼片段示範 script 欄位:

YAML

steps:
- name: 'bash'
  script: |
    #!/usr/bin/env bash
    echo "Hello World"
- name: 'ubuntu'
  script: echo hello
- name: 'python'
  script: |
    #!/usr/bin/env python
    print('hello from python')

JSON

{
  "steps": [
  {
    "name": "bash",
    "script": "#!/usr/bin/env bash echo 'Hello World'"
  },
  {
    "name": "ubuntu",
    "script": "echo hello"
  },
  {
    "name": "python",
    "script": "#!/usr/bin/env python\nprint('hello from python')\n"
  }
  ]
}

使用 script 欄位的替換值

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

自動對應替換

  • 在建構層級。如要自動將所有替代項目對應至環境變數,並在整個建構期間使用這些變數,請在建構層級將 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"
    }
  ]
}

在磁碟上執行 bash 指令碼

如果您將 bash 指令碼儲存在檔案中,請將該檔案與建構來源一併儲存,並在建構設定檔中參照指令碼檔案:

YAML

steps:
- name: 'bash'
  args: ['./myscript.bash']

JSON

{
  "steps": [
  {
    "name": "bash",
    "args": [
      "./myscript.bash"
     ]
  }
  ]
}

如要在檔案上使用 Bash 指令碼,如果 Bash 不是您使用的映像檔的預設進入點,請新增指向 Bash 的 entrypoint 欄位:

YAML

steps:
- name: 'gcr.io/cloud-builders/gcloud'
  entrypoint: 'bash'
  args: ['tools/myScript.sh','--foo']

JSON

{
  "steps": [
  {
    "name": "gcr.io/cloud-builders/gcloud",
    "entrypoint": "bash",
    "args": [
      "tools/myScript.sh",
      "--foo"
    ]
  }
  ]
}

執行內嵌 Bash 指令碼

如要使用 bash 映像檔執行 bash 指令,請將 bash 指定為建構步驟的 name,並在 args 欄位中指定指令:

YAML

steps:
- name: 'bash'
  args: ['echo', 'I am running a bash command']

JSON

{
  "steps": [
    {
      "name": "bash",
      "args": [
        "echo",
        "I am running a bash command"
       ]
    }
  ]
}

如果您使用的映像檔已預先封裝 bash,但 bash 並非預設進入點,請新增指向 bashentrypoint 欄位。在以下範例中,bash 進入點用於執行 gcloud 指令,以便查詢 Cloud Build 的建構狀態,並列出狀態為失敗的建構項目。

YAML

steps:
- name: 'gcr.io/google.com/cloudsdktool/cloud-sdk'
  entrypoint: 'bash'
  args:
  - '-eEuo'
  - 'pipefail'
  - '-c'
  - |-
    gcloud builds list > builds.txt
    while read line; do
        if grep -q "FAILURE" <<< "$line"; then
            echo "$line"
        fi
    done < builds.txt

JSON

{
  "steps": [
  {
    "name": "gcr.io/google.com/cloudsdktool/cloud-sdk",
    "entrypoint": "bash",
    "args": [
      "-eEuo",
      "pipefail",
      "-c",
      "gcloud builds list > builds.txt\nwhile read line; do\n    if grep -q \"FAILURE\" <<< \"$line\"; then\n        echo \"$line\"\n    fi\ndone < builds.txt"
    ]
  }
  ]
}

上述程式碼中的 -c 標記用於執行多行指令。您在 -c 後方傳遞的任何字串都會視為指令。如要進一步瞭解如何使用 -c 執行 bash 指令,請參閱 bash 說明文件

後續步驟