Simapecov結果のセマフォCI上での並列Rails仕様の併合


あなたがNapsSACKプロでパラレルマシンでRails仕様を走らせているならば、あなたが実行する1つの挑戦はsimplecovによって生成されるコードカバレッジ結果を結合しています.
すべてのテストが実行された後に、この投稿は、合計結合コードカバレッジのレポートを生成する方法を示します.パイプラインのダイアグラムが高レベルでどのように見えますか?

構成


単純化する


まずは、SimpleCoV用の設定ファイルを見てみましょう.ノートminimum_coverage ビルドに失敗しました.これは、各々のノードがたぶんそれ自身で最小カバレッジしきい値を満たさないので、それが誤ってビルド失敗につながることができたからです.
また、注意してください.before_queue ナップサックプロ用フック.これは重要な部分です、結果がそれに対して記録されるように、それはCIノードインデックスに基づくコマンド名を設定します..simplecov :
  SimpleCov.start do
    add_filter %r{^/config/}
    add_filter %r{^/db/}
    add_filter %r{^/spec/}

    add_group 'Admin', 'app/admin'
    add_group 'Controllers', 'app/controllers'
    add_group 'Helpers', 'app/helpers'
    add_group 'Jobs', 'app/jobs'
    add_group 'Libraries', 'lib/'
    add_group 'Mailers', 'app/mailers'
    add_group 'Models', 'app/models'
    add_group 'Policies', 'app/policies'
    add_group 'Serializers', 'app/serializers'
  end
  Rails.application.eager_load!

  KnapsackPro::Hooks::Queue.before_queue do
    SimpleCov.command_name("rspec_ci_node_#{KnapsackPro::Config::Env.ci_node_index}")
  end
今すぐsimplecovを作成するときに.resultset.json 以下の例のように、どのCIノードが実行されたかによって、特定のキーがあります.結果を組み合わせるときに、これは行の下で役に立つでしょう.
{
  "rspec_ci_node_0": {
    "coverage": { ... }
  }
}

{
  "rspec_ci_node_1": {
    "coverage": { ... }
  }
}
...

セマフォCI


以下はセマフォCI構成の関連部分です.これは、Railsのテストを実行し、セマフォのワークフローアーティファクトとしてカバレッジ結果をアップロードします.すべての並列テストが完了した後、それはすべてのマシンからカバレッジ結果を照合するためにジョブを実行します..semaphore/semaphore.yml :
- name: "Rails Tests"
    task:
      jobs:
        - name: Rails
          parallelism: 10
          commands:
            - ./.semaphore/helpers/rails_tests.sh
      epilogue:
        always:
          commands:
            - ./.semaphore/helpers/upload_test_artifacts.sh
      secrets:
        - name: docker-hub
        - name: knapsack-pro-rails

- name: "Code Coverage"
  dependencies: ["Rails Tests"]
  task:
    env_vars:
      - name: SEMAPHORE_RAILS_JOB_COUNT
        value: "10"
    jobs:
      - name: Collate Results
        commands:
          - ./.semaphore/helpers/calc_code_coverage.sh
    secrets:
      - name: docker-hub
以下は各並列マシンでRailsテストを実行するbashファイルです.これは、レールの環境を設定し、キューモードでナップザックProを実行します..semaphore/helpers/rails_tests.sh :
#!/bin/bash
set -euo pipefail

docker-compose -f docker-compose.semaphore.yml --no-ansi run \
  -e KNAPSACK_PRO_RSPEC_SPLIT_BY_TEST_EXAMPLES=true \
  -e KNAPSACK_PRO_TEST_FILE_PATTERN="spec/**/*_spec.rb" \
  ci bash -c "bin/rake ci:setup db:create db:structure:load knapsack_pro:queue:rspec['--no-color --format progress --format RspecJunitFormatter --out tmp/rspec-junit/rspec.xml']"
これは各マシンからSimpleCoV結果をアップロードする責任があるbashファイルです.これはカバレッジディレクトリを圧縮し、セマフォにアップロードします..semaphore/helpers/upload_test_artifacts.sh :
if [ -d "tmp/rspec-junit" ]
then
  echo "Pushing rspec junit results"
  artifact push job tmp/rspec-junit --destination semaphore/test-results/
fi

if [ -d "coverage" ]
then
  echo "Pushing simplecov results"
  tar czf coverage_${SEMAPHORE_JOB_INDEX}.tgz -C coverage .
  artifact push workflow coverage_${SEMAPHORE_JOB_INDEX}.tgz
fi
最後に、これはすべての結果をセマフォから照合するためのbashファイルです.これは、各パラレルマシンからカバレッジアーティファクトをダウンロードし、それらを照合し、その後の組み合わせに結果をアップロードするRakeタスクを実行しますtotal_coverage.tgz 以下に示すファイル.semaphore/helpers/calc_code_coverage.sh :
#!/bin/bash
set -euo pipefail

for i in $(eval echo "{1..$SEMAPHORE_RAILS_JOB_COUNT}"); do
  artifact pull workflow coverage_$i.tgz;
  mkdir coverage_$i
  tar -xzf coverage_$i.tgz -C coverage_$i
done

docker-compose -f docker-compose.semaphore.yml --no-ansi run ci bash -c "bin/rake coverage:report"
tar czf total_coverage.tgz -C coverage .
artifact push workflow total_coverage.tgz
このcoverage:report rakeタスクは単に呼び出しますSimpleCov.collate 各フォルダのカバレッジ結果を通過し、それらを1つにまとめます.resultset.json 下記lib/task/coverage_report.rake :
namespace :coverage do
  desc 'Collates all result sets generated by the different test runners'
  task report: :environment do
    require 'simplecov'

    SimpleCov.collate Dir['coverage_*/.resultset.json']
  end
end
.resultset.json
{
  "rspec_ci_node_0, rspec_ci_node_1, rspec_ci_node_2, rspec_ci_node_3, rspec_ci_node_4, rspec_ci_node_5, rspec_ci_node_6, rspec_ci_node_7, rspec_ci_node_8, rspec_ci_node_9": {
    "coverage": { ... }
}

概要


最後に、ここであなたのセマフォワークフローアーチファクトがどのように見えるかです.それは、各マシンで生成された圧縮カバレッジファイルと、最後に作成したカバレッジファイルを持ちます.

このアプローチは、簡単に変更することによって、他のCIプロバイダに簡単に移植することもできますartifact push and artifact pull コマンドS 3または別のCI固有のアーティファクトのアップロードコマンドです.
この記事があなたに役に立つことを願っています.あなたが質問やフィードバックがある場合は私に知らせてください.
この投稿は当初公表されたmy blog . あなたがこのポストが好きであるならば、それをソーシャルメディアと共有してください!