CircleCI : parallelism을 사용할 때 SimpleCov 결과를 요약하고 Artifacts에 넣습니다.

7481 단어 CircleCIRSpecRails
CircleCI에서 parallelism을 사용하여 Rspec을 병렬로 실행하면 SimpleCov의 결과가 각 coverage 디렉토리에 흩어져 출력됩니다. 이것을 1개로 정리해, 한층 더 CircleCI상에서 결과의 HTML가 보이게 하고 싶다.



참고로 한 페이지:
  • CircleCI에서 병렬로 실행 된 RSpec의 커버리지를 Coveralls로 보냅니다.
  • Merging test runs under different execution environments
  • Storing Build Artifacts - CircleCI

  • 여러 작업의 테스트 결과를 단일 디렉토리로 복사



    SimpleCov의 결과는 coverage 디렉토리 아래의 JSON 파일 .resultset.json에 출력됩니다. 아래의 "Copy coverage results"와 같이 Rspec 실행 후 JSON 파일을/tmp/coverage/.resultset-number.json에 복사합니다.

    또한 persist_to_workspace를 사용하면/tmp/coverage 아래의 파일을 작업간에 공유할 수 있습니다. RSpec의 실행이 끝날 때마다, .resultset-번호.json 가 이 디렉토리에 모여 갑니다.

    또한/tmp/coverage 라는 디렉토리 이름은 매우 중요합니다.

    .circleci/config.yml
      test:
        parallelism: 4
    # 略
        steps:
    # 略
          - run:
              name: rspec
              command: |
                bundle exec rspec --format RspecJunitFormatter \
                                  --out test_results/rspec.xml \
                                  --format documentation \
                                  $(circleci tests glob "spec/**/*_spec.rb" | circleci tests split)
          - store_test_results:
              path: test_results
    
          - run:
              name: Copy coverage results
              command: |
                mkdir /tmp/coverage
                cp coverage/.resultset.json "/tmp/coverage/.resultset-${CIRCLE_NODE_INDEX}.json"
          - persist_to_workspace:
              root: /tmp/coverage
              paths:
                - .resultset-*.json
    

    SimpleCov 결과를 결합하는 작업



    최근 SimpleCov는 여러 JSON에서 하나의 HTML을 출력하는 기능을 가지고 있었으므로 이것을 그대로 사용하는 rake 파일을 작성합니다.

    lib/tasks/coverage_report.rake
    namespace :coverage do
      desc "Collates all result sets generated by the different test runners"
      task :report do
        require 'simplecov'
    
        SimpleCov.collate Dir["/tmp/coverage/.resultset-*.json"], 'rails'
      end
    end
    

    병렬 테스트가 모두 끝나면 결과 요약



    CircleCI의 workflows를 설정하고 test 작업이 모두 끝나면 report 작업을 실행하도록 합니다(아래 workflows - build_and_test - jobs - report 부분).

    report 작업은 rake 작업의 coverage:report를 이동합니다. 이 때, attach_workspace 로 복수의 JSON 파일이 놓인/tmp/coverage 를 사용할 수 있도록 해 둡니다. 이제 coverage 아래에 SimpleCov HTML이 완성됩니다.

    또한 store_artifacts를 사용하면 coverage 디렉토리가 CircleCI의 Artifacts에 일정 기간 저장되어 브라우저에서 볼 수 있습니다.

    .circleci/config.yml
    jobs:
      build:
    # 略
      test:
    # 略
      report:
        docker:
          - image: cimg/ruby:2.6.6-node
        steps:
          - checkout
          - ruby/install-deps:
              bundler-version: 2.1.4
          - attach_workspace:
              at: /tmp/coverage
          - run:
              name: Collates all result sets
              command: bundle exec rails coverage:report
          - store_artifacts:
              path: coverage
    
    workflows:
      version: 2
      build_and_test:
        jobs:
          - build
          - test:
              requires:
                - build
          - report:
              requires:
                - test
    

    미래의 도전



    Rails 6의 병렬 테스트는 Rspec에서 사용할 수 있는지, CircleCI에서 어떻게해야하는지 조사한다.

    내 CircleCI 기사 :
  • CircleCI config.yml 편지지 Rails 6 / PostgreSQL / Rspec (orb 및 최신 이미지 사용)
  • CircleCI config.yml 편지지 Rails 6 / PostgreSQL / Rspec
  • 좋은 웹페이지 즐겨찾기