CIでChromeだけが理由もなく落ちる
Playwrightのテストをローカルで実行すると通るのに、CIへ持っていくとChromiumが突然終了することがあります。
エラーメッセージがはっきりしないので、テストコードの待ち時間を増やしたり、--disable-dev-shm-usageを追加したりしがちです。
ですが、まず確認したいのはDockerコンテナの/dev/shmです。
Dockerの/dev/shmは既定で小さい
Chromiumは複数のプロセスで動き、プロセス間の共有メモリを使います。Dockerコンテナの/dev/shmは既定では64MBなので、画像やJavaScriptが多いページをテストすると容量を使い切ることがあります。
この場合、locatorの指定やexpectの待ち方が間違っているとは限りません。ブラウザ自体が落ちているため、テスト側には「ページが閉じた」「Target page, context or browser has been closed」のような結果しか残らないことがあります。
まずは共有メモリを増やして再現性を見る
では、CIのコンテナで共有メモリを増やしてみましょう。Dockerを直接起動できる場合は、次のように--shm-sizeを指定します。
docker run --shm-size=1gb mcr.microsoft.com/playwright:v1.64.0-noble
CIサービスの設定でDockerの起動オプションを指定できるなら、同じ考え方でshm-sizeを増やします。これで落ちなくなるなら、/dev/shm不足が原因だった可能性が高いです。
公式イメージでは–ipc=hostも候補
Playwright公式のDockerドキュメントでは、ChromiumをDockerで動かすときの選択肢として--ipc=hostが案内されています。
docker run --ipc=host mcr.microsoft.com/playwright:v1.64.0-noble
これはコンテナとホストのIPC名前空間を共有する指定です。CIの実行環境やセキュリティポリシーによって使える範囲が違うので、組織のルールを確認してから採用してください。
–disable-dev-shm-usageは最後の切り分け
Chromiumには--disable-dev-shm-usageという起動引数もあります。共有メモリの利用を避けて、別の一時領域を使う方向へ変更する引数です。
ただし、これは共有メモリを増やす設定ではありません。ストレージやコンテナのメモリ状況によっては遅くなることもあります。
import { defineConfig } from '@playwright/test';
export default defineConfig({
use: {
launchOptions: {
args: ['--disable-dev-shm-usage'],
},
},
});
この引数を貼って終わりにせず、まず--shm-sizeや--ipc=hostで原因を確認する方がよいと思います。回避策を追加したあとも、実行時間と失敗率を記録してください。
切り分けの順番
- 同じテストをローカルとCIで実行し、CIだけでブラウザが閉じるか確認する
- Dockerの
/dev/shm使用量とコンテナのメモリ上限を確認する --shm-size=1gbまたはCIで共有メモリを増やして再実行する- 改善したら、テストコードではなく実行環境の共有メモリ不足を原因として記録する
- 環境を変更しても再現する場合に、ページの負荷・ブラウザ版・テストの並列数を調べる
まとめ
CIのChromiumが理由もなく落ちるとき、待ち時間を増やす前に/dev/shmを見てください。
Dockerの既定値64MBでは、重いページのテストに足りないことがあります。まず共有メモリを増やして原因を確かめ、--disable-dev-shm-usageは環境に合わせた回避策として使い分けましょう。
Playwrightのテストは、コードだけでなくブラウザを動かすコンテナの条件まで含めて初めて安定します。


コメント