bash スクリプトの実行

このページでは、ビルドステップ内で 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 フィールドでの置換の使用

スクリプトは置換を直接サポートしていませんが、環境変数をサポートしています。置換を環境変数にマッピングすることができます。このマッピングは、一度にすべてを自動で行うことも、すべての環境変数を手動で定義することもできます。

置換を自動的にマッピングする

  • ビルドレベル。すべての置換を環境変数に自動的にマッピングし、ビルド全体で使用できるようにするには、ビルドレベルでオプションとして automapSubstitutionstrue に設定します。たとえば、次のビルド構成ファイルは、環境変数にマッピングされたユーザー定義の置換 $_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 つのステップで無視することができます。ビルドレベルで automapSubstitutionstrue に設定し、置換を無視するステップで同じフィールドを false に設定します。次の例では、ビルドレベルで置換マッピングが有効になっていますが、2 番目のステップで automapSubstitutionsfalse に設定されているため、このステップではプロジェクト 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 のドキュメントをご覧ください。

次のステップ