Go 애플리케이션 빌드 및 테스트

이 페이지에서는 Cloud Build를 사용하여 Go 애플리케이션을 빌드, 테스트, 배포하는 방법을 설명합니다.

시작하기 전에

이 페이지의 안내에서는 Go에 익숙하다고 가정합니다. 또한 다음 사항도 적용됩니다.

  • Enable the Cloud Build, Cloud Run, and Artifact Registry APIs.

    Enable the APIs

  • 이 페이지에서 gcloud 명령어를 실행하려면 Google Cloud CLI를 설치합니다.
  • Go 프로젝트를 준비합니다.
  • Cloud Build를 사용하여 Go 앱을 컨테이너화하려면 소스 코드와 함께 Dockerfile이 필요합니다.
  • Artifact Registry에 빌드한 컨테이너를 저장하려면 Artifact Registry의 Docker 저장소를 만듭니다.
  • Cloud Storage에 테스트 로그를 저장하려면 Cloud Storage에서 버킷을 만듭니다.

필수 IAM 권한

이러한 역할 부여에 대한 자세한 내용은 IAM 페이지를 사용하여 역할 부여를 참조하세요.

Go 빌드 구성

Docker Hub의 공개 golang 이미지는 Go 모듈을 사용한 빌드를 지원합니다. Cloud Build 구성 파일에서 이 이미지를 빌드 단계로 사용하면 이미지 내에서 go 명령어를 호출할 수 있습니다. 이 빌드 단계로 전달된 인수는 바로 golang 도구로 전달되어 이 이미지에 있는 모든 go 명령어를 실행할 수 있도록 합니다.

이 섹션에서는 Go 앱에 대한 빌드 구성 파일 예시를 살펴봅니다. 앱 빌드, 단위 테스트 추가, 테스트 성공 후의 앱 컨테이너화 및 배포를 위한 빌드 단계가 포함되어 있습니다.

