何が起きたか
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.prisma の binaryTargets で決まる。
自分の設定はこうなっていた。
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-latest は Debian 系 だ。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 を足しても直らなければそっちも疑ってみてほしい。