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 config のデフォルトを設定する
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 ターゲットの定義
- Cloud Shell で次のコマンドを使用して、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.
- cloudshell で次のコマンドを使用して、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
- cloudshell で次のコマンドを使用して、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
requiredApproval タグが 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 パイプラインの定義
- cloudshell で次のコマンドを使用して、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
タグには、このデリバリー パイプラインがデプロイされるように構成されているすべてのターゲットのリストである stage という名前のタグが含まれています。
targetId
には、デリバリー パイプラインのこのステージに使用する特定のターゲットを指定します。値は、ターゲット定義の metadata.name プロパティです。
profiles
は、skaffold.yaml からの 0 個以上の Skaffold プロファイル名のリストです。Cloud Deploy は、リリースの作成時に skaffold レンダリングでプロファイルを使用します。
- パイプラインの適用
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 リリースが作成されると、最初のターゲットであるプレビューに自動的にロールアウトされます。
- <Cloud Deploy> に移動します。Google Cloud コンソール
- [sample-app] をクリックします。
この画面に、パイプラインのグラフが表示されます。
- プレビュー ボックスの左側にある緑色の枠線を確認します。これは、リリースがその環境にデプロイされたことを意味します。
- 必要に応じて、画面下部の [リリースの詳細] でリリース名をクリックして、リリースの詳細を確認できます。
- リリースでアプリケーションが正常にデプロイされたことを確認し、次のコマンドを実行します。
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 パイプラインに移動します。
- Canary ボックスの左側にある緑色の枠線を確認します。これは、リリースがその環境にデプロイされたことを意味します。
- アプリケーションへのトンネルを作成して、アプリケーションが正しくデプロイされていることを確認する
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 件保留中」と表示されます。
このメッセージは、本番環境にデプロイするための審査と承認が必要なリリースがあることを示します。
- [確認] をクリックします。ボタンのすぐ下にあります。
- 次の画面で [確認] をクリックします本番環境の承認画面にアクセスするには、
- 必要に応じて、[Manifest Diff] で変更を確認します。この場合はまったく新しいファイルです。
- [承認] をクリックします。ボタン
- sample-app pipeline に戻ると、本番環境へのリリースが進行中であることがわかります。
製品版リリースを確認する
他の環境と同様に、次の手順でデプロイの完了を確認できます。
- cloudshell で次のコマンドを実行して、ポート転送を作成します。
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
を使用して、ポート転送を終了します。