Open2

CircleCIでテストを並列実行する

oosukeoosuke

parallelismを利用する

CircleCIにはparallelismという仕組みがあり、これを使うことでテストを分割実行し並列実行させることができる。

https://circleci.com/docs/ja/2.0/parallelism-faster-jobs/

テスト分割実行を可能としているのが、circleci tests globcircleci tests splitの2つの組み込みスクリプト。

circleci tests globへ実行したテストファイルを取得し、パイプでcircleci tests splitへ渡すことで分割する。--split-byオプションがあり、指定できる値はtymingsfinalizeの2つ。

今回はtymingsを指定する。tymingsを指定された場合、tyming-dataというものを参照して、適切に全テストが均等に終了するように振り分けてくれる。

参照するtyming-dataの出力先としてstore-results-optionも合わせて指定する必要がある。

job:
  test:
    docker:
      - image: circleci/node:14
    parallelism: 2
    steps:
      - checkout
      - run:
        name: Parallel Jest
        command: |
          TESTFILES=$(circleci tests glob "src/**/*.test.ts" | circleci tests split  --split-by=timings)
          yarn jest $TESTFILES
      - store_test_results:
        path: test-results
oosukeoosuke

テスト用のジョブを複数作成して並列実行させる

parallelismを利用する方法とは別に複数のテストジョブを定義してワークフローで並列実行させる。

workflows:
  version: 2
  build_accept_deploy:
    jobs:
      - build
      - acceptance_test_1:
          requires:
            - build
      - acceptance_test_2:
          requires:
            - build
      - acceptance_test_3:
          requires:
            - build
      - acceptance_test_4:
          requires:
            - build
      - deploy:
          requires:
            - acceptance_test_1
            - acceptance_test_2
            - acceptance_test_3
            - acceptance_test_4