デプロイの前後にフックを実行する
このクイックスタートでは、Cloud Deploy を使用してデプロイする前後に実行する任意のプログラムであるデプロイフックを実行する方法について説明します。
このクイックスタートでは、以下の内容を行います。
GKE クラスタを 1 つ、または Cloud Run サービスを 1 つ作成します。
このために GKE 接続クラスタを使用することもできますが、このクイックスタートでは GKE と Cloud Run のみを使用します。
Cloud Deploy デリバリー パイプラインとデプロイ ターゲットを定義します。
デリバリー パイプラインの構成には、デプロイフックの定義が
tasksとして含まれています。このパイプラインには 1 つのステージのみが含まれ、1 つのターゲットのみが使用されます。
Skaffold 構成および、Kubernetes マニフェストまたは Cloud Run サービス定義のいずれかを作成します。
Skaffold 構成ファイルでは、Cloud Deploy でデプロイするマニフェストを指定します。
リリースを作成します。リリースは自動的にターゲットにデプロイされます。
1 つのフックはアプリケーションのデプロイ前に実行され、もう 1 つはデプロイ後に実行されます。
Google Cloud コンソールで Cloud Deploy の [ロールアウトの詳細] ページを使用して、Cloud Build のログにデプロイ前フックとデプロイ後のフックの結果を表示します。
始める前に
- Google Cloud アカウントにログインします。 Google Cloudを初めて使用する場合は、 アカウントを作成して、実際のシナリオでの Google プロダクトのパフォーマンスを評価してください。新規のお客様には、ワークロードの実行、テスト、デプロイができる無料クレジット $300 分を差し上げます。
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
Enable the Cloud Deploy, Cloud Build, GKE, Cloud Run, and Cloud Storage APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.-
Google Cloud CLI をインストールします。
-
外部 ID プロバイダ(IdP)を使用している場合は、まず連携 ID を使用して gcloud CLI にログインする必要があります。
-
gcloud CLI を初期化するには、次のコマンドを実行します。
gcloud init -
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
Enable the Cloud Deploy, Cloud Build, GKE, Cloud Run, and Cloud Storage APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.-
Google Cloud CLI をインストールします。
-
外部 ID プロバイダ(IdP)を使用している場合は、まず連携 ID を使用して gcloud CLI にログインする必要があります。
-
gcloud CLI を初期化するには、次のコマンドを実行します。
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 の場合は、デフォルト設定でクラスタ deploy-hooks-cluster を 1 つ作成します。クラスタの Kubernetes API エンドポイントは、公共のインターネットからネットワークに到達可能である必要があります。GKE クラスタには、デフォルトで外部からアクセス可能です。
gcloud container clusters create-auto deploy-hooks-cluster \
--project=PROJECT_ID \
--region=us-central1
デリバリー パイプラインとターゲットを作成する
パイプラインとターゲットは、1 つのファイルまたは個別のファイルで定義できます。このクイックスタートでは、1 つのファイルを作成します。
ターミナル ウィンドウを開きます。
新しいディレクトリを作成し、そのディレクトリに移動します。
GKE
mkdir deploy-hooks-gke-quickstart cd deploy-hooks-gke-quickstartCloud Run
mkdir deploy-hooks-run-quickstart cd deploy-hooks-run-quickstartデリバリー パイプラインとターゲット定義を作成:
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: tasks: - type: container image: ubuntu command: ["/bin/sh"] args: ["-c", 'echo "this is a predeploy action"' ] postdeploy: tasks: - type: container image: ubuntu command: ["/bin/sh"] args: ["-c", 'echo "this is a 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-clusterCloud 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: tasks: - type: container image: ubuntu command: ["/bin/sh"] args: ["-c", 'echo "this is a predeploy action"' ] postdeploy: tasks: - type: container image: ubuntu command: ["/bin/sh"] args: ["-c", 'echo "this is a 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 つのターゲットが表示されます。

Skaffold 構成ファイルとアプリケーション マニフェストを作成する
Cloud Deploy は Skaffold を使用して、サンプルアプリをターゲットにデプロイするために使用されるマニフェストを特定します。
次の内容のファイルを
skaffold.yamlという名前で作成します。GKE
apiVersion: skaffold/v4beta7 kind: Config manifests: rawYaml: - k8s-pod.yaml deploy: kubectl: {}Cloud Run
apiVersion: skaffold/v4beta7 kind: Config manifests: rawYaml: - service.yaml deploy: cloudrun: {}この構成ファイルの詳細については、
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としてここに設定されます。このプレースホルダは、リリースを作成するときに特定のイメージに置き換えられます。
リリースを作成する
リリースは 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 修飾イメージに置き換えるために使用します。Google では、この方法でマニフェストをテンプレート化し、リリース作成時に 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:95ade4b17adcd07623b0a0c68359e344fe54e65d0cb01b989e24c39f2fcd296a
--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に注目してください。この文字列は、デリバリー パイプラインのpredeploy-actionで構成されたものです。[デプロイ後] ジョブをクリックして、
postdeploy-echoログエントリを見つけます。
クリーンアップ
このページで使用したリソースについて、 Google Cloud アカウントに課金されないようにするには、次の手順を実施します。
GKE クラスタまたは Cloud Run サービスを削除します。
GKE
gcloud container clusters delete deploy-hooks-cluster --region=us-central1 --project=PROJECT_IDCloud 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_IDCloud Deploy によって作成された Cloud Storage バケットを削除します。
1 つは
_clouddeployで終わり、もう 1 つは[region].deploy-artifacts.[project].appspot.comで終わります。
これでクイックスタートの演習はすべて終了です。