デプロイを確認する

このドキュメントでは、Cloud Deploy のデプロイを検証する方法について説明します。

任意のターゲットにデプロイしたアプリケーションが正しく動作していることを検証するため、Cloud Deploy と Skaffold を構成できます。検証は独自のテストイメージを使用して行われ、デプロイの完了後にこれらのテストを実行するように Cloud Deploy と Skaffold を構成します。

デフォルトでは、デプロイの検証は Cloud Deploy 実行環境で実行されますが、アプリケーションが実行されているのと同じクラスタで実行するように構成することもできます。

デプロイ検証の仕組み

  1. 検証用に Skaffold を構成します。

    この構成では、テストの実行に使用するコンテナ イメージとコンテナ イメージから実行する特定のコマンド(スクリプトなど)を識別します。

  2. デプロイ検証のデリバリー パイプラインで 1 つ以上のターゲットを構成します。

    この構成により、ターゲットにデプロイされたワークロードの検証が有効になります。

  3. ロールアウトがデプロイ(skaffold apply)されると、Cloud Deploy は Cloud Deploy 実行環境で skaffold verify コマンドを実行します。

    Google Kubernetes Engine と GKE Enterprise へのデプロイでは、アプリケーション コンテナが実行されているのと同じクラスタで検証コンテナを実行することもできます。

  4. Skaffold は、skaffold.yamlverify スタンザで指定されたテストを呼び出して、デプロイされたアプリケーションに対して実行します。

  5. 実行されたテストの成功または失敗は、検証の成功または失敗を示します。

    • 検証の成功は、実行されたコンテナの終了コードによって確認されます。

      0 は成功を示します。ゼロ以外の終了コードは失敗を示します。必要な検証結果を生成するには、コンテナが適切な終了コードで終了するようにします。検証の一環として複数のコンテナが実行されている場合、検証に成功するには、それらのコンテナがすべて成功する必要があります。

    • 検証が失敗した場合は、ロールアウトも失敗します。

    • 検証中にデプロイが失敗した場合は、ロールアウトを検査して確認できます。

      Google Cloud コンソールでのロールアウトの詳細(確認ステータスなど)

  6. 失敗した検証を無視するか、再試行できます。

    進行中の検証ジョブを終了することもできます。

検証に使用されるコンポーネント

ロールアウトリソースには、デプロイの検証をサポートする次のオブジェクトが含まれています。

  • フェーズ

    論理的にグループ化された、ロールアウト内のオペレーション(ジョブ)のコレクション(デプロイ、デプロイと検証など)。

  • Job

    ロールアウト時に実行される特定のオペレーション(デプロイ、検証など)。

  • ジョブ実行

    ロールアウト リソースの子、ジョブ実行はジョブのインスタンスです(デプロイの試行など)。

Cloud Deploy リソースの詳細については、Cloud Deploy サービス アーキテクチャをご覧ください。

デプロイの検証で生成された通知

Cloud Deploy は Pub/Sub メッセージを生成し、次のイベント用に公開します。

  • ジョブの作成、更新、削除

    これらの通知は clouddeploy-resources トピックに公開され、次の属性が含まれます。

    • Resource
    • ResourceTypeJobRun
    • ActionCreateUpdateDelete
    • ProjectNumber
    • Location
    • TargetId
    • DeliveryPipelineId
    • ReleaseId
    • RolloutId
    • JobRunId

clouddeploy-resources トピックに公開された、ジョブ実行の作成の Pub/Sub メッセージの例を次に示します。

{
    "ackId": "UAYWLF1GSFE3GQhoUQ5PXiM_NSAoRRAGAE8CKF15MFcrQVh9Dz4NGXJ9YXRiWRIJBkUHeF9cEQ1iXE5EB0nq0KDVV1dKXxYGAExQeVhbHQVoWVh0Bnn7h5nK-8HjYwk9OqKarPdtO4PY2fNHZiI9XhJLLD5-My5FQV5AEkw4G0RJUytDCypYEU4EISE-MD5FU0Q",
    "message": {
      "attributes": {
        "Action": "Create",
        "DeliveryPipelineId": "dv-pipeline",
        "JobRunId": "634f8c6f-30c3-49ca-af80-68dc24d4cc5d",
        "Location": "us-central1",
        "ProjectNumber": "253401481285",
        "ReleaseId": "test-release-100",
        "Resource": "projects/253401481285/locations/us-central1/deliveryPipelines/dv-pipeline/releases/test-release-100/rollouts/test-release-100-to-dev-0001/jobRuns/634f8c6f-30c3-49ca-af80-68dc24d4cc5d",
        "ResourceType": "JobRun",
        "RolloutId": "test-release-100-to-dev-0001"
      },
      "messageId": "5572937706805411",
      "publishTime": "2022-09-07T14:00:46.040Z"
    }
  },
  • ジョブ実行の開始、成功、失敗

    これらの通知は clouddeploy-operations トピックに公開され、次の属性が含まれます。

    • Resource
    • ResourceTypeJobRun
    • ActionStartSucceedFailure
    • ProjectNumber
    • Location
    • TargetId
    • DeliveryPipelineId
    • ReleaseId
    • RolloutId
    • JobRunId
    • PhaseId
    • JobId
    • JobTypeDeploy または Verify

