CI環境でjestがメモリエラーを起こす問題について
CI の実行環境は、使用できるメモリに制限があります。
テストが大量のメモリを消費すると、システムがメモリ不足を検出し、プロセスを強制終了することがあります。
これは、特にヒープサイズが大きく設定されている場合や、並行して多くのテストが実行されている場合に発生しやすいです。
今回は下記のエラーが発生したときの調査内容と解決方法をまとめました。
A jest worker process (pid=xxxx) was terminated by another process: signal=SIGKILL, exitCode=null. Operating system logs may contain more information on why this occurred.
調査内容
エラーメッセージの内容から、Github Actions のメモリエラーが発生している可能性が高いと判断したため、テストのヒープサイズを確認しました。
そうすると heap size が 1200MB ~ 1800MB 程度で、一般的な Jest のユニットテストと比較して大きいことがわかります(一般的には数百 MB 程度)。
また、テストが実行されるにつれてヒープ使用量が段階的に増加していることがわかりました。
$ jest --logHeapUsage
過去の Issue
Node.js が原因によるメモリリークが報告されています。こちらの Issue は 21.1.0 で修正されているとのことですが、2024 年 10 月現在の LTS は 20.18 なので、バージョンアップ以外の方法で対応する必要がある。
対応方法
メモリ消費を抑えるために、maxWorkers の設定値を調整しました。
Jest は、テストを並行して実行することで、実行時間を短縮します。この並行実行は、複数のワーカープロセスを使用して行われます。
maxWorkers には%を使って値を指定すると、利用可能な CPU コア数の何パーセントをワーカープロセスとして使用するかを指定することができます。数値を設定すると、Jest の実行に使用するワーカープロセスの数を指定できます。
この数値を、実行環境に合わせて値を変更しながら、テストが落ちない数値に調整しました。
ワーカープロセス
ワーカープロセスとは、特定のタスクを実行するために作成される個別のプロセスのことです。
コンピュータプログラムが並行して複数の作業を行う際に、これらのワーカープロセスを使用します。
Discussion