Menjalankan skrip bash

Halaman ini menjelaskan cara mengonfigurasi Cloud Build untuk menjalankan skrip bash dalam langkah build. Jika Anda baru menggunakan Cloud Build, baca panduan memulai dan ringkasan Konfigurasi build terlebih dahulu.

Anda dapat menjalankan skrip bash dalam langkah build untuk mengonfigurasi sejumlah alur kerja, termasuk:

  • Menjalankan beberapa perintah dalam satu langkah build.
  • Membaca dari sistem file.
  • Membangun logika seperti percobaan ulang atau kondisional.
  • Menampilkan output ke log, misalnya, menjalankan echo $VARNAME.

Menggunakan kolom script

Cloud Build menyediakan kolom script yang dapat Anda gunakan untuk menentukan skrip shell yang akan dijalankan dalam langkah build. Kolom script mengambil satu nilai string.

Anda dapat menambahkan awalan nilai string dengan shebang untuk menentukan shell yang akan menafsirkan skrip. Misalnya, tambahkan #!/usr/bin/env bash untuk menentukan shell Bash. Jika Anda tidak menambahkan awalan string skrip dengan shebang, Cloud Build akan menggunakan #!/bin/sh yang merupakan shell sh dasar, bukan shell Bash.

Jika Anda menentukan script dalam langkah build, Anda tidak dapat menentukan args atau entrypoint dalam langkah yang sama.

Cuplikan berikut menunjukkan kolom 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"
  }
  ]
}

Menggunakan substitusi dengan kolom script

Skrip tidak secara langsung mendukung substitusi, tetapi mendukung variabel lingkungan. Anda dapat memetakan substitusi ke variabel lingkungan, baik secara otomatis sekaligus, atau secara manual dengan menentukan setiap variabel lingkungan sendiri.

Memetakan substitusi secara otomatis

  • Di tingkat build. Untuk memetakan semua substitusi ke variabel lingkungan secara otomatis, yang akan tersedia di seluruh build, tetapkan automapSubstitutions ke true sebagai opsi di tingkat build. Misalnya, file konfigurasi build berikut menunjukkan substitusi yang ditentukan pengguna $_USER dan substitusi default $PROJECT_ID yang dipetakan ke variabel lingkungan:

    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"
      }
    }
    
  • Di tingkat langkah. Untuk memetakan semua substitusi secara otomatis dan membuatnya tersedia sebagai variabel lingkungan dalam satu langkah, tetapkan kolom automapSubstitutions ke true dalam langkah tersebut. Dalam contoh berikut, hanya langkah kedua yang akan menampilkan substitusi dengan benar, karena hanya langkah kedua yang mengaktifkan pemetaan substitusi otomatis:

    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"
      }
    

    Selain itu, Anda dapat membuat substitusi tersedia sebagai variabel lingkungan di seluruh build, lalu mengabaikannya dalam satu langkah. Tetapkan automapSubstitutions ke true di tingkat build, lalu tetapkan kolom yang sama ke false di langkah tempat Anda ingin mengabaikan substitusi. Dalam contoh berikut, meskipun substitusi pemetaan diaktifkan di tingkat build, ID project tidak akan dicetak di langkah kedua, karena automapSubstitutions ditetapkan ke false di langkah tersebut:

    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"
      }
    

Memetakan substitusi secara manual

Anda dapat memetakan substitusi ke variabel lingkungan secara manual. Setiap variabel lingkungan ditentukan di tingkat langkah menggunakan kolom env, dan cakupan variabel dibatasi ke langkah tempat variabel tersebut ditentukan. Kolom ini mengambil daftar kunci dan nilai.

Contoh berikut menunjukkan cara memetakan substitusi $PROJECT_ID ke variabel lingkungan BAR:

YAML

steps:
- name: 'ubuntu'
  env:
  - 'BAR=$PROJECT_ID'
  script: 'echo $BAR'

JSON

{
  "steps": [
    {
      "name": "ubuntu",
      "env": [
        "BAR=$PROJECT_ID"
      ],
      "script": "echo $BAR"
    }
  ]
}

Menjalankan skrip bash di disk

Jika Anda menyimpan skrip bash dalam file, simpan file tersebut bersama dengan sumber build, dan referensikan file skrip dalam file konfigurasi build:

YAML

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

JSON

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

Untuk menggunakan skrip bash di file jika bash bukan titik entri default image yang Anda gunakan, tambahkan kolom entrypoint yang mengarah ke bash:

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"
    ]
  }
  ]
}

Menjalankan skrip bash inline

Untuk menjalankan perintah bash menggunakan image bash, tentukan bash sebagai name langkah build, dan perintah di kolom 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"
       ]
    }
  ]
}

Jika image yang Anda gunakan sudah dikemas dengan bash, tetapi jika bash bukan titik entri default, tambahkan kolom entrypoint yang mengarah ke bash. Dalam contoh di bawah, titik entri bash digunakan untuk menjalankan perintah gcloud yang mengkueri Cloud Build untuk status build, yang mencantumkan build dengan status gagal.

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"
    ]
  }
  ]
}

Flag -c dalam kode di atas digunakan untuk menjalankan perintah multi-baris. String apa pun yang Anda teruskan setelah -c akan diperlakukan sebagai perintah. Untuk mengetahui informasi selengkapnya tentang menjalankan perintah bash dengan -c, lihat dokumentasi bash.

Langkah berikutnya