はじめに
テストを追加していくとテストの実行時間がボトルネックになりがちです。
そこで CircleCI ではテストを分割し、parallelism
というキーを指定して並列実行ができるようになっています。
ここでは Node.js のプロジェクトで Jest を使用したものを例に話を進めます。
環境
CircleCI 2.1
CircleCI の設定
ジョブの並列レベルの設定
通常 CircleCI のジョブは config.yml に設定した処理を 1 つの Executor 上でジョブが動作します。
複数のジョブを並列に動作させたい場合は、parallelism
というキーに並列数を 1 以上で設定します。
ここでは 2 を指定しているので並列数 2 で動作します。
version: 2.1
jobs:
test:
docker:
- image: circleci/node:12
parallelism: 2
ジョブの並列レベルの設定
並列数を増やしただけでは並列にジョブが動作するだけで、テスト時に同じテストファイルが実行されてしまいます。
次の設定を追加してテストファイルを分割することで分割されたテストファイルが並列に実行されます。
まず circleci tests glob
コマンドにテストファイルのパスを渡します。
glob
に使えるパターンはドキュメントを参照してください。
ここでは JavaScript と TypeScript が同居するプロジェクトを想定し、js
と ts
を指定しています。
取得したファイルを分割するにはパイプで circleci tests split
コマンドに渡します。
--split-by
オプションには filesize
と timings
を指定できます。
今回は timings
を指定します。
timings
は、別途 store_test_results
キーを使用することで適切なタイミングデータが生成されます。
store_test_results
キーを使用した記事についてはこちらを参照してください。
split
コマンドで実行した結果を環境変数に保存してからテストコマンドに渡すことで、テストが並列に分割された状態で実行されます。
DB などに依存するテストの場合でも並列に実行されるためデータが競合することはありません。
version: 2.1
jobs:
test:
docker:
- image: circleci/node:12
parallelism: 2
steps:
- run:
command: |
TESTFILES=$(circleci tests glob "__test__/**/*.spec.{js,ts}" | circleci tests split --split-by=timings)
npm test $TESTFILES
さいごに
簡単ですが、CircleCI の並列分割テストについて取り上げました。
parallelism
と CircleCI が用意した分割コマンドを実行することで簡単に並列実行できるのは便利だと感じます。