CiecleCI
でAVA
のunitテストを自動実行させているのですが、テストファイル数が増大した時にCircleCIからToo long with no output (exceeded 10m0s)
と怒られたので、その対応について書き残します。
前提条件
- 環境
-
CircleCI
- 無償版(コンテナは1個)
- version: 2.0
-
AVA
- version: 0.20.0
-
Docker
- image:
node:8.9.1
- image:
-
- 実行するunitテストファイルの合計は約1000個
-
--serial
はつけていない - ファイル内で
test.serial
,async/await
など使っているものもあるが基本的には並列実行 - ローカルのMacでは正常にテストは終了
config.yml
の一部を抜粋します。
version: 2
jobs:
unit:
environment:
ENV_TYPE: local
ENV_FILE_PASSWORD: local
docker:
- image: node:8.9.1
working_directory: ~/hoge
steps:
- checkout
- setup_remote_docker
- run:
name: Create repository
command: |
mkdir -p ./reports
when: always
- run:
name: Install node modules
command: npm i
- run:
name: Run test
command: npm run coverage
- store_test_results:
path: ./reports
- store_artifacts:
path: ./reports
上記の、npm run coverage
の実態は以下です。
{
"scripts": {
"coverage": "nyc --reporter=lcov --reporter=html --report-dir=./reports ava test/unit --tap | tap-xunit > ./reports/ava.xml"
}
}
現象
上記のnpm run coverage
で実際にunitテストを実行し、カバレッジを作成・出力していますが、ここで數十分待っても何も出力されず、Too long with no output (exceeded 10m0s)
と出力され、FAILED
となってました。
AVA
のunitテストがこける原因
公式ドキュメントのCLIの項目をみたら、以下のような記載がありました。
--concurrency, -c Max number of test files running at the same time (Default: CPU cores)
つまり、同時に実行できるテストファイルの最大値はDefault: CPU cores
なんだと。上記のように、今回はこのオプションをつけずにAVAを実行していました。
しかし、1ファイルで少々時間のかかるテストファイルがいくつか存在したため、それらを並列に実行して行ったところ、Test exited due to SIGKILL
となってました(SSH
で入って手動で実行して初めてわかりました)。プロセスごと殺されているため、AVAに処理が帰って来ず、ずっと何も出力がないため、CircleCIさんが止めた形ですかね。ちなみに、ローカルのMacでは正常にテストは終了したので、ちょっとハマりました。
対策
お察しの通り、-c
オプションをつければ問題なく終了しました。ではその値は?ということですが、もちろんDefault: CPU cores
とreadmeに記載があるので、
root@801df972f396:~# grep cpu.cores /proc/cpuinfo | sort -u
cpu cores : 8
上記のようにCPUコア数を確認し(私の場合はコア数が8でした)、AVA のコマンド実行時に-c 8
を追加したら通りました。もし他にもこんな方法があるよ!という知見をお持ちの方、ご教示いただけると助かります。
以上です。
▼余談
先ほどの、公式ドキュメントのCLIの項目と、実際にnpmからava@0.24.0
(現時点での最新)をインストールしてava --help
を実行した時に差分がありますw
--concurrency, -c Maximum number of test files running at the same time (EXPERIMENTAL)
え、EXPERIMENTAL
ですか…w