gcloudでCloud Run ジョブをupdate時、--waitを指定すると更新&実行になる点に注意
2024/08/16
masyus
gcloud run jobs update
コマンドによりCloud Run ジョブをupdateする際、--wait
というフラグを指定できます。このフラグの意味を私は今まで
「updateが完了するまで待つ」
だと捉えていたのですが、実際には
「executionが完了するまで待つ」
が正しかったため、備忘録として記事に残します。
バージョン情報
- GitHub google-github-actions/setup-gcloud@v2
gcloud run jobs updateのexecutionに関わるフラグ
gcloud beta run jobs updateの公式ドキュメントによると、ジョブの実行に関するフラグは下記3つが記載されています。--wait
の挙動を理解する上でどのフラグも重要ですので、順を追って説明します。
--async
Return immediately, without waiting for the operation in progress to complete.
--async cannot be used if executing the job after the update.
--execute-now
Execute the job immediately after the creation or update completes. gcloud exits once the job has started unless the --wait flag is set.
--wait
Wait until the execution has completed running before exiting. If not set, gcloud exits successfully when the execution has started. Implies --execute-now.
--async
まず前提として、gcloud run jobs update
はupdateが完了するまで自動的にwait状態となり、shellやGitHub Actions上で実行していた場合は次のプログラムの実行に進まないようになっています。もしupdateの完了を待たずに後続処理を進めたい場合、この--async
フラグを付与することで実現できます。
たとえば大量のCloud Run ジョブがあり、Continuous Delivery(以下CDと称す)上でそれらを一気に更新しつつCDの実行時間を削減したい場合、--async
を付与して実行すると効果的です。
--execute-now
次に知っておきたいのが--execute-now
です。その名の通り、Cloud Run ジョブの設定をupdateした直後に当該ジョブを自動的に実行できるフラグですが、--wait
の挙動を知る上で理解しておく必要があります。
--execute-now
の使いどころは、データベースのMigrationをするためのCloud Run ジョブがあったとして、当該ジョブをupdateしたらすぐにexecuteしてデータベースにMigrationを適用したい時などがあります。
--wait
--wait
は解説によると、
ジョブのupdate後に実行されるexecuteが完了するまで処理を待つためのフラグ
とのことです。前述しましたが「updateが完了するまで待つ」ではない点に注意です。「Implies --execute-now」とあるので、このフラグを付与してgcloud run jobs update
を実行する際は暗黙的に--execute-now
を指定したのと同じことになるとあります。
--execute-nowと--waitの使い分け
では
gcloud run jobs update $JOB_NAME --execute-now
gcloud run jobs update $JOB_NAME --execute-now --wait
の違いは何かと言いますと、
- update後にexecuteを開始したら、完了を待たずに後続の処理を進める
- update後にexecuteを開始したら、完了するまで待つ
の点が異なります。前者はexecuteに対して--async
が暗黙的に付与されているとみなすのが良いでしょう。また、
gcloud run jobs update $JOB_NAME --wait
とした場合は--wait
の解説にある「Implies --execute-now」により、
gcloud run jobs update $JOB_NAME --execute-now --wait
と同じ結果になります。即ち、
update後にexecuteを開始したら、完了するまで待つ
ことになります。