見出し画像

[Github Action]PHPUnitを並列実行し、CI実行時間を1/3にしました

アイミツ開発チームでエンジニアリングをしている deliku です!

先日、PR TIMES さんのテックブログを読んだことをきっかけにCI設定の見直しをしました。

CI実行時間が増えることでの悩み

1年以上前になりますが、当時テスト実行時間を短縮するブログを書いた頃は数分もかかっていなかった処理が、現在ではテストケースが増えたことで実行時間が伸びてきていました。

Testの実行時間が長すぎると、Pull Requestを作るたびにTestの実行待ちが発生することになります。10分を超えてくるとなると、必要のない小休憩には長すぎます。そのため別の作業をし始めたりもするのですが、そうすると別作業の方に集中してしまって、Pull Requestのレビュー依頼忘れも発生していました。またすぐにTestがFailしていることに気づくことができれば、レビュー前に修正してから依頼ができるのでコミュニケーションを1ラリー削減することもできます。

GitHub Actions上でPHPUnitを並列に動作させて、CI実行時間を1/4にしました

「PR作成する > CIがFailしていないことを確認する > PRレビュー依頼する」の順に作業すれば不毛なやりとりは増やせるのですが、「CIが完了するまで別のことをしていようと思えてしまう地味な時間」が発生することで、依頼漏れやCIの失敗検知漏れなどが、チーム内でも度々発生していました。

CI実行時間の改善

既定で、GitHub は、ランナーの可用性に応じて並列実行されるジョブの数を最大化します。 マトリックス内の変数の順序によって、ジョブが作成される順序が決まります。 定義する最初の変数は、ワークフローの実行で最初に作成されるジョブになります。 たとえば、上記のマトリックスでは、次の順序でジョブが作成されます。

ジョブにマトリックスを使用する

マトリックスを使用することでジョブが並列実行する特性を利用し、実行するテストケースを按分することを最初に考えた人すごいですね。

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】ユニラボ に興味がある方へ

今回の記事を読んでユニラボに興味を持っていただけた方は、まずはカジュアル面談でざっくりお話させていただければと思います!


この記事が気に入ったらサポートをしてみませんか?