Python アプリケーションのビルド、テスト、コンテナ化

このページでは、Cloud Build を構成して Python アプリケーションのビルド、テスト、コンテナ化、デプロイを行う方法について説明します。

Cloud Build では、一般公開されているコンテナ イメージを使用して、ビルド、テスト、コンテナ化、Artifact Registry へのアップロード、デプロイ、ビルドログの保存などの開発タスクを実行できます。一般公開の Docker Hub の python イメージには、pythonpip ツールがプリインストールされています。これらのツールを使用して依存関係のインストール、ビルド、単体テストを行うように Cloud Build を構成できます。

始める前に

このページの説明は、Python の知識があることを前提としています。さらに、以下のことに留意してください。

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

    Enable the APIs

  • このページで 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 ファイルに保存します。このファイルの名前は、ビルドに関連付けられた commit 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 をビルドし、commit 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 に push: ビルドされたコンテナは Artifact Registry 内に保存できます。Artifact Registry は、ビルド アーティファクトを保存、管理、保護するために使用できる Google Cloud サービスです。これを行うには、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 に push します。

    # 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 でソフトウェア アーティファクトのためのサプライ チェーン レベル(SLSA)のビルドの来歴情報を生成する場合は、次の操作を行います。

    • Docker push ビルドステップで個別に使用する代わりに、ご自分のビルドステップで images フィールドを使用します。
    • ビルド構成ファイルの options セクションに requestedVerifyOption: VERIFIED を追加します。
  6. コンテナを Cloud Run にデプロイする: Cloud Run にイメージをデプロイするには、次のフィールドを含むビルドステップを追加します。

    • name: このフィールドの値を google/cloud-sdk に設定して、gcloud CLI イメージを使用し、gcloud コマンドを呼び出して Cloud Run にイメージをデプロイします。
    • 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 でリポジトリの詳細を表示できます。

    また、ビルドの来歴メタデータを表示したり、来歴を検証したりすることもできます。

次のステップ