bash 스크립트 실행

이 페이지에서는 빌드 단계 내에서 bash 스크립트를 실행하도록 Cloud Build를 구성하는 방법을 설명합니다. Cloud Build를 처음 사용하는 경우 빠른 시작 및 빌드 구성 개요를 먼저 읽어보세요.

빌드 단계 내에서 bash 스크립트를 실행하여 많은 스크립트를 구성할 수 있습니다.

  • 하나의 빌드 단계로 여러 명령어를 실행합니다.
  • 파일 시스템에서 읽기를 수행합니다.
  • 재시도 또는 조건과 같은 논리를 빌드합니다.
  • echo $VARNAME 실행과 같이 로그로 출력합니다.

script 필드 사용

Cloud Build는 빌드 단계에서 실행할 셸 스크립트를 지정하는 데 사용할 수 있는 script 필드를 제공합니다. script 필드는 단일 문자열 값을 사용합니다.

문자열 값에 shebang 프리픽스를 추가하여 스크립트를 해석하는 셸을 지정할 수 있습니다. 예를 들어 Bash 셸을 지정하려면 #!/usr/bin/env bash를 추가합니다. 스크립트 문자열에 shebang 프리픽스를 붙이지 않으면 Cloud Build는 Bash 셸이 아닌 기본 sh 셸인 #!/bin/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"
      }
    }
    
  • 단계 수준에서. 모든 대체 항목을 자동으로 매핑하고 한 번에 환경 변수로 사용할 수 있게 하려면 해당 단계에서 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로 설정합니다. 다음 예시에서는 빌드 수준에서 매핑 대체 항목이 사용 설정되어 있더라도 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 명령어를 실행하려면 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 진입점은 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 문서를 참조하세요.

다음 단계