gcloudでCloud Run ジョブをupdate時、--waitを指定すると更新&実行になる点に注意

2024/08/16

author

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 updateupdateが完了するまで自動的に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を開始したら、完了するまで待つ

ことになります。

参考