このページでは、ビルドステップ内で bash スクリプトを実行するように Cloud Build を構成する方法について説明します。Cloud Build を初めて使用する場合は、最初にクイックスタートとビルド構成の概要をご覧ください。
ビルドステップ内で bash スクリプトを実行すると、次のような多数のワークフローを構成できます。
- 1 つのビルドステップで複数のコマンドを実行する。
- ファイル システムからの読み取りを行う。
- 再試行や条件などのロジックを組み込む。
- ログへの出力を行う(例:
echo $VARNAME
の実行)。
script
フィールドの使用
Cloud Build には、ビルドステップで実行するシェル スクリプトを指定するために使用できる script
フィールドがあります。script
フィールドは単一の文字列値を受け取ります。
スクリプトを解釈するシェルを指定するには、文字列の値の先頭に シバン を追加します。たとえば、Bash シェルを指定するには、#!/usr/bin/env bash
を追加します。スクリプト文字列にシバンを付けない場合、Cloud Build は #!/bin/sh
を使用します(つまり、Bash シェルではなく基本的な sh シェルです)。
ビルドステップで 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
フィールドでの置換の使用
スクリプトは置換を直接サポートしていませんが、環境変数をサポートしています。置換を環境変数にマッピングすることができます。このマッピングは、一度にすべてを自動で行うことも、すべての環境変数を手動で定義することもできます。
置換を自動的にマッピングする
ビルドレベル。すべての置換を環境変数に自動的にマッピングし、ビルド全体で使用できるようにするには、ビルドレベルでオプションとして
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" } }
ステップレベル。すべての置換を自動的にマッピングし、1 つのステップで環境変数として使用できるようにするには、対象のステップで
automapSubstitutions
フィールドをtrue
に設定します。次の例では、自動置換マッピングが有効になっているのは 2 番目のステップのみであるため、このステップのみが置換を正しく表示します。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" }
また、置換をビルド全体で環境変数として利用できるようにしてから、1 つのステップで無視することができます。ビルドレベルで
automapSubstitutions
をtrue
に設定し、置換を無視するステップで同じフィールドをfalse
に設定します。次の例では、ビルドレベルで置換マッピングが有効になっていますが、2 番目のステップでautomapSubstitutions
がfalse
に設定されているため、このステップではプロジェクト 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" 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 コマンドを実行するには、ビルドステップの name
として bash
を指定し、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
エントリ ポイントを使用して、Cloud Build にビルド ステータスをクエリし、失敗したステータスを含むビルドを一覧表示する gcloud
コマンドを実行します。
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 のドキュメントをご覧ください。
次のステップ
- ビルドを手動で開始する方法を学習する。
- トリガーを使用してビルドを自動化する方法を学習する。
- ビルドステップの順序を構成する方法を学習する。
- コミュニティ提供のビルダーとカスタム ビルダーを使用する方法を学習する。