Go 애플리케이션을 빌드하려면 다음 안내를 따르세요.

  1. 프로젝트 루트 디렉터리에서 cloudbuild.yaml이라는 Cloud Build 구성 파일을 만듭니다.

  2. 빌드 및 테스트: 애플리케이션에 단위 테스트를 정의한 경우 빌드 단계에서 다음 필드를 추가하여 테스트를 실행하도록 Cloud Build를 구성할 수 있습니다.

    • name: 사용자의 태스크에 대해 Docker Hub에서 Python 이미지를 사용하도록 이 필드의 값을 golang으로 설정합니다.
    • entrypoint: 이 필드의 값을 /bin/bash로 설정합니다. 이렇게 하면 빌드 단계에서 직접 여러 줄로 구성된 bash 명령어를 실행할 수 있습니다.
    • args: 빌드 단계의 args 필드는 인수 목록을 가져와서 name 필드로 참조되는 이미지에 전달합니다. 다음 예시에서 args 필드는 다음에 대한 인수를 가져옵니다.

      • 테스트 로그 형식 지정 도구를 실행하여 테스트 로그 출력을 다운로드합니다.
      • 로그 출력을 인쇄합니다.
      • sponge.log에 테스트 결과를 저장합니다.
      • sponge.log의 결과를 JUNIT XML 파일로 출력합니다. JUNIT XML 파일의 이름은 해당 빌드와 연관된 커밋 ID의 짧은 버전을 사용하여 생성됩니다. 이후의 빌드 단계는 이 파일의 로그를 Cloud Storage에 저장합니다.
      steps:
        # Run tests and save to file
        - name: golang:1.22
          entrypoint: /bin/bash
          args: 
            - -c
            - |
              go install github.com/jstemmer/go-junit-report/v2@latest
              2>&1 go test -timeout 1m -v ./... | /go/bin/go-junit-report -set-exit-code -iocopy -out ${SHORT_SHA}_test_log.xml
  3. 앱 컨테이너화: 테스트가 성공했는지 확인하기 위한 빌드 단계를 추가한 후 애플리케이션을 빌드할 수 있습니다. Cloud Build는 Go 애플리케이션을 컨테이너화하기 위해 사용할 수 있는 사전 빌드된 Docker 이미지를 제공합니다. 앱을 컨테이너화하려면 빌드 단계에서 다음 필드를 추가합니다.

    • name: 해당 태스크에 대해 사전 빌드된 Docker 이미지를 사용하도록 이 필드의 값을 gcr.io/cloud-builders/docker로 설정합니다.
    • args: docker build 명령어에 대한 인수를 이 필드에 대한 값으로 추가합니다.

    다음 빌드 단계는 myimage 이미지를 빌드하고 커밋 ID의 짧은 버전을 태그로 지정합니다. 이 빌드 단계는 프로젝트 ID, 저장소 이름, 짧은 SHA 값에 대해 대체 항목을 사용하므로 해당 값이 빌드 시간에 자동으로 대체됩니다. 이미지를 저장하려면 Artifact Registry에 Docker 저장소를 만들거나 기존 항목이 있어야 합니다.

    # Docker Build
    - name: 'gcr.io/cloud-builders/docker'
      args: ['build', '-t', 
             'us-central1-docker.pkg.dev/$PROJECT_ID/$_REPO_NAME/myimage:$SHORT_SHA', '.']
  4. Artifact Registry에 컨테이너 푸시: 빌드 아티팩트를 저장, 관리, 보호하기 위해 사용할 수 있는 Google Cloud 서비스인 Artifact Registry에서 빌드된 컨테이너를 저장할 수 있습니다. 이렇게 하려면 Artifact Registry에 기존 Docker 저장소가 있어야 합니다. Artifact Registry Docker 저장소에 이미지를 저장하도록 Cloud Build를 구성하려면 다음 필드를 사용하여 빌드 단계를 추가합니다.

    • name: 태스크에 공식 docker 빌더 이미지를 사용하도록 이 필드의 값을 gcr.io/cloud-builders/docker로 설정합니다.
    • args: docker push 명령어에 대한 인수를 이 필드에 대한 값으로 추가합니다. 대상 URL에 대해서는 이미지를 저장할 Artifact Registry Docker 저장소를 입력합니다.

    다음 빌드 단계는 이전 단계에서 빌드한 이미지를 Artifact Registry에 푸시합니다.

    # Docker push to Google Artifact Registry
    - name: 'gcr.io/cloud-builders/docker'
      args: ['push', 'us-central1-docker.pkg.dev/$PROJECT_ID/$_REPO_NAME/myimage:$SHORT_SHA']
  5. Cloud Run에 컨테이너 배포: Cloud Run에서 이미지를 배포하려면 다음 필드를 사용하여 빌드 단계를 추가합니다.

    • name: Cloud Run에 이미지를 배포하기 위해 gcloud CLI를 사용하여 gcloud 명령어를 배포하도록 이 필드의 값을 google/cloud-sdk로 설정합니다.
    • args: gcloud run deploy 명령어에 대해 인수를 이 필드의 값으로 추가합니다.

    다음 빌드 단계는 이전에 빌드한 이미지를 Cloud Run에 배포합니다.

    # Deploy to Cloud Run
    - name: 'gcr.io/cloud-builders/gcloud'
      args: ['run', 'deploy', 'helloworld-${SHORT_SHA}', 
             '--image=us-central1-docker.pkg.dev/$PROJECT_ID/$_REPO_NAME/myimage:$SHORT_SHA', 
             '--region', 'us-central1', '--platform', 'managed']
  6. Cloud Storage에 테스트 로그 저장: 기존 버킷 위치 및 테스트 로그 경로를 지정하여 Cloud Storage에 테스트 로그를 저장하도록 Cloud Build를 구성할 수 있습니다.

    다음 빌드 단계는 JUNIT XML 파일에 저장한 테스트 로그를 Cloud Storage 버킷에 저장합니다.

    # Save test logs to Google Cloud Storage
    artifacts:
      objects:
        location: gs://$_BUCKET_NAME/
        paths:
          - ${SHORT_SHA}_test_log.xml

    다음 스니펫은 위에 설명한 모든 단계에 대한 전체 빌드 구성 파일을 보여줍니다.

    steps:
      # Run tests and save to file
      - name: golang:1.22
        entrypoint: /bin/bash
        args: 
          - -c
          - |
            go install github.com/jstemmer/go-junit-report/v2@latest
            2>&1 go test -timeout 1m -v ./... | /go/bin/go-junit-report -set-exit-code -iocopy -out ${SHORT_SHA}_test_log.xml
    
      # Docker Build
      - name: 'gcr.io/cloud-builders/docker'
        args: ['build', '-t', 
               'us-central1-docker.pkg.dev/$PROJECT_ID/$_REPO_NAME/myimage:$SHORT_SHA', '.']
    
      # Docker push to Google Artifact Registry
      - name: 'gcr.io/cloud-builders/docker'
        args: ['push', 'us-central1-docker.pkg.dev/$PROJECT_ID/$_REPO_NAME/myimage:$SHORT_SHA']
    
      # Deploy to Cloud Run
      - name: 'gcr.io/cloud-builders/gcloud'
        args: ['run', 'deploy', 'helloworld-${SHORT_SHA}', 
               '--image=us-central1-docker.pkg.dev/$PROJECT_ID/$_REPO_NAME/myimage:$SHORT_SHA', 
               '--region', 'us-central1', '--platform', 'managed']
    
    # Save test logs to Google Cloud Storage
    artifacts:
      objects:
        location: gs://$_BUCKET_NAME/
        paths:
          - ${SHORT_SHA}_test_log.xml
    # Store images in Google Artifact Registry
    images:
      - us-central1-docker.pkg.dev/$PROJECT_ID/$_REPO_NAME/myimage:$SHORT_SHA
  7. gcloud CLI 또는 빌드 트리거를 사용하여 빌드를 시작합니다. 빌드를 시작할 때 Artifact Registry 저장소 이름을 지정해야 합니다.

    gcloud CLI를 사용하여 빌드를 시작할 때 Artifact Registry 저장소를 지정하려면 다음 안내를 따르세요.

    gcloud builds submit --region=us-west2 --config=cloudbuild.yaml \
        --substitutions=_REPO_NAME="REPO_NAME"
    

    REPO_NAME을 Artifact Registry 저장소의 이름으로 바꿉니다.

    빌드 트리거로 빌드할 때 Artifact Registry 저장소를 지정하려면 빌드 트리거를 만들대체 변수 필드에 Artifact Registry 저장소의 이름을 지정합니다.

다음 단계