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 필드에 대체 항목 사용

스크립트는 대체 항목을 직접 지원하지 않지만 환경 변수를 지원합니다. 모든 환경 변수를 직접 정의하여 대체 항목을 환경 변수에 자동으로 모두 한 번에 또는 수동으로 매핑할 수 있습니다.

대체 항목 자동 매핑

  • 빌드 수준에서. 모든 대체 항목을 전체 빌드에서 사용할 수 있는 환경 변수에 자동으로 매핑하려면 빌드 수준의 옵션으로 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"
      }
    }
    
  • 단계 수준에서. 모든 대체 항목을 자동으로 매핑하고 한 번에 환경 변수로 사용할 수 있게 하려면 해당 단계에서 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"
      }
    

    또한 전체 빌드에서 대체 항목을 환경 변수로 사용할 수 있게 설정한 후 한 번에 무시해도 됩니다. 빌드 수준에서 automapSubstitutionstrue로 설정한 후 대체 항목을 무시하려는 단계에서 동일한 필드를 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 문서를 참조하세요.

다음 단계