デプロイの前後にフックを実行する
このクイックスタートでは、デプロイフック(Cloud Deploy を使用してデプロイする前後に実行する任意のプログラム)を実行する方法について説明します。
このクイックスタートでは、以下の内容を行います。
GKE クラスタを 1 つ、または Cloud Run サービスを 1 つ作成します。
GKE Enterprise クラスタも使用できますが、このクイックスタートでは GKE と Cloud Run のみを使用します。
Skaffold 構成および、Kubernetes マニフェストまたは Cloud Run サービス定義のいずれかを作成します。
Skaffold 構成ファイルで、実行するデプロイ フックを構成します。デプロイ前に実行するコンテナと、デプロイ後に実行するコンテナを特定します。
Cloud Deploy デリバリー パイプラインとデプロイ ターゲットを定義します。
デリバリー パイプラインの構成で、
skaffold.yaml
で定義されたデプロイフックを参照して、これらのフックを実行します。このパイプラインには 1 つのステージのみが含まれ、1 つのターゲットのみが使用されます。
リリースを作成して、ターゲットに自動的にデプロイします。
1 つのフックはアプリケーションのデプロイ前に実行され、もう 1 つはデプロイ後に実行されます。
Google Cloud コンソールで Cloud Deploy の [ロールアウトの詳細] ページを使用して、Cloud Build のログにデプロイ前フックとデプロイ後のフックの結果を表示します。
始める前に
- 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 Deploy, Cloud Build, GKE, Cloud Run, and Cloud Storage APIs.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
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 Deploy, Cloud Build, GKE, Cloud Run, and Cloud Storage APIs.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
- デフォルトの Compute Engine サービス アカウントに十分な権限があることを確認します。
このサービス アカウントにはすでに必要な権限が付与されている場合があります。これらの手順は、デフォルトのサービス アカウントの自動的なロール付与を無効にするプロジェクトに含まれています。
- 最初に、
clouddeploy.jobRunner
ロールを追加します。gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:$(gcloud projects describe PROJECT_ID \ --format="value(projectNumber)")-compute@developer.gserviceaccount.com \ --role="roles/clouddeploy.jobRunner"
- 特定のランタイム向けのデベロッパー ロールを追加します。
- GKE の場合:
gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:$(gcloud projects describe PROJECT_ID \ --format="value(projectNumber)")-compute@developer.gserviceaccount.com \ --role="roles/container.developer"
- Cloud Run の場合:
gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:$(gcloud projects describe PROJECT_ID \ --format="value(projectNumber)")-compute@developer.gserviceaccount.com \ --role="roles/run.developer"
-
iam.serviceAccountUser
ロールを追加します。これには、ランタイムにデプロイするactAs
権限が含まれます。gcloud iam service-accounts add-iam-policy-binding $(gcloud projects describe PROJECT_ID \ --format="value(projectNumber)")-compute@developer.gserviceaccount.com \ --member=serviceAccount:$(gcloud projects describe PROJECT_ID \ --format="value(projectNumber)")-compute@developer.gserviceaccount.com \ --role="roles/iam.serviceAccountUser" \ --project=PROJECT_ID
CLI がすでにインストールされている場合は、最新バージョンを実行していることを確認してください。
gcloud components update
ランタイム環境を作成する
Cloud Run にデプロイする場合は、以下のコマンドをスキップできます。
GKE の場合は、デフォルト設定で 1 つのクラスタ deploy-hooks-cluster
を作成します。クラスタの Kubernetes API エンドポイントは、公共のインターネットからネットワークに到達可能である必要があります。GKE クラスタには、デフォルトで外部からアクセス可能です。
gcloud container clusters create-auto deploy-hooks-cluster \ --project=PROJECT_ID \ --region=us-central1
Skaffold 構成とアプリケーション マニフェストを準備する
Cloud Deploy では、Skaffold を使用して、デプロイする対象と、それをターゲットにデプロイする方法の詳細を提供します。
このクイックスタートでは、サンプルアプリのデプロイに使用するマニフェストと、デプロイの前後に実行するコンテナ(デプロイフック)を識別する skaffold.yaml
ファイルを作成します。
ターミナル ウィンドウを開きます。
新しいディレクトリを作成し、そのディレクトリに移動します。
GKE
mkdir deploy-hooks-gke-quickstart cd deploy-hooks-gke-quickstart
Cloud Run
mkdir deploy-hooks-run-quickstart cd deploy-hooks-run-quickstart
次の内容のファイルを
skaffold.yaml
という名前で作成します。GKE
apiVersion: skaffold/v4beta7 kind: Config manifests: rawYaml: - k8s-pod.yaml deploy: kubectl: {} customActions: - name: predeploy-action containers: - name: predeploy-echo image: ubuntu command: ["/bin/sh"] args: ["-c", 'echo "this is a predeploy action"' ] - name: postdeploy-action containers: - name: postdeploy-echo image: ubuntu command: ["/bin/sh"] args: ["-c", 'echo "this is a postdeploy action"' ]
Cloud Run
apiVersion: skaffold/v4beta7 kind: Config manifests: rawYaml: - service.yaml deploy: cloudrun: {} customActions: - name: predeploy-action containers: - name: predeploy-echo image: ubuntu command: ["/bin/sh"] args: ["-c", 'echo "this is a predeploy action"' ] - name: postdeploy-action containers: - name: postdeploy-echo image: ubuntu command: ["/bin/sh"] args: ["-c", 'echo "this is a postdeploy action"' ]
このファイルには
customActions:
スタンザが含まれています。これにより、デプロイの前後に実行するコンテナ(フック)が定義されます。この構成ファイルの詳細については、
skaffold.yaml
リファレンスをご覧ください。Cloud Run のサービス定義または GKE の Kubernetes マニフェストで、アプリケーションの定義を作成します。
GKE
次の内容のファイルを
k8s-pod.yaml
という名前で作成します。apiVersion: v1 kind: Pod metadata: name: my-hooks-pod spec: containers: - name: nginx image: my-app-image
このファイルは、基本的な Kubernetes マニフェストであり、アプリケーションをデプロイするためにクラスタに適用されます。デプロイするコンテナ イメージは、ここでプレースホルダ
my-app-image
として設定されます。これは、リリースを作成するときに特定のイメージに置き換えられます。Cloud Run
次の内容のファイルを
service.yaml
という名前で作成します。apiVersion: serving.knative.dev/v1 kind: Service metadata: name: my-hooks-run-service spec: template: spec: containers: - image: my-app-image
このファイルは、アプリケーションのデプロイに使用される単純な Cloud Run サービス定義です。デプロイするコンテナ イメージは、ここでプレースホルダ
my-app-image
として設定されます。これは、リリースを作成するときに特定のイメージに置き換えられます。
デリバリー パイプラインとターゲットを作成する
パイプラインとターゲットは、1 つのファイルまたは個別のファイルで定義できます。このクイックスタートでは、1 つのファイルを作成します。
デリバリー パイプラインとターゲット定義を作成:
GKE
deploy-hooks-gke-quickstart
ディレクトリに、次の内容を含む新しいclouddeploy.yaml
ファイルを作成します。apiVersion: deploy.cloud.google.com/v1 kind: DeliveryPipeline metadata: name: deploy-hooks-demo-app-gke-1 description: main application pipeline serialPipeline: stages: - targetId: hooks-staging profiles: [] strategy: standard: predeploy: actions: ["predeploy-action"] postdeploy: actions: ["postdeploy-action"] --- apiVersion: deploy.cloud.google.com/v1 kind: Target metadata: name: hooks-staging description: hooks staging cluster gke: cluster: projects/PROJECT_ID/locations/us-central1/clusters/deploy-hooks-cluster
Cloud Run
deploy-hooks-run-quickstart
ディレクトリに、次の内容を含む新しいclouddeploy.yaml
ファイルを作成します。apiVersion: deploy.cloud.google.com/v1 kind: DeliveryPipeline metadata: name: deploy-hooks-demo-app-run-1 description: main application pipeline serialPipeline: stages: - targetId: hooks-staging profiles: [] strategy: standard: predeploy: actions: ["predeploy-action"] postdeploy: actions: ["postdeploy-action"] --- apiVersion: deploy.cloud.google.com/v1 kind: Target metadata: name: hooks-staging description: staging Run service run: location: projects/PROJECT_ID/locations/us-central1
パイプラインとターゲットを Cloud Deploy サービスに登録します。
gcloud deploy apply --file=clouddeploy.yaml --region=us-central1 --project=PROJECT_ID
これで、1 つのターゲットを含むデリバリー パイプラインが用意され、アプリケーションをデプロイして、デプロイ前とデプロイ後のジョブを実行する準備が整いました。
次のとおりに、パイプラインとターゲットを確認します。
Google Cloud コンソールで、Cloud Deploy の [デリバリー パイプライン] ページに移動し、使用可能なデリバリー パイプラインのリストを表示します。
作成したデリバリー パイプラインが表示され、[ターゲット] 列に 1 つのターゲットが表示されます。
リリースを作成する
リリースは Cloud Deploy リソースの中心で、デプロイの変更を表します。デリバリー パイプラインは、そのリリースのライフサイクルを定義します。このライフサイクルの詳細については、Cloud Deploy のサービス アーキテクチャをご覧ください。
GKE
deploy-hooks-gke-quickstart
ディレクトリから次のコマンドを実行して、デプロイするコンテナ イメージを表す release
リソースを作成します。
gcloud deploy releases create test-release-001 \
--project=PROJECT_ID \
--region=us-central1 \
--delivery-pipeline=deploy-hooks-demo-app-gke-1 \
--images=my-app-image=gcr.io/google-containers/nginx@sha256:f49a843c290594dcf4d193535d1f4ba8af7d56cea2cf79d1e9554f077f1e7aaa
--images=
フラグに注目してください。このフラグは、マニフェストのプレースホルダ(my-app-image
)を特定の SHA 修飾イメージに置き換えるために使用します。このようにマニフェストをテンプレート化し、リリースの作成時に SHA 修飾付きのイメージ名を使用することをおすすめします。
Cloud Run
deploy-hooks-run-quickstart
ディレクトリから次のコマンドを実行して、デプロイするコンテナ イメージを表す release
リソースを作成します。
gcloud deploy releases create test-release-001 \
--project=PROJECT_ID \
--region=us-central1 \
--delivery-pipeline=deploy-hooks-demo-app-run-1 \
--images=my-app-image=us-docker.pkg.dev/cloudrun/container/hello@sha256:4a856b6f1c3ce723a456ddc2adfbb794cbfba93f727e2d96fcf6540bd0d6fff4
--images=
フラグに注目してください。これは、サービス定義のプレースホルダ(my-app-image
)を特定の SHA 修飾イメージに置き換えるために使用します。このようにサービスとジョブの定義をテンプレート化し、リリースの作成時に SHA 修飾付きのイメージ名を使用することをおすすめします。
すべてのリリース(--disable-initial-rollout
を含むものを除き)において、Cloud Deploy ではロールアウト リソースも自動的に作成されます。アプリケーションは、このデリバリー パイプラインに構成された 1 つのターゲットに自動的にデプロイされます。
また、デプロイ前ジョブはアプリケーションのデプロイ前に実行され、デプロイ後ジョブはデプロイ後に実行されます。
Google Cloud コンソールで結果を表示する
数分後、リリースがターゲット ランタイムにデプロイされます。
(例を示す目的で)構成したデプロイ前およびデプロイ後フックで、Cloud Build ログに文字列が出力されます。これらのログを表示して、フックが想定どおりに動作していることを確認できます。
Google Cloud コンソールで、Cloud Deploy の [デリバリー パイプライン] ページに移動し、デリバリー パイプライン(「deploy-hooks-demo-app-gke-1」または「deploy-hooks-demo-app-run-1」)を表示します。
デリバリー パイプラインの名前(「deploy-hooks-demo-app-gke-1」または「deploy-hooks-demo-app-run-1」)をクリックします。
可視化されたパイプラインでは、アプリのデプロイ ステータスが表示されます。パイプラインには 1 つのステージしかないため、可視化されたパイプラインにはノードが 1 つだけ表示されます。
リリースが [デリバリー パイプラインの詳細] の下の [リリース] タブに表示されます。
[デリバリー パイプラインの詳細] の [ロールアウト] タブをクリックします。
ロールアウト名をクリックすると、ロールアウトの詳細が表示されます。
[デプロイ前] と [デプロイ後] はジョブとして一覧表示されます。
[デプロイ前] をクリックします。
ジョブ実行ログが表示されます。
ログエントリのリストを下にスクロールして、
predeploy-echo
を見つけて、それをクリックします。textPayload
に注目してください。この文字列は、Skaffold 構成のpredeploy-action
で構成されたものです。[デプロイ後] ジョブをクリックして、
postdeploy-echo
ログエントリを見つけます。
クリーンアップ
このページで使用したリソースについて、Google Cloud アカウントに課金されないようにするには、次の手順を行います。
GKE クラスタまたは Cloud Run サービスを削除します。
GKE
gcloud container clusters delete deploy-hooks-cluster --region=us-central1 --project=PROJECT_ID
Cloud Run
gcloud run services delete my-hooks-run-service --region=us-central1 --project=PROJECT_ID
次のように、デリバリー パイプライン、ターゲット、リリース、ロールアウトを削除します。
gcloud deploy delete --file=clouddeploy.yaml --force --region=us-central1 --project=PROJECT_ID
Cloud Deploy によって作成された Cloud Storage バケットを削除します。
1 つは
_clouddeploy
で終わり、もう 1 つは[region].deploy-artifacts.[project].appspot.com
で終わります。
これでクイックスタートの演習はすべて終了です。