このページでは、Cloud Build を構成して Python アプリケーションのビルド、テスト、コンテナ化、デプロイを行う方法について説明します。
Cloud Build では、一般公開されているコンテナ イメージを使用して、ビルド、テスト、コンテナ化、Artifact Registry へのアップロード、デプロイ、ビルドログの保存などの開発タスクを実行できます。一般公開の Docker Hub の python
イメージには、python
と pip
ツールがプリインストールされています。これらのツールを使用して依存関係のインストール、ビルド、単体テストを行うように Cloud Build を構成できます。
始める前に
このページの説明は、Python の知識があることを前提としています。さらに、以下のことに留意してください。
-
Enable the Cloud Build, Cloud Run, Cloud Storage and Artifact Registry APIs.
- このページで
gcloud
コマンドを実行するには、Google Cloud CLI をインストールします。 requirements.txt
ファイルを含む Python プロジェクトを用意します。Dockerfile
とソースコードが必要です。- ビルドしたコンテナを Artifact Registry に保存する場合は、Artifact Registry に Docker リポジトリを作成します。
- テストログを Cloud Storage に保存する場合は、Cloud Storage にバケットを作成します。
必要な IAM 権限
テストログを Logging に保存するには、Cloud Storage バケットのストレージ オブジェクト作成者(
roles/storage.objectCreator
)ロールをビルドサービス アカウントに付与します。ビルドされたイメージを Artifact Registry に保存するには、ビルドサービス アカウントに Artifact Registry 書き込み(
roles/artifactregistry.writer
)ロールを付与します。
これらのロールを付与する方法については、IAM ページを使用してロールを付与するをご覧ください。
Python ビルドの構成
このセクションでは、Python アプリのビルド構成ファイルの例を紹介します。これには要件のインストール、単体テストの追加、テスト合格後、アプリをビルド、デプロイするためのビルドステップが含まれます。
プロジェクトのルート ディレクトリに、
cloudbuild.yaml
という名前で Cloud Build 構成ファイルを作成します。インストール要件: 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
ファイルの要件をインストールするための引数を追加します。単体テストを追加する:
pytest
などのテスト フレームワークを使用してアプリケーションで単体テストを定義している場合は、ビルドステップで次のフィールドを追加してテストを実行するように Cloud Build を構成できます。name
: タスクの Docker Hub から取得した Python イメージを使用するには、このフィールドの値をpython
に設定します。entrypoint
:python
コマンドを実行するために、このフィールドの値をpython
に設定します。args
:python pytest
コマンドを実行するための引数を追加します。
次のビルドステップでは、
pytest
ログ出力を JUNIT XML ファイルに保存します。このファイルの名前は、ビルドに関連付けられた commit ID の短縮バージョンを使用して作成されます。以降のビルドステップでは、このファイルのログを Cloud Storage に保存します。アプリをコンテナ化する: ビルドステップを追加してテストに合格したことを確認したら、アプリケーションをビルドします。Cloud Build には、Python アプリケーションのコンテナ化に使用できるビルド済み Docker イメージがあります。アプリをコンテナ化するには、ビルドステップに次のフィールドを追加します。
name
: タスクに事前ビルドされた Docker イメージを使用するには、このフィールドの値をgcr.io/cloud-builders/docker
に設定します。args
:docker build
コマンドの引数を、このフィールドの値として追加します。
次のビルドステップでは、イメージ
myimage
をビルドし、commit ID の短縮バージョンでタグ付けします。ビルドステップでは、プロジェクト ID、リポジトリ名、短縮 SHA 値のデフォルトの置換を使用するため、これらの値はビルド時に自動的に置き換えられます。コンテナを 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 します。
省略可: Cloud Build でソフトウェア アーティファクトのためのサプライ チェーン レベル(SLSA)のビルドの来歴情報を生成する場合は、次の操作を行います。
Docker push
ビルドステップで個別に使用する代わりに、ご自分のビルドステップでimages
フィールドを使用します。- ビルド構成ファイルの
options
セクションにrequestedVerifyOption: VERIFIED
を追加します。
コンテナを Cloud Run にデプロイする: Cloud Run にイメージをデプロイするには、次のフィールドを含むビルドステップを追加します。
name
: このフィールドの値をgoogle/cloud-sdk
に設定して、gcloud CLI イメージを使用し、gcloud
コマンドを呼び出して Cloud Run にイメージをデプロイします。args
:gcloud run deploy
コマンドの引数をこのフィールドの値として追加します。
次のビルドステップでは、以前にビルドしたイメージを Cloud Run にデプロイします。
テストログを Cloud Storage に保存する: 既存のバケットのロケーションとテストログのパスを指定して、テストログを Cloud Storage に保存するように Cloud Build を構成できます。次のビルドステップでは、JUNIT XML ファイルに保存したテストログを Cloud Storage バケットに保存します。
次のスニペットは、上述のすべてのステップの完全なビルド構成ファイルを示しています。
手動またはビルドトリガーを使用してビルドを開始します。
ビルドが完了すると、Artifact Registry でリポジトリの詳細を表示できます。
また、ビルドの来歴メタデータを表示したり、来歴を検証したりすることもできます。
次のステップ
- ビルド結果を表示する方法を学習する。
- ビルドを保護する方法を学習する。
- スタンドアロンの Python アプリケーションのビルド方法について説明します。
- プライベート依存関係を使用する方法を確認する。
- ビルドエラーをトラブルシューティングする方法について学習する。