失敗したジョブ実行の Pub/Sub メッセージの例を次に示します。これは、clouddeploy-operations トピックに公開されます。

{
    "ackId": "RFAGFixdRkhRNxkIaFEOT14jPzUgKEUUBAgUBXx9cEFPdVhec2hRDRlyfWB9aVsbCAUXU3cJURsHaE5tdR-6xcvaS0NVb18UAgRFWndfXhMEblhfcy-fkK3HwvT9U0AvOemNgdZpe6jHiulvZiM9XxJLLD5-My5FQV5AEkw4G0RJUytDCypYEU4EISE-MD5FUw",
    "message": {
      "attributes": {
        "Action": "Failure",
        "DeliveryPipelineId": "dv-pipeline",
        "JobId": "verify",
        "JobRunId": "b389224a-c259-4a00-ab75-c22e48bc3136",
        "JobType": "Verify",
        "Location": "us-central1",
        "PhaseId": "stable",
        "ProjectNumber": "253401481285",
        "ReleaseId": "test-release-101",
        "Resource": "projects/253401481285/locations/us-central1/deliveryPipelines/dv-pipeline/releases/test-release-101/rollouts/test-release-101-to-dev-0001/jobRuns/b389224a-c259-4a00-ab75-c22e48bc3136",
        "ResourceType": "JobRun",
        "RolloutId": "test-release-101-to-dev-0001",
        "TargetId": "dev"
      },
      "messageId": "5573609905896436",
      "publishTime": "2022-09-07T15:35:37.906Z"
    }
  },

デプロイ検証用に Cloud Deploy を構成する

Cloud Deploy ターゲットのデプロイ検証を有効にするには、この例に示すように、デリバリー パイプラインの進行状況で、特定のターゲットに verify: true プロパティを追加します。

apiVersion: deploy.cloud.google.com/v1
kind: DeliveryPipeline
metadata:
 name: my-demo-app
description: main application pipeline
serialPipeline:
 stages:
 - targetId: dev
   profiles: []
   strategy:
     standard:
       verify: true
 - targetId: prod
   profiles: []
   strategy:
     standard:
       verify: false

この構成では、デプロイの検証は dev ターゲットでは有効ですが、prod ターゲットでは有効になりません。verify: false は、verify プロパティまたは strategy スタンザ全体を省略した場合と同じです。

検証オペレーションは、独自の実行環境内で実行されます。この実行環境は、RENDERDEPLOY の場合と同じように VERIFY に構成できます。

デプロイの検証用に Skaffold を構成する

ターゲットのデプロイ検証を有効にするには、デプロイの skaffold.yaml 構成ファイルに verify スタンザが必要です。この構成は、ターゲットごとに別々のプロファイルを使用している場合、特定の Skaffold プロファイル用です。

この verify スタンザは、検証を行うために実行するコンテナ(統合テストなど)を識別します。

verify スタンザを含む skaffold.yaml の例を次に示します。

apiVersion: skaffold/v4beta7
kind: Config
build:
  artifacts:
    - image: integration-test
      context: integration-test
manifests:
  rawYaml:
  - kubernetes.yaml
deploy:
  kubectl: {}
verify:
- name: verify-integration-test
  container:
    name: integration-test
    image: integration-test
    command: ["./test-systems.sh"]
- name: verify-endpoint-test
  container:
    name: alpine
    image: alpine
    command: ["/bin/sh"]
    args: ["-c", "wget #ENDPOINT_URL"]

この簡単な例は、使用するコンテナを識別する verify スタンザと、そのコンテナで実行するテスト スクリプトを示しています。この例の #ENDPOINT_URL はアプリケーション URL のプレースホルダであり、使用可能な Cloud Deploy 環境変数ではありません。

