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

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

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

시작하기 전에

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

필수 IAM 권한

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

Python 빌드 구성

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

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

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

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

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

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

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

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

        - name: 'python'
          entrypoint: 'python'
          args: ['-m', 'pytest', '--junitxml=${SHORT_SHA}_test_log.xml']
    
  4. 빌드: 빌드 구성 파일에서 애플리케이션을 빌드하도록 빌더와 args를 정의합니다.

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

    다음 빌드 단계로 빌드를 시작합니다.

        - name: 'python'
          entrypoint: 'python'
          args: ['-m', 'build']
    
  5. Artifact Registry에 업로드:

    Cloud Build는 Cloud Build 구성 파일에서 사용 가능한 python_packages 필드를 사용하여 Artifact Registry에 아티팩트를 업로드할 때 독립형 Python 패키지에 대해 SLSA(Supply chain Levels for Software Artifacts) 빌드 출처 정보를 생성합니다.

    구성 파일에서 pythonPackages 필드를 추가하고 Artifact Registry에서 Python 저장소를 지정합니다.

        artifacts:
           pythonPackages:
           - repository: 'https://LOCATION-python.pkg.dev/PROJECT-ID/REPOSITORY'
              paths: ['dist/*']
    

    다음 값을 바꿉니다.

    • PROJECT-ID는 Artifact Registry 저장소가 포함된 Google Cloud 프로젝트의 ID입니다.
    • REPOSITORY는 저장소 ID입니다.
    • LOCATION은 저장소의 리전 또는 멀티 리전 위치입니다.
  6. 선택사항: 리전 빌드의 출처 사용 설정

    리전 빌드를 사용하는 경우 빌드 구성 파일의 optionsrequestedVerifyOption 필드를 추가합니다. 값을 VERIFIED로 설정하여 출처 메타데이터 생성을 사용 설정합니다. requestedVerifyOption: VERIFIED를 추가하지 않으면 Cloud Build가 전역 빌드에 대해서만 출처를 생성합니다.

    options:
      requestedVerifyOption: VERIFIED
    
  7. Cloud Storage에 테스트 로그 저장: 기존 버킷 위치 및 테스트 로그 경로를 지정하여 Cloud Storage에 테스트 로그를 저장하도록 Cloud Build를 구성할 수 있습니다. 다음 빌드 단계는 JUNIT XML 파일에 저장한 테스트 로그를 Cloud Storage 버킷에 저장합니다.

        artifacts:
        objects:
           location: 'gs://${_BUCKET_NAME}/'
           paths:
              - '${SHORT_SHA}_test_log.xml'
    
  8. 빌드 시작: 수동 또는 빌드 트리거를 사용하여 시작합니다.

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

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

다음 단계