[Github Action]PHPUnitを並列実行し、CI実行時間を1/3にしました
アイミツ開発チームでエンジニアリングをしている deliku です!
先日、PR TIMES さんのテックブログを読んだことをきっかけにCI設定の見直しをしました。
CI実行時間が増えることでの悩み
1年以上前になりますが、当時テスト実行時間を短縮するブログを書いた頃は数分もかかっていなかった処理が、現在ではテストケースが増えたことで実行時間が伸びてきていました。
「PR作成する > CIがFailしていないことを確認する > PRレビュー依頼する」の順に作業すれば不毛なやりとりは増やせるのですが、「CIが完了するまで別のことをしていようと思えてしまう地味な時間」が発生することで、依頼漏れやCIの失敗検知漏れなどが、チーム内でも度々発生していました。
CI実行時間の改善
マトリックスを使用することでジョブが並列実行する特性を利用し、実行するテストケースを按分することを最初に考えた人すごいですね。
strategy:
matrix:
parallel: [ 3 ] # 並列実行数
id: [ 0, 1, 2]
run: |
find tests/Unit -name '*Test.php' | sort | awk "NR % ${{ matrix.parallel }} == ${{ matrix.id }}" | xargs php ./create_multithread_phpunit_xml.php
./vendor/bin/phpunit --configuration ./ci_phpunit.xml
並列数を 3 にしているのは、下記の通りいくつかのパターンで検証した結果並列数を増やしても実行時間の改善が見られなかったためです。
Laravel9 では、parallelオプションを使用することで並列実行数を増やせるのですがCPU コア数に依存しており、GitHub が提供しているデフォルトのサポートランナーは2CPU or 3CPUのため、この方法でスケールすることが難しいという理解でいます(自前でセルフホストランナーを用意する対応が必要)
▶ 【PR】ユニラボ に興味がある方へ
今回の記事を読んでユニラボに興味を持っていただけた方は、まずはカジュアル面談でざっくりお話させていただければと思います!