1. 目標
このチュートリアルでは、preview、canary、prod という名前の 3 つの GKE クラスタを作成します。次に、各クラスタに対応する Cloud Deploy ターゲットと、これらのターゲットでデプロイを実行する手順のシーケンスを定義する Cloud Deploy パイプラインを作成します。
デプロイ フローは、Cloud Deploy リリースを作成し、プレビュー クラスタでデプロイを実行する cloudbuild パイプラインによってトリガーされます。プレビューでのデプロイが成功し、想定どおりに動作していることを確認したら、カナリア クラスタでリリースを手動でプロモートします。本番環境クラスタでのリリースのプロモーションには承認が必要です。Cloud Deploy UI で本番環境パイプラインを承認し、最終的にプロモートします。
このチュートリアルの目標は、次の手順に分解できます。
- ワークスペースを準備する
- Cloud Deploy ターゲットを定義する
- Cloud Deploy パイプラインを定義する
- リリースを作成する
- デプロイメントを昇格する
- 製品版リリースを承認する
セルフペース型の環境設定
- Google Cloud Console にログインして、プロジェクトを新規作成するか、既存のプロジェクトを再利用します。Gmail アカウントも Google Workspace アカウントもまだお持ちでない場合は、アカウントを作成してください。



- プロジェクト名は、このプロジェクトの参加者に表示される名称です。Google API では使用されない文字列で、いつでも更新できます。
- プロジェクト ID は、すべての Google Cloud プロジェクトにおいて一意でなければならず、不変です(設定後は変更できません)。Cloud Console により一意の文字列が自動生成されます(通常は内容を意識する必要はありません)。ほとんどの Codelab では、プロジェクト ID を参照する必要があります(通常、プロジェクト ID は「
PROJECT_ID」の形式です)。好みの文字列でない場合は、別のランダムな ID を生成するか、独自の ID を試用して利用可能であるかどうかを確認することができます。プロジェクトの作成後、ID は「フリーズ」されます。 - 3 つ目の値として、一部の API が使用するプロジェクト番号があります。これら 3 つの値について詳しくは、こちらのドキュメントをご覧ください。
- 次に、Cloud のリソースや API を使用するために、Cloud Console で課金を有効にする必要があります。この Codelab の操作をすべて行って、費用が生じたとしても、少額です。このチュートリアルを終了した後に課金が発生しないようにリソースをシャットダウンするには、Codelab の最後にある「クリーンアップ」の手順を行います。Google Cloud の新規ユーザーは、300 米ドル分の無料トライアル プログラムをご利用いただけます。
2. プラットフォームの設定
ワークスペースの準備
ここでは、このチュートリアルを実行するために必要な環境を設定します。このステップが完了すると、デプロイを実行できる GKE クラスタが作成されます。
- gcloud 構成のデフォルトを設定する
gcloud config set project <your project>
gcloud config set deploy/region us-central1
- リポジトリのクローンを作成する
git clone https://github.com/gushob21/software-delivery-workshop
cd software-delivery-workshop/labs/cloud-deploy/
cloudshell workspace .
rm -rf deploy && mkdir deploy
- 環境変数を設定する
export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_NUMBER=$(gcloud projects list --filter="$PROJECT_ID" --format="value(PROJECT_NUMBER)")
- API を有効にする
gcloud services enable \
cloudresourcemanager.googleapis.com \
`container.googleapis.com \`
`cloudbuild.googleapis.com \`
`containerregistry.googleapis.com \`
`secretmanager.googleapis.com \`
`clouddeploy.googleapis.com`
- GKE クラスタを作成する
`gcloud container clusters create preview \`
--zone=us-central1-a --async
`gcloud container clusters create canary \`
--zone=us-central1-b --async
`gcloud container clusters create prod \`
--zone=us-central1-c
Cloud Deploy ターゲットの定義
- cloudshell で次のコマンドを使用して、deploy ディレクトリに preview.yaml というファイルを作成します。
cat <<EOF >deploy/preview.yaml
apiVersion: deploy.cloud.google.com/v1beta1
kind: Target
metadata:
name: preview
annotations: {}
labels: {}
description: Target for preview environment
gke:
cluster: projects/$PROJECT_ID/locations/us-central1-a/clusters/preview
EOF
As you noticed, the "kind" tag is "Target". It allows us to add some metadata to the target, a description and finally the GKE cluster where the deployment is supposed to happen for this target.
- Cloud Shell で次のコマンドを使用して、deploy ディレクトリに canary.yaml という名前のファイルを作成します。
cat <<EOF >deploy/canary.yaml
apiVersion: deploy.cloud.google.com/v1beta1
kind: Target
metadata:
name: canary
annotations: {}
labels: {}
description: Target for canary environment
gke:
cluster: projects/$PROJECT_ID/locations/us-central1-b/clusters/canary
EOF
- Cloud Shell で次のコマンドを使用して、deploy ディレクトリに prod.yaml という名前のファイルを作成します。
cat <<EOF >deploy/prod.yaml
apiVersion: deploy.cloud.google.com/v1beta1
kind: Target
metadata:
name: prod
annotations: {}
labels: {}
description: Target for prod environment
requireApproval: true
gke:
cluster: projects/$PROJECT_ID/locations/us-central1-c/clusters/prod
EOF
タグ requireApproval が true に設定されていることに注意してください。承認が得られるまで、本番環境ターゲットへの昇格は許可されません。リリースを承認するには、roles/clouddeploy.approver ロールが必要です。
- デプロイ ターゲットを作成する
`gcloud config set deploy/region us-central1`
gcloud beta deploy apply --file deploy/preview.yaml
gcloud beta deploy apply --file deploy/canary.yaml
gcloud beta deploy apply --file deploy/prod.yaml
3. アプリの作成
通常、新しいアプリケーションの作成の一環として、自動ビルド、統合テスト、デプロイを実行するように CICD パイプラインが設定されます。次の手順は、新しいアプリのセットアップ プロセスの一部と見なされます。新しいアプリケーションごとに、デプロイ パイプラインが構成されます。
Cloud Deploy パイプラインの定義
- Cloud Shell で次のコマンドを使用して、deploy ディレクトリに pipeline.yaml という名前のファイルを作成します。
cat <<EOF >>deploy/pipeline.yaml
apiVersion: deploy.cloud.google.com/v1beta1
kind: DeliveryPipeline
metadata:
name: sample-app
labels:
`app: sample-app`
description: delivery pipeline
serialPipeline:
stages:
- targetId: preview
`profiles:`
`- preview`
- targetId: canary
`profiles:`
`- canary`
- targetId: prod
`profiles:`
`- prod`
EOF
As you noticed, the "kind" tag is "DeliveryPipeline". It lets you define the metadata for the pipeline, a description and an order of deployment into various targets via serialPipeline tag.
serialPipeline タグには、stages というタグが含まれています。これは、この配信パイプラインがデプロイするように構成されているすべてのターゲットのリストです。
targetId は、デリバリー パイプラインのこのステージに使用する特定のターゲットを特定します。値は、ターゲット定義の metadata.name プロパティです。
profiles は、skaffold.yaml からの 0 個以上の Skaffold プロファイル名のリストです。Cloud Deploy は、リリースを作成するときに skaffold render でプロファイルを使用します。
- パイプラインを適用
gcloud beta deploy apply --file deploy/pipeline.yaml
4. 開発フェーズ
アプリケーションの開発が進むにつれて、自動化された CICD ツールチェーンがアセットをビルドして保存します。次のコマンドが実行され、skaffold を使用してアプリケーションがビルドされ、Cloud Deploy でのデプロイ用のアセットが保存されます。このステップは、すべてのアプリケーション ビルドで CICD プロセスによって実行されます。
- skaffold を使用してアプリケーションをビルドして保存する
skaffold build \
--file-output=artifacts.json \
--default-repo gcr.io/$PROJECT_ID \
--push=true
5. リリース フェーズ
通常、CICD プロセスの最後に(コードが本番環境用にタグ付けされたとき)、cloud deploy release コマンドを呼び出してリリース プロセスを開始します。デプロイが検証され承認されたら、自動プロセスまたは手動承認によってアクションを昇格および承認し、さまざまなターゲット環境にリリースを移行します。
リリースを作成する
このチュートリアルでは、Cloud Deploy の仕組みを理解するために、Cloud Deploy ファイルを作成しました。デモ用に、同じ Cloud Deploy ファイルを作成して、サンプル Go アプリケーションを含む GitHub リポジトリに push しました。Cloud Deploy を使用して、そのアプリケーションのリリースを行います。
export REL_TIMESTAMP=$(date '+%Y%m%d-%H%M%S')
gcloud beta deploy releases create \
sample-app-release-${REL_TIMESTAMP} \
--delivery-pipeline=sample-app \
--description="Release demo" \
--build-artifacts=artifacts.json \
--annotations="release-id=rel-${REL_TIMESTAMP}"
リリースを確認する
Cloud Deploy リリースが作成されると、プレビューである最初のターゲットに自動的にロールアウトされます。
- Google Cloud コンソールの<Cloud Deploy> に移動します。
- [sample-app] をクリックします。
この画面には、パイプラインのグラフィック表現が表示されます。
- プレビュー ボックスの左側に緑色の枠線が表示されていることを確認します。これは、リリースがその環境にデプロイされたことを意味します。
- 必要に応じて、画面下部の [リリース詳細] でリリース名をクリックして、リリースに関する詳細情報を確認します。
- リリースでアプリケーションが正常にデプロイされたことを確認します。Cloud Shell で次のコマンドを実行します。
gcloud container clusters get-credentials preview --zone us-central1-a && kubectl port-forward --namespace default $(kubectl get pod --namespace default --selector="app=cloud-deploy-tutorial" --output jsonpath='{.items[0].metadata.name}') 8080:8080
- 画面右上のウェブ プレビュー アイコンをクリックします。
- [ポート 8080 でプレビュー] を選択する
「Hello World!」というメッセージが表示された新しいページに移動します。
- ターミナルで
ctrl+cを使用して、ポート転送を終了します。
リリース版をプロモートする
リリースがパイプラインの最初のターゲット(プレビュー)にデプロイされたので、次のターゲット(カナリア)にプロモートできます。次のコマンドを実行して、プロセスを開始します。
gcloud beta deploy releases promote \
--release=sample-app-release-${REL_TIMESTAMP} \
--delivery-pipeline=sample-app \
--quiet
リリース プロモーションを確認する
- Google Cloud コンソールの sample-app パイプラインに移動します。
- カナリア ボックスの左側に緑色の枠線が表示されていることを確認します。これは、リリースがその環境にデプロイされたことを意味します。
- アプリケーションへのトンネルを作成して、アプリケーションが正しくデプロイされていることを確認する
gcloud container clusters get-credentials canary --zone us-central1-b && kubectl port-forward --namespace default $(kubectl get pod --namespace default --selector="app=cloud-deploy-tutorial" --output jsonpath='{.items[0].metadata.name}') 8080:8080
- 画面右上のウェブ プレビュー アイコンをクリックします。
- [ポート 8080 でプレビュー] を選択する
「Hello World!」というメッセージが表示された新しいページに移動します。
- ターミナルで
ctrl+cを使用して、ポート転送を終了します。
製品版リリースを承認する
prod.yaml で prod ターゲットを作成したときに、タグ requireApproval を true に指定したことを思い出してください。これにより、本番環境でのプロモーションに承認が必要になります。
- 次のコマンドを使用して、カナリア リリースをプロダクションにプロモートします。
gcloud beta deploy releases promote \
--release=sample-app-release-${REL_TIMESTAMP} \
--delivery-pipeline=sample-app \
--quiet
- Google Cloud コンソールの sample-app パイプラインに移動します。
- 「1 pending」と表示された黄色のインジケーターが表示されます。
このメッセージは、製品版へのデプロイ用にリリースがキューに登録されているものの、確認と承認が必要であることを示します。
- 黄色い通知のすぐ下にある [審査] ボタンをクリックします。
- 次の画面で [審査] をもう一度クリックして、本番環境の承認画面にアクセスします。
- 必要に応じて、マニフェストの差分を確認して変更内容を確認します。この場合は、まったく新しいファイルです。
- [承認] ボタンをクリックします。
- サンプルアプリのパイプライン ページに戻ると、本番環境へのリリースが進行中であることがわかります。
製品版リリースを確認する
他の環境と同様に、次の手順でデプロイの完了時にデプロイを確認できます。
- 次のコマンドを Cloud Shell で実行して、ポート転送を作成します。
gcloud container clusters get-credentials prod --zone us-central1-c && kubectl port-forward --namespace default $(kubectl get pod --namespace default --selector="app=cloud-deploy-tutorial" --output jsonpath='{.items[0].metadata.name}') 8080:8080
- 画面右上のウェブ プレビュー アイコンをクリックします。
- [ポート 8080 でプレビュー] を選択する
「Hello World!」というメッセージが表示された新しいページに移動します。
- ターミナルで
ctrl+cを使用して、ポート転送を終了します。