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

이 페이지에서는 Cloud Build를 사용하여 Go 애플리케이션을 빌드 및 테스트하고, 아티팩트를 Artifact Registry에 업로드하고, 출처 정보를 생성하고, Cloud Storage에서 테스트 로그를 저장하는 방법을 설명합니다.

시작하기 전에

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

  • Cloud Build, Cloud Run, Artifact Registry API를 사용 설정합니다.

    API 사용 설정에 필요한 역할

    API를 사용 설정하려면 serviceusage.services.enable 권한이 포함된 서비스 사용량 관리자 IAM 역할(roles/serviceusage.serviceUsageAdmin)이 필요합니다. 역할 부여 방법 알아보기.

    API 사용 설정

  • 이 페이지에서 gcloud 명령어를 실행하려면 Google Cloud CLI를 설치합니다.
  • Go 프로젝트를 준비합니다.
  • Artifact Registry에 Go 저장소가 있습니다. 저장소가 없으면 새 저장소를 만듭니다.
  • Cloud Storage에 테스트 로그를 저장하거나 gcloud CLI를 사용하여 빌드를 시작하려면 Cloud Storage에서 버킷을 만듭니다.
  • Cloud Run의 런타임 서비스 계정 ID를 알고 있어야 합니다.

커스텀 Cloud Build 서비스 계정 만들기

Google Cloud CLI에서 다음 명령어를 실행하여 커스텀 Cloud Build 서비스 계정을 만듭니다.

  gcloud iam service-accounts create cloud-build-go \
      --description="Build and test Go applications" \
      --display-name="Cloud Build Go" \
      --project="PROJECT_ID"

PROJECT_ID를 Google Cloud 프로젝트 ID로 바꿉니다. 플래그가 생략된 경우 현재 프로젝트가 사용됩니다.

이 서비스 계정을 사용하여 Go 애플리케이션을 빌드하고 테스트합니다.

IAM 권한 구성

Go 애플리케이션을 빌드하고 배포하는 데 필요한 권한으로 새 서비스 계정을 구성하려면 다음 단계를 따르세요.

  1. 콘솔에서 Cloud Build 권한 페이지로 이동합니다. Google Cloud

    **권한**으로 이동

  2. 서비스 계정 메뉴로 이동하여 cloud-build-go 서비스 계정을 선택합니다.

  3. 다음 역할의 상태를 사용으로 설정합니다.

    • Cloud Run 관리자 (roles/run.admin): Cloud Build에서 Cloud Run에 새 서비스를 배포할 수 있도록 합니다.
    • 스토리지 관리자 (roles/storage.admin): Cloud Storage에서 읽기 및 쓰기를 사용 설정합니다.
    • Artifact Registry 작성자 (roles/artifactregistry.writer): Artifact Registry에서 이미지를 가져오고 Artifact Registry에 쓸 수 있도록 합니다.
    • 로그 작성자 (roles/logging.logWriter): 로그 항목을 Cloud Logging에 쓸 수 있도록 합니다.
    • Cloud Build 편집자 (roles/cloudbuild.builds.editor): 서비스 계정에서 빌드를 실행할 수 있도록 합니다.

Go 빌드 구성

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

이 섹션에서는 cloud-build-samples Git 저장소에서 Go 앱의 빌드 구성 파일 예시를 만드는 방법을 보여줍니다. 빌드 구성 파일에는 앱을 빌드하고, 단위 테스트를 추가하고, 테스트가 통과된 후 앱을 배포하는 단계가 포함되어 있습니다.

Go 애플리케이션 예시를 빌드하려면 다음 단계를 따르세요.

  1. 단위 테스트 구성: 애플리케이션에 단위 테스트를 정의한 경우 빌드 단계에서 다음 필드를 추가하여 테스트를 실행하도록 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.23
            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
        
  2. Artifact Registry에 업로드: 구성 파일에서 goModules 필드를 사용하여 애플리케이션 경로 및 Go 저장소를 Artifact Registry에 지정합니다.

    # Upload Go module to artifact registry
    artifacts:
      goModules:
        - repositoryName: 'repositoryName'
          repositoryLocation: 'location'
          repositoryProjectId: 'projectId'
          sourcePath: 'sourcePath'
          modulePath: 'appPath'
          moduleVersion: 'version'
    

    다음 값을 바꿉니다.

    • repositoryName: Artifact Registry에서 Go 저장소의 이름입니다.
    • location: Artifact Registry에서 저장소의 위치입니다.
    • projectId: Artifact Registry 저장소가 포함된 Google Cloud 프로젝트의 ID입니다.
    • sourcePath: 빌드 작업공간에서 go.mod 파일의 경로입니다.
    • appPath: 패키징된 애플리케이션의 경로입니다.
    • version: 애플리케이션 버전 번호입니다. 형식은 v1.0.1과 같이 숫자와 점으로 되어 있습니다.
  3. 선택사항: 출처 생성 사용 설정

    Cloud Build는 지속적 통합 파이프라인을 보호하는 데 도움이 되도록 검증 가능한 소프트웨어 아티팩트에 대한 공급망 등급(SLSA) 빌드 출처 메타데이터를 생성할 수 있습니다.

    출처 생성을 사용 설정하려면 구성 파일의 options 섹션에 requestedVerifyOption: VERIFIED 를 추가합니다.

    빌드가 완료되면 Artifact Registry에서 저장소 세부정보를 확인할 수 있습니다.

    또한 빌드 출처 기록 메타데이터를 확인하고 출처를 검증할 수 있습니다.

  4. 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.23
          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
    
      # Store golang modules in Google Artifact Registry
      artifacts:
        goModules:
          - repositoryName: 'repositoryName'
            repositoryLocation: 'location'
            repositoryProjectId: 'projectId'
            sourcePath: 'sourcePath'
            modulePath: 'appPath'
            moduleVersion: 'version'
    
  5. gcloud CLI를 사용하여 빌드를 시작하거나 빌드 트리거를 만듭니다.

    gcloud

    --substitutions를 사용하여 대체 변수 를 지정하고 cloudbuild.yaml에 사용된 다음 명령어를 실행합니다.

    gcloud builds submit --region=us-west2 --config=cloudbuild.yaml \
        --default-buckets-behavior=REGIONAL_USER_OWNED_BUCKET \
        --service-account=projects/PROJECT_ID/serviceAccounts/cloud-build-go@PROJECT_ID.iam.gserviceaccount.com \
        --substitutions=_AR_REPO_NAME="_AR_REPO_NAME",_BUCKET_NAME="_BUCKET_NAME",SHORT_SHA="SHORT_SHA"
    

    다음을 바꿉니다.

    • _AR_REPO_NAME: Artifact Registry 저장소의 이름입니다.

    • _BUCKET_NAME: 테스트 로그의 Cloud Storage 버킷 이름입니다.

    • SHORT_SHA: 'manual'과 같은 짧은 일반 텍스트 문자열입니다. SHORT_SHA 값은 트리거에 의해 호출된 빌드에 대해 자동으로 채워지지만 gcloud CLI를 사용하여 빌드를 제출할 때는 제공되지 않습니다.

    빌드 트리거

    빌드 트리거 만들기의 단계를 따릅니다. 대체 변수 필드에서 Artifact Registry 저장소의 이름과 테스트 로그의 Cloud Storage 버킷 이름도 제공해야 합니다.

다음 단계