アプリケーション クラスタで検証コンテナを実行する

デフォルトでは、デプロイの検証は Cloud Deploy 実行環境で実行されます。アプリケーションが動作しているのと同じクラスタで検証コンテナを実行するように Skaffold を構成することもできます。skaffold.yaml でクラスタ内検証を構成し、ターゲットで検証を有効にすると、ターゲットのクラスタ内で検証が自動的に実行されます。

この機能は、GKE と GKE Enterprise へのデプロイでのみ使用できます。Cloud Run では使用できません。Cloud Run へのデプロイについては、Cloud Deploy 実行環境でのみ検証を実行できます。

クラスタ内検証には、Skaffold バージョン 2.3 以降が必要です。

クラスタで検証コンテナを実行するには、skaffold.yaml 構成ファイルの executionMode.kubernetesCluster スタンザを、特定の検証コンテナの verify スタンザに配置します。

verify:
- name:
  container:
    name:
    image:
    command:
    args:
  executionMode:
    kubernetesCluster:

以下に、アプリケーション クラスタで検証コンテナを呼び出す executionMode を含む検証スタンザの例を示します。

verify:
- name: integration-test-container
  container:
    name: integration-test-container
    image: integration-test-container
  executionMode:
    kubernetesCluster: {}

executionMode スタンザの使用は任意です。省略すると、Skaffold は Cloud Deploy 実行環境で検証コンテナを実行します。

検証を再試行する

検証ジョブが失敗した場合は、新しいジョブ実行を作成して検証を再試行できます。

gcloud deploy rollouts retry-job ROLLOUT_NAME \
             --job-id=JOB_ID \
             --phase-id=PHASE_ID \
             --delivery-pipeline=PIPELINE_NAME \
             --release=RELEASE_NAME \
             --region=REGION

検証を再試行すると、ロールアウトの状態が FAILED から IN_PROGRESS に変わります。

検証ジョブが失敗したロールアウトの検証のみ再試行できます。

使用可能な環境変数

Cloud Deploy では、テストに使用できる VERIFY 実行環境で、次の環境変数を指定し、入力します。

  • ANTHOS_MEMBERSHIP

    タイプが ANTHOS のターゲットの場合、Anthos メンバーシップの完全なリソース名。

  • CLOUD_RUN_LOCATION

    RUN タイプのターゲットに対して、Cloud Run サービスがデプロイされているリージョン。

  • CLOUD_RUN_PROJECT

    タイプが RUN のターゲットの場合、Cloud Run サービスが作成されたプロジェクト。

  • CLOUD_RUN_SERVICE

    タイプが RUN のターゲットの場合、デプロイされた Cloud Run サービスの完全なリソース名。例: projects/p/locations/us-central1/services/dev

  • CLOUD_RUN_SERVICE_URLS

    タイプが RUN のターゲットの場合、エンドユーザーがサービスへのアクセスに使用する 1 つまたは複数の URL(カンマ区切りのリスト)。これらは、Google Cloud コンソールで、サービスの Cloud Run サービスの詳細で確認できます。

  • CLOUD_RUN_REVISION

    タイプが RUN のターゲットの場合、Cloud Run サービスの特定のリビジョン。

  • GKE_CLUSTER

    タイプが GKE のターゲットの場合、Google Kubernetes Engine クラスタの完全なリソース名。例: projects/p/locations/us-central1/clusters/dev

  • TARGET_TYPE

    ターゲットの特定のランタイム タイプ。GKEANTHOSRUN のいずれか。

  • CLOUD_DEPLOY_LOCATION

    実行環境が運用されているリージョン。

  • CLOUD_DEPLOY_DELIVERY_PIPELINE

    実行環境が運用されている ID デリバリー パイプライン。

  • CLOUD_DEPLOY_TARGET

    実行環境が運用されているターゲットの ID。

  • CLOUD_DEPLOY_PROJECT

    実行環境が運用されている Google Cloud プロジェクトのプロジェクト番号。

  • CLOUD_DEPLOY_RELEASE

    検証が実行されるリリースの ID。

  • CLOUD_DEPLOY_ROLLOUT

    検証するジョブが含まれるロールアウトの ID。

  • CLOUD_DEPLOY_JOB_RUN

    ジョブの現在の実行を表すジョブ実行の ID。

  • CLOUD_DEPLOY_PHASE

    検証するジョブを含むロールアウトのフェーズ