このチュートリアルは、公開および限定公開 GitHub リポジトリの両方で機能します。難読化されている場合、プレビュー自体は公開 URL になります。
目標
- Cloud Run サービスを作成する。
- GitHub にソース管理ベースの継続的インテグレーションを実装する。
- Secret Manager を使用してシークレットへのアクセス権を作成し、管理する。
- カスタムのクラウド ビルダーをデプロイする。
- GitHub の pull リクエスト時にビルドを開始する Cloud Build トリガーを作成する。
費用
このドキュメントでは、Google Cloud の次の課金対象のコンポーネントを使用します。
料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。
始める前に
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Cloud Run, Cloud Build, and Secret Manager APIs.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Cloud Run, Cloud Build, and Secret Manager APIs.
必要なロール
チュートリアルを完了するために必要な権限を取得するには、プロジェクトに対して次の IAM ロールを付与するよう管理者に依頼してください。
- Cloud Build 編集者(
roles/cloudbuild.builds.editor
) - Cloud Run 管理者(
roles/run.admin
) - サービス アカウントの作成(
roles/iam.serviceAccountCreator
) - Secret Manager 管理者(
roles/secretmanager.admin
)
ロールの付与の詳細については、アクセスの管理をご覧ください。
コードサンプルを取得する
このチュートリアルでの利便性を考慮し、テンプレートに基づいて Hello World アプリケーションのコピーを含む新しい GitHub リポジトリを作成します。次に、Cloud Build のカスタム構成を持つこのリポジトリに新しいファイルを追加します。
- GitHub にログインし、テンプレート リポジトリに移動します。
- [Use this template] をクリックし、このテンプレートを使用して新しいリポジトリを作成します。
- リポジトリに
helloworld-python
という名前を付けます。 - リポジトリに「Public」または「Private」を選択します。
- [Create repository from template] をクリックします。
- リポジトリに
リポジトリで新しい Cloud Build 構成ファイルを作成します(詳細な手順)。
- リポジトリ ページで、[Add file] > [Create new file] の順にクリックします。
- 新しいファイルに
cloudbuild.yaml
という名前を付けます。 以下のコードを
cloudbuild.yaml
にコピーします。デフォルトの [Commit directly into the
main
branch] を選択したままにします。[Commit new file] をクリックします。
ビルドトリガーを使用してサービスをデプロイする
このチュートリアルでは、ビルドトリガーを設定して、リポジトリのメインブランチを更新するたびにビルドを自動的に開始する方法を説明します。また、変更をデプロイするたびに Cloud Build を呼び出して、サービスを手動でデプロイすることもできます。
このチュートリアルでは、cloudbuild.yaml
ファイルを使用して myservice
というサンプル サービスをデプロイします。
Cloud Run 管理者ロールとサービス アカウント ユーザー ロールを Cloud Build サービス アカウントに付与します(詳細な手順)。
Google Cloud コンソールで、Cloud Build のアカウント設定ページに移動します。
Cloud Run 管理者ロールを有効にします。
確認ダイアログで [すべてのサービス アカウントにアクセス権を付与] をクリックします。
GitHub アカウントを Cloud Build に接続します(詳細な手順)。
Google Cloud コンソールで、[Cloud Build トリガー] ページに移動します。
[リポジトリを接続] をクリックします。
ソースとして [GitHub(Cloud Build GitHub アプリ)] を選択し、認証と認可のダイアログを 1 つずつ確定します。
GITHUB_USER_NAME/helloworld-python リポジトリを選択します。
[リポジトリを接続] をクリックします。
[トリガーの作成(オプション)] で、[トリガーを作成する] をクリックします。
Cloud Build トリガーを作成します(詳細な手順)。
- [Cloud Build トリガー] ページで、[トリガーを作成] をクリックします。
- 次の詳細情報を入力します。
- 名前:
prod-deploy
- イベント: ブランチへの push
- ソース リポジトリ: GITHUB_USER_NAME/helloworld-python
- ソースブランチ:
^main$
- ビルド構成: Cloud Build 構成ファイル(yaml または json)
- Cloud Build 構成ファイルの場所:
cloudbuild.yaml
- 名前:
- [作成] をクリックします。
新しいトリガーを手動で実行します。
- 新しいトリガーのリストで、[実行] をクリックします。
- ポップアップでブランチ名(
main
)を確認し、[トリガーを実行] をクリックします。 - [Cloud Build 履歴] に移動してビルドの進行状況を確認します。
- ビルドが完了するまで待ちます。
デプロイが成功したことを確認します。
Google Cloud コンソールで [Cloud Run] ページに移動します。
デプロイに成功したことを示す緑色のチェックマークがサービスに付されていることを確認します。
[リビジョン] タブをクリックして、サービスにトラフィックの 100% を処理し、「myservice-00001-」で始まる 1 つのリビジョンがあることを確認します。
サービスの URL をクリックして、サービスで「Hello World!」と表示されることを確認します。
トークンと構成を作成する
前のセクションで作成した prod-deploy トリガーは、メインブランチへの push 時にサービスをデプロイします。ここでは、リポジトリで pull リクエストが作成または更新されるたびに実行される 2 つ目のトリガーを作成します。
新しいトリガーを設定すると、プレビューがデプロイされますが、pull リクエストにはプレビューにリンクするための情報は含まれていません。この機能を設定するには、次の追加の構成手順を行う必要があります。
- GitHub トークンを作成します。
- このトークンを Secret Manager に保存します。
- Cloud Build で 1 つのステップとして使用するカスタム イメージを作成します。
GitHub トークンを作成して保存する
- pull リクエストへの書き戻しを許可するため、GitHub トークンを作成します(詳細な手順)。
- GitHub 個人アクセス トークンの設定ページに移動します。
- [Generate new token] をクリックします。
- 次の詳細情報を入力します。
- 注:
preview-deploy
- 有効期限: 30 日間
- スコープ:
- 公開リポジトリの場合:
repo:status
(commit ステータスにアクセス) - 限定公開リポジトリの場合:
repo
(限定公開リポジトリのフル コントロール)
- 公開リポジトリの場合:
- 注:
- [Generate token] をクリックします。
- 生成されたトークンの値をコピーします。
Secret Manager に GitHub トークンを保存します。
Google Cloud コンソールで、[Secret Manager] ページに移動します。
[シークレットの作成] をクリックします。
次の詳細情報を入力します。
- 名前:
github_token
- シークレット値: GitHub からコピーしたトークン値を貼り付けます。
- 名前:
[シークレットの作成] をクリックします。
Cloud Build にこのシークレットへのアクセスを許可します。
新しいブラウザタブで、Google Cloud コンソールから Cloud Build の設定ページに移動します。
「サービス アカウントのメールアドレス」の値をコピーします。
- メールアドレス:
PROJECT_NUM@cloudbuild.gserviceaccount.com
- メールアドレス:
Secret Manager に戻り、[権限] タブをクリックして、[
追加] をクリックします。- 新しいプリンシパル:
PROJECT_NUM@cloudbuild.gserviceaccount.com
- ロール: Secret Manager のシークレット アクセサー
- 新しいプリンシパル:
[保存] をクリックします。
GitHub では、個人アクセス トークンに有効期限を設定することを推奨しています。有効期限が設定されている場合は、リマインダー メールが送信されます。引き続きデプロイ プレビューを使用する場合は、トークンを再生成するときに github_token
の新しいバージョンを作成します。次のステップのビルダーでは、トークンの最新バージョンが取得されるため、プレビューは引き続き機能します。
Cloud Build の新しいイメージを作成する
「Deployment Preview」通知を pull リクエストに書き込むスクリプトは、Python ドキュメント サンプル内にあります。このスクリプトをソースコードに追加する代わりに、必要に応じて、このスクリプトをプロジェクト内のコンテナにビルドし、そのコンテナを Cloud Build 構成のステップとして実行できます。
Cloud Shell を使用するか、git
と Google Cloud CLI をインストールして構成している場合はローカルマシンを使用して、以下の手順を行うことができます。以下の手順では両方の方法を示します。
-
In the Google Cloud console, activate Cloud Shell.
At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.
- プロジェクトを使用するように Google Cloud CLI を構成します。
PROJECT_ID
はプロジェクト ID に置き換えます。 Cloud Shell を使用している場合、Google Cloud API 呼び出しを行うために Google Cloud CLI を認可しなければならない場合があります。[承認] をクリックして、このアクションの続行を許可します。export PROJECT_ID=PROJECT_ID gcloud config set project $PROJECT_ID
- 新しいコンテナ イメージを作成します。
git clone https://github.com/GoogleCloudPlatform/python-docs-samples cd python-docs-samples/ gcloud builds submit --tag gcr.io/$PROJECT_ID/deployment-previews run/deployment-previews
- コンテナが作成されたことを確認します。
gcloud container images list
- クローンが作成されたリポジトリを削除します。
cd .. rm -rf python-docs-samples
新しい Cloud Build 構成を追加する
リポジトリには、メインブランチで使用される cloudbuild.yaml
ファイルがすでに存在します。この新しいトリガーに対して新しい構成を作成します。
GitHub リポジトリ ページで、[Add file] > [Create new file] の順にクリックします。
- 新しいファイルに
cloudbuild-preview.yaml
という名前を付けます。 - 以下のコードをコピーして、新しいファイルに貼り付けます。
- 新しいファイルに
リポジトリのメインブランチに変更を commit します。
セカンダリ トリガーを作成する
これで準備がすべて整ったため、新しいトリガーを作成します。
新しい Cloud Build トリガーを作成します(詳細な手順)。
Google Cloud コンソールで、[Cloud Build トリガー] ページに移動します。
[トリガーを作成] をクリックします。
次の詳細情報を入力します。
- 名前:
preview-deploy
- イベント: pull リクエスト
- ソース リポジトリ: GITHUB_USER_NAME/helloworld-python
- ベースブランチ:
^main$
- コメント制御: 必須(オーナーと共同編集者を除く)
- リポジトリのオーナーの場合、プレビューは作成した pull リクエストに自動的にビルドされます。
- 誰でも変更をプレビューできるようにする場合は、「必須ではない」を選択した場合のセキュリティへの影響を詳しくご覧ください。
- 構成: Cloud Build 構成ファイル
- Cloud Build 構成ファイルの場所:
cloudbuild-preview.yaml
- 名前:
[作成] をクリックします。
成功を確認する
新しい pull リクエストが作成されたときに、この新しいトリガーが実行されるので、テストを行うために新しい pull リクエストを作成する必要があります。
- リポジトリに移動し、新しいブランチで
app.py
を視覚的に変更します。app.py
に移動し、鉛筆アイコン( )をクリックします。- 変更を加えます。たとえば、「Hello」を「Greetings」に変更します。
- [Create a new branch for this commit and start a pull request] を選択し、[Propose change] をクリックします。
このブランチで新しい pull リクエストを作成します。
トリガーが正しく構成されている場合は、pull リクエストを作成すると直ちに新しいチェックが表示されます。
チェックの名前はトリガーの名前とプロジェクト ID です。[Details] > [View more details on Google Cloud Build] をクリックしてビルドの進行状況を確認します。
トリガーが失敗してビルドを再送信する必要がある場合、または pull リクエストに別の変更を加える場合は、同じブランチに変更を commit する必要があります。pull リクエストに新しい commit が行われるたびに、新しいビルドがトリガーされます。
トリガーが完了すると、pull リクエストに対して「Deployment Preview」という名前の新しいステータス チェックが表示されます。表示されるアイコンは、使用しているトークンがアカウントに所有されているため、アバターです。
[詳細] をクリックして、プレビューに移動します。表示されている URL は元のサービス URL と同じですが、「pr-1---」の接頭辞が付加されています。
元のサービス URL に移動すると、元のコンテンツが次のように表示されます。
サービスのリビジョン リストを表示して、Cloud Run のサービス状態を確認します。現在は元のサービスとプレビューという 2 つのリビジョンがトラフィックを処理しています。
ブランチに新しい commit を追加して、pull リクエストに引き続き変更を加えます。commit するたびに、
preview-deploy
トリガーが実行され、サービスの新しいリビジョンが作成されて、同じ URL でそのリビジョンが利用可能になります。変更のマージの準備が完了したら、[Merge Pull Request] をクリックします。元の
prod-deploy
トリガーが実行され、pull リクエストからの変更は元の URL に反映されます。新しいリビジョンは、メインの URL でトラフィックの 100% を処理しますが、pull リクエストのプレビュー URL は、その pull リクエストに対する最新の commit に引き続き添付されるため、リンクは引き続き機能します。
制限事項
作成できるリビジョン URL の数には上限があります。リポジトリの pull リクエストが 1,000 件を超えると思われる場合は、cloudbuild-cleanup.yaml
に示すように、タグをクリーンアップするプロセスを検討してください。
コードについて
cloudbuild.yaml
このコードは、Cloud Build が提供するサンプル cloudbuild.yaml
に基づいていますが、重要な更新(update-traffic
を実行する 4 つ目のステップ)があります。
cloudbuild.yaml
の構成では、トラフィック分割が変更されます。--to-latest
パラメータは、Cloud Run ページの [このリビジョンをすぐに利用する] チェックボックスと同じ機能を提供します。これにより、このサービスのリビジョンがすぐに 100% のトラフィックを処理します。
cloudbuild-preview.yaml
このコードは cloudbuild.yaml
に似ていますが、追加の手順を使用します。
サービス イメージのビルドと push 後に、
cloudbuild-preview.yaml
が--no-traffic
フラグを使用してサービスをデプロイします。つまり、これが最新のリビジョンですが、トラフィックの処理には使用されていません。cloudbuild-preview.yaml
は、pull リクエスト番号に基づいてカスタムタグを追加します。この場合、先頭に「pr-」が付き、pull リクエストの数で終わる文字列です。この時点で、リビジョン URL は機能しますが、GitHub 自体では Cloud Build ログが表示されず、ログへのリンクのみが表示されるため、pull リクエストを送信したユーザーは、この URL を確認することはできません。十分な権限を持つ Cloud Build プロジェクトの認証済みユーザーのみがログを確認できます。
cloudbuild-preview.yaml
は、Cloud Build に用意された組み込みの置換パラメータを使用してcheck_status.py
スクリプトを実行します。pull リクエスト番号、リポジトリ名、commit SHA など、GitHub リポジトリで作業する際にいくつかのパラメータを使用できます。
このトリガーを再実行するには、GitHub で別の commit を送信してください。このトリガーは、コンソールの Cloud Build ページから再実行できません。
cloudbuild-cleanup.yaml
このコードは、cloudbuild.yaml
に代わるもので、クリーンアップ機能が追加されています。初期手順でデプロイが実行され、機能が次のように拡張されます。
Discovery API と GitHub API を使用して、クローズ pull リクエスト用のサービスのタグを特定します。少なくとも、マージされた pull リクエストが存在するため、このトリガーが実行されます。
特定されたタグを削除します。
check_status.py
check_status.py
スクリプトは、Cloud Run サービス、GitHub リポジトリおよび commit に関する提供された情報を取得し、次のオペレーションを行います。
- Google API Python クライアントを使用して、サービス名、タグ、リビジョン URL を取得します。
- Secret Manager が提供する環境変数から GitHub トークンを取得します。
- Python 用 GitHub Client API を使用して、特定の commit にステータスを作成し、取得したリビジョン URL にリンクします。
クリーンアップ
このチュートリアル用に新規プロジェクトを作成した場合は、そのプロジェクトを削除します。既存のプロジェクトを使用し、このチュートリアルで変更を加えずに残す場合は、チュートリアル用に作成したリソースを削除します。さらに、このチュートリアル用に作成した GitHub の構成も削除する必要があります。
プロジェクトの削除
課金をなくす最も簡単な方法は、チュートリアル用に作成したプロジェクトを削除することです。
プロジェクトを削除するには:
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
チュートリアル リソースを削除する
このチュートリアルでデプロイした Cloud Run サービスを削除します。
- Cloud Run コンソールに移動します。
- [myservice] リストを選択し、[Delete] をクリックします。
- 確認ダイアログで [Delete] をクリックします。
このチュートリアルで作成した他の Google Cloud リソースを削除します。
- Container Registry から
gcr.io/PROJECT_ID/deployment-preview
という名前の deployment-preview コンテナ イメージを削除します。 - Container Registry から
gcr.io/PROJECT_ID/helloworld
という名前の helloworld コンテナ イメージを削除します。 - Cloud Build のトリガーを削除します。
- Secret Manager シークレットを削除します。
- Container Registry から
チュートリアル構成を削除する
GitHub の構成をクリーンアップするには、Google Cloud Build アプリケーションを GitHub から削除する必要があります。
- GitHub アプリケーションの設定に移動します。
- [Google Cloud Build] のリストで、[Configure] をクリックします。
- [Danger Zone] セクションで、[アンインストール] をクリックします。
- 確認ダイアログで [Okay] をクリックします。
作成した GitHub トークンも削除する必要があります。
- GitHub の個人アクセス トークン ページに移動します。
- [preview-deploy] リストで、[Delete] をクリックします。
- 確認ダイアログで [I understand, delete this token] をクリックします。
GitHub リポジトリも削除する必要があります。
- 作成した GitHub リポジトリに移動し、[設定] タブをクリックします。
- [Danger Zone] セクションで、[このリポジトリを削除] をクリックします。
- 確認ダイアログでリポジトリの完全な名前を入力し、[I understand the consequences, delete this repository] をクリックします。
次のステップ
- Cloud Run のロールバック、段階的ロールアウト、トラフィック移行の詳細を確認する。
- Cloud Build で GitHub アプリトリガーの詳細を確認する。