Skip to content

Commit dcd620a

Browse files
committed
Fix SimpleCov coverage generation in CI parallel runs
Configure SimpleCov to generate unique coverage files for each parallel CI runner and merge them for reporting. Changes: - Detect CI parallel execution via CI_NODE_INDEX environment variable - Generate unique command names (RSpec-0, RSpec-1, etc.) per runner - Preserve resultset files immediately after test completion - Merge all resultsets in separate coverage job before reporting Local parallel execution still works using TEST_ENV_NUMBER detection.
1 parent 81bfd15 commit dcd620a

2 files changed

Lines changed: 20 additions & 5 deletions

File tree

.github/workflows/ruby.yml

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,17 +49,22 @@ jobs:
4949
- name: Run tests in parallel
5050
env:
5151
DATABASE_URL: postgres://postgres:postgres@localhost:5432
52-
TEST_ENV_NUMBER: ${{ matrix.ci_node_index }}
52+
CI_NODE_INDEX: ${{ matrix.ci_node_index }}
5353
run: |
5454
bundle exec parallel_rspec spec/ \
5555
-n ${{ matrix.ci_node_total }} \
5656
--only-group ${{ matrix.ci_node_index }}
5757
58+
- name: Preserve coverage results
59+
run: |
60+
# Copy resultset immediately after tests complete to prevent deletion
61+
cp coverage/.resultset.json coverage/resultset-${{ matrix.ci_node_index }}.json
62+
5863
- name: Upload coverage artifacts
5964
uses: actions/upload-artifact@v4
6065
with:
6166
name: coverage-${{ matrix.ci_node_index }}
62-
path: coverage/.resultset.json
67+
path: coverage/resultset-${{ matrix.ci_node_index }}.json
6368
retention-days: 1
6469

6570
coverage:
@@ -88,7 +93,7 @@ jobs:
8893
require "simplecov"
8994
9095
resultsets = {}
91-
Dir["coverage-results/coverage-*/.resultset.json"].each do |file|
96+
Dir["coverage-results/coverage-*/resultset-*.json"].each do |file|
9297
data = JSON.parse(File.read(file))
9398
resultsets.merge!(data)
9499
end

spec/spec_helper.rb

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,18 @@ def self.branch_coverage?
3030
add_filter 'spec/'
3131

3232
# Support parallel test execution
33-
if ENV['TEST_ENV_NUMBER']
34-
command_name "RSpec-#{ENV['TEST_ENV_NUMBER']}"
33+
# In CI: Use CI_NODE_INDEX (0, 1, 2, 3) set by GitHub Actions matrix
34+
# Locally: Use TEST_ENV_NUMBER ('', '2', '3', '4') set by parallel_tests
35+
if ENV['CI_NODE_INDEX']
36+
command_name "RSpec-#{ENV['CI_NODE_INDEX']}"
37+
use_merging true
38+
merge_timeout 3600
39+
elsif ENV.key?('TEST_ENV_NUMBER')
40+
# TEST_ENV_NUMBER is '' for first process, '2', '3', etc. for others
41+
suffix = ENV['TEST_ENV_NUMBER'].empty? ? '1' : ENV['TEST_ENV_NUMBER']
42+
command_name "RSpec-#{suffix}"
43+
use_merging true
44+
merge_timeout 3600
3545
end
3646
end
3747

0 commit comments

Comments
 (0)