Python 애플리케이션 빌드, 테스트, 컨테이너화

이 페이지에서는 Python 애플리케이션을 빌드, 테스트, 컨테이너화, 배포하도록 Cloud Build를 구성하는 방법을 설명합니다.

Cloud Build를 사용하면 공개적으로 사용 가능한 컨테이너 이미지를 사용하여 빌드, 테스트, 컨테이너화, Artifact Registry에 업로드, 배포, 빌드 로그 저장과 같은 개발 태스크를 실행할 수 있습니다. Docker Hub의 공개 python 이미지pythonpip 도구가 사전 설치된 상태로 제공됩니다. 종속 항목을 설치하기 위해 이러한 도구를 사용하도록 Cloud Build를 구성하고, 이러한 도구를 사용해서 단위 테스트를 빌드 및 실행할 수 있습니다.

시작하기 전에

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

  • API Cloud Build, Cloud Run, Cloud Storage and Artifact Registry 사용 설정

    API 사용 설정

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

필수 IAM 권한

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

Python 빌드 구성

이 섹션에서는 Python 앱에 대한 빌드 구성 파일 예시를 살펴봅니다. 여기에는 요구사항 설치, 단위 테스트 추가, 테스트 성공 후의 앱 빌드 및 배포를 위한 빌드 단계가 포함되어 있습니다.

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

  2. 설치 요구사항: Docker Hub의 python 이미지는 pip가 사전 설치된 상태로 제공됩니다. pip에서 종속 항목을 설치하려면 다음 필드가 포함된 빌드 단계를 추가합니다.

    • name: 이 태스크에 대해 Docker Hub에서 Python 이미지를 사용하도록 이 필드의 값을 python로 설정합니다.
    • entrypoint: 이 필드를 설정하면 name에 참조된 이미지의 기본 진입점이 재정의됩니다. 빌드 단계의 진입점으로 pip를 호출하도록 이 필드의 값을 pip로 설정하고 pip 명령어를 실행합니다.
    • args: 빌드 단계의 args 필드는 인수 목록을 가져와서 name 필드로 참조되는 이미지에 전달합니다. 이 필드에서 pip install 명령어를 실행하도록 인수를 전달합니다. pip install 명령어의 --user 플래그는 후속 빌드 단계가 이 빌드 단계에서 설치된 모듈에 액세스할 수 있도록 합니다.

    다음 빌드 단계는 requirements.txt 파일에서 요구사항을 설치하기 위해 인수를 추가합니다.

    steps:
      # Install dependencies
      - name: python
        entrypoint: pip
        args: ["install", "-r", "requirements.txt", "--user"]
  3. 단위 테스트 추가: pytest와 같은 테스트 프레임워크를 사용하여 애플리케이션에서 단위 테스트를 정의한 경우 빌드 단계에서 다음 필드를 추가하여 테스트를 실행하도록 Cloud Build를 구성할 수 있습니다.

    • name: 사용자의 태스크에 대해 Docker Hub에서 Python 이미지를 사용하도록 이 필드의 값을 python로 설정합니다.
    • entrypoint: python 명령어를 실행하도록 이 필드의 값을 python으로 설정합니다.
    • args: python pytest 명령어를 실행하기 위해 인수를 추가합니다.

    다음 빌드 단계는 pytest 로그 출력을 JUNIT XML 파일에 저장합니다. 이 파일의 이름은 해당 빌드와 연관된 커밋 ID의 짧은 버전을 사용하여 생성됩니다. 이후의 빌드 단계는 이 파일의 로그를 Cloud Storage에 저장합니다.

    # Run unit tests
    - name: python
      entrypoint: python
      args: ["-m", "pytest", "--junitxml=${SHORT_SHA}_test_log.xml"] 
  4. 앱 컨테이너화: 테스트가 성공했는지 확인하기 위한 빌드 단계를 추가한 후 애플리케이션을 빌드할 수 있습니다. Cloud Build는 Python 애플리케이션을 컨테이너화하기 위해 사용할 수 있는 사전 빌드된 Docker 이미지를 제공합니다. 앱을 컨테이너화하려면 빌드 단계에서 다음 필드를 추가합니다.

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

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

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

    • name: 해당 태스크에 대해 Container Registry의 공식 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}/${_ARTIFACT_REGISTRY_REPO}/myimage:${SHORT_SHA}']

    선택사항: Cloud Build가 빌드 출처 정보를 생성하도록 하려면 Docker push 빌드 단계를 사용하는 별도 항목 대신 빌드 단계에서 images 필드를 사용합니다. 리전 빌드를 사용하는 경우 requestedVerifyOption 필드도 추가하고 값을 VERIFIED로 설정하여 출처 생성을 사용 설정해야 합니다.

  6. Cloud Run에 컨테이너 배포: Cloud Run에서 이미지를 배포하려면 다음 필드를 사용하여 빌드 단계를 추가합니다.

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

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

    # Deploy to Cloud Run
    - name: google/cloud-sdk
      args: ['gcloud', 'run', 'deploy', 'helloworld-${SHORT_SHA}',
             '--image=us-central1-docker.pkg.dev/${PROJECT_ID}/${_ARTIFACT_REGISTRY_REPO}/myimage:${SHORT_SHA}',
             '--region', 'us-central1', '--platform', 'managed',
             '--allow-unauthenticated']
  7. 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:
      # Install dependencies
      - name: python
        entrypoint: pip
        args: ["install", "-r", "requirements.txt", "--user"]
    
      # Run unit tests
      - name: python
        entrypoint: python
        args: ["-m", "pytest", "--junitxml=${SHORT_SHA}_test_log.xml"]
    
      # Docker Build
      - name: 'gcr.io/cloud-builders/docker'
        args: ['build', '-t',
               'us-central1-docker.pkg.dev/${PROJECT_ID}/${_ARTIFACT_REGISTRY_REPO}/myimage:${SHORT_SHA}', '.']
    
      # Docker push to Google Artifact Registry
      - name: 'gcr.io/cloud-builders/docker'
        args: ['push',  'us-central1-docker.pkg.dev/${PROJECT_ID}/${_ARTIFACT_REGISTRY_REPO}/myimage:${SHORT_SHA}']
    
      # Deploy to Cloud Run
      - name: google/cloud-sdk
        args: ['gcloud', 'run', 'deploy', 'helloworld-${SHORT_SHA}',
               '--image=us-central1-docker.pkg.dev/${PROJECT_ID}/${_ARTIFACT_REGISTRY_REPO}/myimage:${SHORT_SHA}',
               '--region', 'us-central1', '--platform', 'managed',
               '--allow-unauthenticated']
    
    # 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}/${_ARTIFACT_REGISTRY_REPO}/myimage:${SHORT_SHA}
  8. 빌드 시작: 수동 또는 빌드 트리거를 사용하여 시작합니다.

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

    또한 소프트웨어 공급망 보호를 돕기 위해 빌드 출처 메타데이터를 확인하고 출처를 검증할 수 있습니다.

다음 단계