Simapecov結果のセマフォCI上での並列Rails仕様の併合
あなたがNapsSACKプロでパラレルマシンでRails仕様を走らせているならば、あなたが実行する1つの挑戦はsimplecovによって生成されるコードカバレッジ結果を結合しています.
すべてのテストが実行された後に、この投稿は、合計結合コードカバレッジのレポートを生成する方法を示します.パイプラインのダイアグラムが高レベルでどのように見えますか?
まずは、SimpleCoV用の設定ファイルを見てみましょう.ノート
また、注意してください.
以下はセマフォCI構成の関連部分です.これは、Railsのテストを実行し、セマフォのワークフローアーティファクトとしてカバレッジ結果をアップロードします.すべての並列テストが完了した後、それはすべてのマシンからカバレッジ結果を照合するためにジョブを実行します.
最後に、ここであなたのセマフォワークフローアーチファクトがどのように見えるかです.それは、各マシンで生成された圧縮カバレッジファイルと、最後に作成したカバレッジファイルを持ちます.
このアプローチは、簡単に変更することによって、他のCIプロバイダに簡単に移植することもできます
この記事があなたに役に立つことを願っています.あなたが質問やフィードバックがある場合は私に知らせてください.
この投稿は当初公表されたmy blog . あなたがこのポストが好きであるならば、それをソーシャルメディアと共有してください!
すべてのテストが実行された後に、この投稿は、合計結合コードカバレッジのレポートを生成する方法を示します.パイプラインのダイアグラムが高レベルでどのように見えますか?
構成
単純化する
まずは、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 . あなたがこのポストが好きであるならば、それをソーシャルメディアと共有してください!
Reference
この問題について(Simapecov結果のセマフォCI上での並列Rails仕様の併合), 我々は、より多くの情報をここで見つけました https://dev.to/jesalg/merging-simplecov-results-with-parallel-rails-specs-on-semaphore-ci-8f6テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol