このページでは、Python アプリケーションのビルドとテスト、Artifact Registry へのアーティファクトのアップロード、来歴情報の作成、Cloud Storage でのテストログの保存を行うように Cloud Build を構成する方法について説明します。
Cloud Build を使用すると、一般公開されているコンテナ イメージを使用してタスクを実行できます。一般公開の Docker Hub の python
イメージには、python
と pip
ツールがプリインストールされています。これらのツールを使用して依存関係のインストール、ビルド、単体テストを行うように Cloud Build を構成できます。
始める前に
このページの説明は、Python の知識があることを前提としています。次の特長があります。
-
Cloud Build, Artifact Registry, and Cloud Storage API を有効にします。
- このページで
gcloud
コマンドを実行するには、Google Cloud CLI をインストールします。 - Python プロジェクトを用意します。
- Artifact Registry に Python リポジトリがある。リポジトリがない場合は、新しいリポジトリを作成します。
- テストログを Cloud Storage に保存する場合は、Cloud Storage にバケットを作成します。
必要な IAM 権限
テストログを Logging に保存するには、Cloud Storage バケットのストレージ オブジェクト作成者(
roles/storage.objectCreator
)ロールを Cloud Build サービス アカウントに付与します。ビルドされたイメージを Artifact Registry に保存するには、Cloud Build サービス アカウントに Artifact Registry 書き込み(
roles/artifactregistry.writer
)ロールを付与します。
これらのロールを付与する方法については、IAM ページを使用してロールを付与するをご覧ください。
Python ビルドの構成
このセクションでは、Python アプリのビルド構成ファイルの例を紹介します。これには要件のインストール、単体テストの追加、テスト合格後、アプリをビルド、デプロイするためのビルドステップが含まれます。
プロジェクトのルート ディレクトリに、
cloudbuild.yaml
という名前で Cloud Build 構成ファイルを作成します。インストール要件: 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']
単体テストを追加する:
pytest
などのテスト フレームワークを使用してアプリケーションで単体テストを定義している場合は、ビルドステップで次のフィールドを追加してテストを実行するように Cloud Build を構成できます。name
: タスクの Docker Hub から取得した Python イメージを使用するには、このフィールドの値をpython
に設定します。entrypoint
:python
コマンドを実行するために、このフィールドの値をpython
に設定します。args
:python pytest
コマンドを実行するための引数を追加します。
次のビルドステップでは、
pytest
ログ出力を JUNIT XML ファイルに保存します。このファイルの名前は、$SHORT_SHA
、ビルドに関連付けられた commit ID の短縮バージョンを使用して作成されます。以降のビルドステップでは、このファイルのログを Cloud Storage に保存します。- name: 'python' entrypoint: 'python' args: ['-m', 'pytest', '--junitxml=${SHORT_SHA}_test_log.xml']
ビルド: ビルド構成ファイルで、ビルダーと
args
を定義してアプリケーションをビルドします。name
: タスクの Docker Hub から取得した Python イメージを使用するには、このフィールドの値をpython
に設定します。entrypoint
:python
コマンドを実行するために、このフィールドの値をpython
に設定します。args
: ビルドを実行するための引数を追加します。
次のビルドステップでは、ビルドを開始します。
- name: 'python' entrypoint: 'python' args: ['-m', 'build']
Artifact Registry にアップロードする:
Cloud Build 構成ファイルの
python_packages
フィールドを使用してアーティファクトを Artifact Registry にアップロードすると、Cloud Build がスタンドアロン Python パッケージのサプライ チェーン レベル(SLSA)ビルドの場所情報を生成します。構成ファイルで
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 は、リポジトリのリージョンまたはマルチリージョンのロケーションです。
省略可: リージョン ビルドで来歴を有効にする
リージョン ビルドを使用している場合は、ビルド構成ファイルの
options
にrequestedVerifyOption
フィールドを追加します。来歴メタデータの生成を有効にするには、値をVERIFIED
に設定します。requestedVerifyOption: VERIFIED
を追加しない場合、Cloud Build はグローバル ビルドでのみ来歴を生成します。options: requestedVerifyOption: VERIFIED
テストログを Cloud Storage に保存する: 既存のバケットのロケーションとテストログのパスを指定して、テストログを Cloud Storage に保存するように Cloud Build を構成できます。次のビルドステップでは、JUNIT XML ファイルに保存したテストログを Cloud Storage バケットに保存します。
artifacts: objects: location: 'gs://${_BUCKET_NAME}/' paths: - '${SHORT_SHA}_test_log.xml'
手動またはビルドトリガーを使用してビルドを開始します。
ビルドが完了したら、Artifact Registry でリポジトリの詳細を表示できます。
ビルドの場所のメタデータを表示して、来歴を検証して、ソフトウェア サプライ チェーンを保護することもできます。
次のステップ
- ビルド結果を表示する方法を学習する。
- ビルドを保護する方法を学習する。
- Python アプリケーションをビルドしてコンテナ化する方法を学習する。
- プライベート依存関係を使用する方法を確認する。
- Compute Engine で Blue/Green デプロイを実行する方法を学習する。
- ビルドエラーをトラブルシューティングする方法について学習する。