DRYな備忘録

Don't Repeat Yourself.

GAEのデプロイが失敗する: ERROR: (gcloud.app.deploy) Error Response: [9] Cloud build xxxxx status: FAILURE

問題

趣味として、所属している社会人アメフト部の出欠確認・備品管理アプリをスクラッチで書いているのだけれど、あるときGitHub Actionsで動いている自動化デプロイが、以下のエラーを出して失敗していた。

# 前略
Beginning deployment of service [dev]...
╔════════════════════════════════════════════════════════════╗
╠═ Uploading 44 files to Google Cloud Storage               ═╣
╚════════════════════════════════════════════════════════════╝
File upload done.
Updating service [dev]...failed.
ERROR: (gcloud.app.deploy) Error Response: [9] Cloud build xxxxxxx status: FAILURE
An unexpected error occurred. Refer to build logs: https://console.cloud.google.com/cloud-build/builds;region=asia-northeast1/xxxxxxx?project=1111111111
Full build logs: https://console.cloud.google.com/cloud-build/builds;region=asia-northeast1/xxxxxxx?project=1111111111

調査

このログから分かることは

  • ソースコードを Cloud Storage に上げるところまでは成功している
  • Cloud Build で何らかのエラーが出ているが、詳しくはログを見ろ

ということなので、提示されているURLのログを Cloud Console で見に行くと、

Step #2 - "build": Status: Downloaded newer image for asia.gcr.io/gae-runtimes/buildpacks/google-gae-22/go/builder:go_20230305_RC00
Step #2 - "build": asia.gcr.io/gae-runtimes/buildpacks/google-gae-22/go/builder:go_20230305_RC00
Step #2 - "build": ===> ANALYZING
Step #2 - "build": ERROR: failed to initialize analyzer: getting previous image: getting config file for image "asia.gcr.io/triax-football/app-engine-tmp/app/dev/ttl-18h:latest": GET https://storage.googleapis.com/asia.artifacts.triax-football.appspot.com/containers/images/sha256:xxxxxxx?access_token=REDACTED: unexpected status code 404 Not Found: <?xml version='1.0' encoding='UTF-8'?><Error><Code>NoSuchKey</Code><Message>The specified key does not exist.</Message><Details>No such object: asia.artifacts.triax-football.appspot.com/containers/images/sha256:xxxxxxx</Details></Error>
Finished Step #2 - "build"
ERROR
ERROR: build step 2 "asia.gcr.io/gae-runtimes/buildpacks/google-gae-22/go/builder:go_20230305_RC00" failed: step exited with non-zero status: 1

Cloud Storage に格納されているはずの「previous image」が無くてコケているように見える。 で、該当する Cloud Storage のbucketを見に行くと、確かに何も無いので、そりゃコケるわな、という気持ち。

原因

  • 年末大掃除のときに「まあ大丈夫やろ」という気持ちで14日以上のエンティティは全部削除されるようにした気がする。

してたわ

対処

  • Previous Image を削除しちゃっているので、同じCDを回してももちろん同様の理由で失敗する。
  • 原理的には、base image(GAEなので "runtime")とソースコードさえあれば、previous image を参照せずともアプリケーションのイメージをbuildできるはずである。
  • したがって、gcloud app deploy で、previous image を参照しないオプションが無いか、調査し、--no-cacheというオプションを発見した。

--cache

Enable caching mechanisms involved in the deployment process, particularly in the build step. Enabled by default, use --no-cache to disable.

gcloud app deploy  |  Google Cloud CLI Documentation

ビンゴ

なので、いったん手元で

 gcloud app deploy ./app.yaml --no-cache # 以下もろもろ略

としたらデプロイはできた。

原因に対する解決

  • 上記と同様に、GitHub Actions 上の CD においても --no-cache を指定すれば、Cloud Storage で何が起きてもデプロイできるのは想像がつく
  • --no-cache のdownsideとしてはもちろん時間がかかることがあるはずなので、logを確認すると、このプロジェクトは軽いので、
    • --cache = 1分30秒
    • --no-cache = 2分00
  • Pricingは、$0.003/分、なおかつ無料枠は120分/日 Cloud Build pricing  |  Cloud Build Documentation  |  Google Cloud

ということで、このプロジェクトに関しては --no-cache の対応 + Cloud Storage ではもっと早期に自動削除しちゃってよさそう。(7日削除にした)

以上

DRYな備忘録として

Club TRIAX では、メンバー/スポンサーを募集しております!

ちなみに私の役割は「デジタル担当」で、練習場にはほとんど行きません。そういう多種多様な関わりを通じて、仕事や人生そのものを充実させられる、魅力的なチームです。ご興味ある方は、ぜひお声がけください!

www.triax.football