本页面介绍如何配置 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。
如果您在 build 步骤中指定了 script
,则不能在同一步骤中指定 args
或 entrypoint
。
以下代码段演示了 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
字段使用替换项
脚本不直接支持替换,但支持环境 变量。您可以将替代变量映射到环境变量, 也可以一次性自动完成所有操作,也可以通过定义每个环境变量手动完成 。
自动映射替换
在 build 级别。为了自动将所有替换内容映射到 环境变量,在整个构建过程中都可以使用这些变量, 在构建级别将
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" }
此外,您还可以将替换项作为环境变量在整个 build 中提供,然后在一步中忽略它们。在构建级别将
automapSubstitutions
设置为true
,然后在您要忽略替换项的步骤中将同一字段设置为false
。在以下示例中,即使在 build 级别启用了映射替换,系统也不会在第二步中输出项目 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
不是默认入口点,请添加指向 bash
的 entrypoint
字段。在示例中
如下所示,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 文档。
后续步骤
- 了解如何手动启动构建。
- 了解如何使用触发器自动执行构建。
- 了解如何配置构建步骤顺序。
- 了解如何使用社区提供的构建器和自定义构建器。