このドキュメントでは、デプロイの前後に任意のプログラムやオペレーションを実行する方法について説明します。
デプロイ前のアクションまたはデプロイ後のアクション、あるいはその両方を対象としたアクションを実行するように、Cloud Deploy と Skaffold を構成できます。このように実行されるプログラムは「フック」と呼ばれます。デプロイ前フックとデプロイ後フックは、ロールアウトでデプロイ前ジョブとデプロイ後ジョブとして実行されます。
各フックは、指定した Cloud Deploy 実行環境で実行されるように構成できますが、Google Kubernetes Engine にデプロイする場合は、アプリケーションをデプロイする GKE クラスタで実行されるよう構成できます。
デプロイフックはべき等であると想定されます。特定のアクションが複数回実行されても、追加の効果はありません。
デプロイフックの仕組み
以下では、デプロイフックを構成する手順と、これらのフックを実行する Skaffold と Cloud Deploy のプロセスについて説明します。
特定のリリースのために使用する
skaffold.yamlを構成して、フックの実行に使用するコンテナ イメージを特定するcustomActionsと、各コンテナで実行する特定のコマンドまたはスクリプトを含めます。デリバリー パイプラインの進行状況の 1 つ以上のステージでフックを構成します。各ステージは、
skaffold.yamlで構成したcustomActionsの 1 つを参照します。ロールアウトのデプロイジョブの実行の前に、Skaffold は、
skaffold.yamlに構成された、パイプライン進行のpredeployスタンザで参照される任意のコマンドを実行します。predeployフックは、フェーズの最初のジョブとして常に実行されます。ロールアウトのデプロイジョブが実行されると、Cloud Deploy は、
skaffold.yamlに構成され、パイプライン進行のpostdeployスタンザで参照される任意のコマンドを実行します。
デプロイフックは、デフォルトの Cloud Deploy 実行環境または指定された代替実行環境で実行されます。GKE へのデプロイでは、アプリケーションがデプロイされているのと同じクラスタでフックを実行することもできます。
カナリア デプロイでデプロイフックを使用する
カナリア デプロイのデプロイフックを構成する際には、次の点に注意してください。
デリバリー パイプライン ステージでは、フックの構成(
predeployとpostdeploy)は、strategy.standardではなくstrategy.canary.canaryDeploymentまたはstrategy.canary.customCanaryDeployment.phaseConfigsの下にあります。自動カナリアの場合、
predeployフックは最初のフェーズのデプロイ前にのみ実行され、postdeployフックは最後のフェーズ(安定版)のデプロイ後にのみ実行されます。
Skaffold でアクションを構成する
skaffold.yaml ファイルでは、customActions スタンザが 1 つ以上の customActions スタンザを取得し、以下のように構成されます。
customActions:
- name: ACTION_NAME
containers:
- name: CONTAINER_NAME
image: IMAGE
command: [COMMANDS_TO_RUN]
args: [LIST_OF_ARGS]
この customerActions スタンザでは:
ACTION_NAME
このアクションの名前。この名前は任意ですが、この
skaffold.yaml内で一意である必要があります。これは、デリバリー パイプライン ステージで定義されたデプロイ前とデプロイ後のアクションから参照される名前です。CONTAINER_NAME
特定のコンテナの名前です。この名前は任意ですが、この
skaffold.yaml内で一意である必要があります。IMAGE
コマンドを実行するコンテナ イメージの名前。
COMMANDS_TO_RUN
コンテナで実行するエントリ ポイントのリストです。
"/bin/sh"は、シェルを呼び出すためにここで指定する一般的なコマンドです。そのシェルで実行するコマンドを args に含めます。LIST_OF_ARGS
コマンドに提供する引数のリストです。これは、各引数が引用符で囲まれたカンマ区切りのリストです。COMMAND_TO_RUN が
"/bin/sh"の場合、ここでの引数の 1 つは"-c"になり、別の引数は呼び出したシェルで実行するコマンドの全体です。次に例を示します。
command: ["/bin/sh"] args: ["-c", `echo "This command ran!"`]
Skaffold カスタム アクションの詳細については、Skaffold のドキュメントをご覧ください。
アクションを参照するようにパイプラインを構成する
デプロイフックの構成を完了するには、skaffold.yaml ファイルで定義したカスタム アクションを参照するようにデリバリー パイプラインを構成します。デプロイ前とデプロイ後のアクションは、パイプラインで進行中の 1 つ以上の特定のステージで構成されます。
standard デプロイ戦略を使用する場合、パイプライン ステージでデプロイ前とデプロイ後のフックを構成する方法は次のとおりです。
serialPipeline:
stages:
- targetId: hooks-staging
profiles: []
strategy:
standard:
predeploy:
actions: ["PREDEPLOY-ACTION"]
postdeploy:
actions: ["POSTDEPLOY-ACTION"]
この yaml では:
PREDEPLOY_ACTION
skaffold.yamlで使用した ACTION_NAME と同じです。これは、デプロイ前に実行するカスタム アクションを定義するために使用します。POSTDEPLOY_ACTION
skaffold.yamlで使用した ACTION_NAME と同じです。これは、デプロイ後に実行するカスタム アクションを定義するために使用されます。
predeploy と postdeploy には、複数のアクションをカンマ区切りで指定できます。複数のアクションが指定されている場合、指定された順序でシリアルに実行されます。ジョブ(プリデプロイまたはポストデプロイ)は、失敗した最初のアクションで失敗し、残りのアクションは実行されません。
デフォルトでは、複数のコンテナを並列で実行しているときにジョブが失敗すると、両方のコンテナが停止します。この動作は、Skaffold カスタム アクションの失敗戦略を使用して構成できます。
アプリケーション クラスタでフックを実行する
デフォルトでは、デプロイフックは Cloud Deploy 実行環境で実行されます。アプリケーションが実行されているのと同じクラスタでこれらのカスタム アクションを実行するように Skaffold を構成することもできます。skaffold.yaml でカスタム アクションを構成し、パイプライン ステージで有効にすると、そのターゲットのクラスタでアクションが自動的に実行されます。
この機能は、Cloud Run ではなく、GKE へのデプロイでのみ使用できます。Cloud Run へのデプロイについては、Cloud Deploy 実行環境でのみフックを実行できます。
クラスタでフックを実行するには、skaffold.yaml 構成ファイルの executionMode.kubernetesCluster スタンザを、特定のカスタム アクションの customActions スタンザに配置します。
customActions
- name: ACTION_NAME
containers:
- name: CONTAINER_NAME
image: IMAGE
command: [COMMANDS_TO_RUN]
args: [LIST_OF_ARGS]
executionMode:
kubernetesCluster: {}
以下に、アプリケーション クラスタでフック コンテナを呼び出す executionMode を含む customActions スタンザの例を示します。
customActions:
- name: predeploy-action
containers:
- name: predeploy-echo
image: ubuntu
command: ["/bin/sh"]
args: ["-c", 'echo "this is a predeploy action"' ]
executionMode:
kubernetesCluster: {}
executionMode スタンザの使用は任意です。省略すると、Skaffold は Cloud Deploy 実行環境でカスタム アクション コンテナを実行します。
使用可能な環境変数
Cloud Deploy では、フックに使用できる 実行環境で、次の環境変数を指定し、入力します。
ANTHOS_MEMBERSHIPタイプが
ANTHOSのターゲットの場合、GKE 接続クラスタ メンバーシップの完全なリソース名。CLOUD_RUN_LOCATIONタイプが
RUNのターゲットの場合、Cloud Run サービスがデプロイされているリージョン。CLOUD_RUN_PROJECTタイプが
RUNのターゲットの場合、Cloud Run サービスが作成されたプロジェクト。CLOUD_RUN_SERVICEタイプが
RUNのターゲットの場合、デプロイされた Cloud Run サービスの名前。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ターゲットの特定のランタイム タイプ。
GKE、ANTHOS、RUNのいずれか。 カスタム ターゲットの場合、これは設定されません。CLOUD_DEPLOY_LOCATIONCloud Deploy リソースを含むリージョン。
CLOUD_DEPLOY_DELIVERY_PIPELINEデリバリー パイプラインの ID。
CLOUD_DEPLOY_TARGETターゲットの ID。
CLOUD_DEPLOY_PROJECTCloud Deploy リソースを含むプロジェクトの Google Cloud プロジェクト番号。
CLOUD_DEPLOY_PROJECT_IDプロジェクトの Google Cloud プロジェクト ID。
CLOUD_DEPLOY_RELEASE検証が実行されるリリースの ID。
CLOUD_DEPLOY_ROLLOUTフックのジョブを含むロールアウトの ID。
CLOUD_DEPLOY_JOB_RUNジョブの現在の実行を表すジョブ実行の ID。
CLOUD_DEPLOY_PHASEフックのジョブを含むロールアウトのフェーズ。
パラメータを環境変数としてデプロイする
このセクションに記載されている環境変数に加えて、設定したデプロイ パラメータが Cloud Deploy からカスタム コンテナに渡されます。
詳細。
次のステップ
Skaffold の詳細については、こちらをご覧ください。