1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

GitHub ActionsでPrismaが「Query engine library not found」になったら binaryTargets を疑え

1
Posted at

何が起きたか

Next.js + Prisma のプロジェクトで E2E テストを GitHub Actions で回す CI を組んでいたときの話。

ローカル (macOS) では普通に動く。Docker (Alpine Linux) でも動く。なのに CI の prisma migrate deploy だけがこんなエラーで落ちる。

Error: Query engine library for current platform "debian-openssl-3.0.x" could not be found.
You may have to run "prisma generate" for your changes to take effect.

prisma generate はちゃんとワークフロー内で叩いてるのに、だ。

原因

Prisma はプラットフォームごとに異なるネイティブバイナリ (Query Engine) を使う。どのバイナリを生成するかは schema.prismabinaryTargets で決まる。

自分の設定はこうなっていた。

generator client {
  provider      = "prisma-client-js"
  binaryTargets = [
    "linux-musl-openssl-3.0.x",      // Docker (Alpine)
    "darwin",                         // macOS Intel
    "darwin-arm64",                   // macOS Apple Silicon
    "linux-musl-arm64-openssl-1.1.x" // ARM Linux
  ]
}

ローカル開発は macOS、本番の Docker は Alpine ベースなので linux-musl-* 系。ここまでは合ってる。

ただ GitHub Actions の ubuntu-latestDebian 系 だ。Alpine (musl) でも macOS (darwin) でもない。つまり debian-openssl-3.0.x というターゲットが必要なのに、どこにも書いていなかった。

エラーメッセージに答えが丸ごと書いてあるのに、「generate は実行してるのになんで?」という思い込みで無駄に時間を使った。冷静にログを読めという話。

解決策

binaryTargets"debian-openssl-3.0.x" を1つ足すだけ。

generator client {
  provider      = "prisma-client-js"
  binaryTargets = [
    "linux-musl-openssl-3.0.x",
    "darwin",
    "darwin-arm64",
    "linux-musl-arm64-openssl-1.1.x",
    "debian-openssl-3.0.x"           // GitHub Actions (ubuntu-latest)
  ]
}

これで prisma generate 時に Debian 用のバイナリも生成されるようになり、CI は通った。

どの環境にどのターゲットが要るのか

よく使うものだけ整理しておく。

実行環境 binaryTarget
macOS Intel darwin
macOS Apple Silicon darwin-arm64
Alpine Linux (Docker公式Node等) linux-musl-openssl-3.0.x
Ubuntu / Debian (GitHub Actions等) debian-openssl-3.0.x

自分の環境だけだと prisma generate が自動検出してくれるので気づきにくい。CI のように「ビルドする場所」と「ローカル」が違う場合にハマるパターン。

まとめ

正直、エラーメッセージに debian-openssl-3.0.x ってそのまま書いてあるので、落ち着いて読めば一瞬で解ける。ただ「generate は走ってるんだから別の問題だろう」と決めつけてワークフローの順序とか Node バージョンとかを疑い始めると沼にハマる。自分がまさにそうだった。

CI を新しく組むときは、そのランナーが何の OS で動いているか、Prisma のターゲット一覧に含まれているかを最初にチェックしておくと安心。npx prisma -v で現在のプラットフォーム名が確認できるので、迷ったらまずそれを CI に仕込むのが早い。

ちなみに同じエラーは Docker マルチステージビルドでのコピー漏れや --ignore-scripts で generate が飛ばされたときにも出るので、binaryTargets を足しても直らなければそっちも疑ってみてほしい。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?