🐳

docker/build-push-action@v3 + GCP のデプロイエラーを何とかした覚書

2023/01/24に公開
1

3 行まとめ

  • 2023 年 1 月 14 日以降しばらくの間、GitHub Actions を用いて Cloud Run 等へデプロイする際に「コンテナイメージが見つからない」といった類のエラーメッセージが出たら、 docker/build-push-action@v3 の利用を疑ってみる
  • provenance に未対応のレジストリを使っているのがわかったら、 provenance: false をインプットとして指定すると、治るかもしれない
  • Cloud Run の場合、エラーメッセージが出た時点で異常な状態のリビジョンを作成してしまっている場合があるので、念のためチェックして、必要であれば異常なリビジョンを削除するとよい

2022.2.9 追記

docker/build-push-action@v4provenance: false がデフォルトになったようです。

https://github.com/docker/build-push-action/releases/tag/v4.0.0

エラー発生

2023 年 1 月 20 日の昼下がり、GitHub Actions くんが Cloud Run で動くステージング環境にプロダクトの最新バージョンをデプロイしようとしていたところ、次のようなエラーが起きて、失敗してしまいました。

Updating Cloud Run job [xxxxxxxxx] in project [yyyyyyyy] region [asia-northeast1]
Updating job...
failed
Job failed to deploy
ERROR: (gcloud.beta.run.jobs.update) Image 'asia-northeast1-docker.pkg.dev/zzzzzzzz/aaaaa/bbbbb' not found.
Error: Process completed with exit code 1.

これは何でしょう。権限が足りないか何かでしょうか。しかし調べてみても、権限周りの問題ではなさそうです。

build-push-action の機能追加が原因らしい

そんな折、こんなツイートが見つかりました。

https://twitter.com/fosseng/status/1616227805125025792

docker/build-push-action といえば、コンテナイメージにタグを打ってくれたりするやつだったでしょうか(雑な理解)。

provenance という機能がデフォルトでオンになったんだけど、多くのコンテナレジストリ(GCP の Container Registry など含む)は未対応なので落ちまくってるよ、みたいな話っぽい。

なるほど、機能追加ということであれば、最新の docker/build-push-action@v3.3.0 のリリースノートを見てみましょう。

https://github.com/docker/build-push-action/releases/tag/v3.3.0

確かに provenance という inputs が追加されてますね。おや、何か注意書きが……

Clour Run や AWS Lambda(と、それらと共に使うレジストリ)でエラーが起きるかもね、と注意書きされています。どうやら他の人も困っていたことのようです。

修正してみる

docker/build-push-actionprovenance: false を指定すれば治りそうです。えいやっ。

  - name: Build and push
    uses: docker/build-push-action@v3
    with:
      context: xxxx
+     provenance: false
      push: true
      tags: |
        xxxx
        yyyyy
      cache-from: type=gha
      cache-to: type=gha,mode=max

筆者の環境の場合、ステージング環境はこれで治りました。

異常なリビジョンを削除する

ですが、本番環境は何故かデプロイが完了しません。何だろう……

他にも何か問題があるのかなと、Cloud Run のコンソールを見に行ってみます。

トラフィックのルーティングが完了しないままになっている

なかなか見かけない状態になっていました。 provenance: true 状態でデプロイタスクを走らせた際に生まれたリビジョンが異常な状態になり、ルーティングの完了を阻害していたようです。

❗️ がついているリビジョンを消してみましょう。

異常なリビジョンを削除したら治った

コンソールが見慣れた状態に戻りました!

解決

この状態になってから、再度本番環境へのデプロイタスクを走らせたところ、無事に最新バージョンが公開されました。めでたし。

まとめ

筆者が関わっている本業と副業の両方で発生したので、おそらく影響範囲は広いだろうなと思い、記事にしてみました。

provenance 自体は良い機能らしい(しらんけど)ので、将来、レジストリ側が対応したときには provenance: true にできるよう、たまに動向を見ておいたほうがいいかもしれません。

それでは。

株式会社モニクル

Discussion

KAZYPinkSaurusKAZYPinkSaurus

Nkznさん、こんにちは。

同じエラーで困っていたところ、当記事を発見しました。
大変参考になりました。ありがとうございます。

ところで、記事中に

docker/build-push-action@v4 で provenance: false がデフォルトになったようです。

とありますが https://github.com/docker/build-push-action/releases/tag/v4.0.0 を読むと

You can optionally disable the default provenance attestation functionality using provenance: false.
Enable provenance by default if not set by @crazy-max in #784

とあるのでDefaultは有効のままではないでしょうか?


現在最新のv6での動作ですが、

provinceを設定しない場合のbuildのオプションは
--attest type=provenance

でprovinceを明示的にfalseとすると
--attest type=provenance,disabled=true

となりました。
お役に立てれば幸いです。