运行 bash 脚本

本页面介绍如何配置 Cloud Build 以在构建步骤中运行 bash 脚本。如果您是刚接触 Cloud Build,请先阅读快速入门构建配置概览

您可以在构建步骤中运行 bash 脚本以配置多个工作流,其中包括:

  • 在一个构建步骤中运行多个命令。
  • 从文件系统读取。
  • 在重试或条件等逻辑中构建。
  • 输出到日志,例如运行 echo $VARNAME

使用 script 字段

Cloud Build 提供了一个 script 字段,可用于指定 在构建步骤中执行的 Shell 脚本。script 字段接受单个字符串 值。

您可以在字符串值前面加上 shebang 作为前缀 指定用于解释脚本的 shell。例如,添加 #!/usr/bin/env bash指定 Bash shell。如果您未在脚本字符串前面添加 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 文档

后续步骤