minitest-distributed 0.2.7 → 0.2.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.github/ISSUE_TEMPLATE/bug_report.md +43 -0
- data/.github/workflows/ruby.yml +23 -6
- data/.rubocop.yml +1 -0
- data/README.md +5 -5
- data/bin/rake +4 -2
- data/bin/rubocop +4 -2
- data/bin/srb +4 -2
- data/dev.yml +7 -0
- data/docker-compose.yml +6 -0
- data/lib/minitest/distributed/coordinators/redis_coordinator.rb +40 -11
- data/lib/minitest/distributed/enqueued_runnable.rb +1 -1
- data/lib/minitest/distributed/reporters/junitxml_reporter.rb +6 -4
- data/lib/minitest/distributed/result_type.rb +3 -1
- data/lib/minitest/distributed/version.rb +1 -1
- data/lib/minitest/distributed_plugin.rb +7 -0
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c348812d40ad3e74d8ec854264225eb4f444e3b4a8736c25272bade733a5affc
|
4
|
+
data.tar.gz: 2be00ebffab4e0df5b71f29d22917fb69cad0177a77f676c5fc6b512147d9784
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1ae5332ea20d9cd9f8e9fbed8e3c111a653ea7684f98953cdd174cd34e287a8b453a9401eeafa8a9508c15b49a3ad1f36b236a4d075c2d50ad8fa14e9ada57ae
|
7
|
+
data.tar.gz: 44461dbf7adfbde8dc6ae9736ee459a1fc1b9ca35ba36f07f592d0482b3be10ca705bd176902b9866e1e1aa39babea8f9f1108d9ab14af505a564111cb1b2cfe
|
@@ -0,0 +1,43 @@
|
|
1
|
+
---
|
2
|
+
name: Bug report
|
3
|
+
about: Create a report to help us improve
|
4
|
+
title: "[BUG]"
|
5
|
+
labels: bug
|
6
|
+
assignees: ''
|
7
|
+
|
8
|
+
---
|
9
|
+
|
10
|
+
**Describe the issue**
|
11
|
+
A clear and concise description of the issue you're facing.
|
12
|
+
|
13
|
+
**To Reproduce**
|
14
|
+
Steps to reproduce the behaviour:
|
15
|
+
1. Go to '...'
|
16
|
+
2. Click on '....'
|
17
|
+
3. Scroll down to '....'
|
18
|
+
4. See error
|
19
|
+
|
20
|
+
**Expected behaviour**
|
21
|
+
A clear and concise description of what you expected to happen.
|
22
|
+
|
23
|
+
**Screenshots**
|
24
|
+
If applicable, add screenshots to help explain your problem.
|
25
|
+
|
26
|
+
**What team are you on?**
|
27
|
+
Please provide the name of your team.
|
28
|
+
|
29
|
+
**Helpful links (Logs, Link to Build, Repo, PR etc.)**
|
30
|
+
Please provide any helpful links for investigating the issue.
|
31
|
+
|
32
|
+
**Is there a Slack thread related to this bug?**
|
33
|
+
After submitting this issue, you can use: @spy github issues create_comment repo=minitest-distributed issue_id=$NEW_ISSUE_ID on any relevant Slack threads to save that information here.
|
34
|
+
|
35
|
+
**Additional context**
|
36
|
+
Add any other context about the problem here.
|
37
|
+
|
38
|
+
If possible, assign appropriate severity level, priority (high, medium, low) and difficulty (easy, normal, difficult) labels to the issue.
|
39
|
+
SEV-1 <24-72h - Critical issue that actively impacts multiple users/products.
|
40
|
+
SEV-2 <14 days - Limited impact app or major inconvenience to app users, workarounds available.
|
41
|
+
SEV-3 <60 days - Minor issue requiring action, but not affecting a users ability to use the app.
|
42
|
+
SEV-4 <180 days - Minimal impact but something the team wants to fix eventually.
|
43
|
+
SEV-5 No timeline - Cosmetic issue or bugs, no effect on user's ability to use tooling.
|
data/.github/workflows/ruby.yml
CHANGED
@@ -10,8 +10,25 @@ name: Ruby
|
|
10
10
|
on: push
|
11
11
|
|
12
12
|
jobs:
|
13
|
+
test_32:
|
14
|
+
runs-on: shopify-ubuntu-latest
|
15
|
+
container: ruby:3.2
|
16
|
+
|
17
|
+
services:
|
18
|
+
redis:
|
19
|
+
image: redis
|
20
|
+
|
21
|
+
steps:
|
22
|
+
- uses: actions/checkout@v2
|
23
|
+
- name: Install dependencies
|
24
|
+
run: gem install bundler && bundle install
|
25
|
+
- name: Run tests
|
26
|
+
run: bin/rake test
|
27
|
+
env:
|
28
|
+
REDIS_URL: redis://redis:6379
|
29
|
+
|
13
30
|
test_31:
|
14
|
-
runs-on: ubuntu-latest
|
31
|
+
runs-on: shopify-ubuntu-latest
|
15
32
|
container: ruby:3.1
|
16
33
|
|
17
34
|
services:
|
@@ -28,7 +45,7 @@ jobs:
|
|
28
45
|
REDIS_URL: redis://redis:6379
|
29
46
|
|
30
47
|
test_30:
|
31
|
-
runs-on: ubuntu-latest
|
48
|
+
runs-on: shopify-ubuntu-latest
|
32
49
|
container: ruby:3.0
|
33
50
|
|
34
51
|
services:
|
@@ -45,7 +62,7 @@ jobs:
|
|
45
62
|
REDIS_URL: redis://redis:6379
|
46
63
|
|
47
64
|
test_27:
|
48
|
-
runs-on: ubuntu-latest
|
65
|
+
runs-on: shopify-ubuntu-latest
|
49
66
|
container: ruby:2.7
|
50
67
|
|
51
68
|
services:
|
@@ -62,7 +79,7 @@ jobs:
|
|
62
79
|
REDIS_URL: redis://redis:6379
|
63
80
|
|
64
81
|
typecheck:
|
65
|
-
runs-on: ubuntu-latest
|
82
|
+
runs-on: shopify-ubuntu-latest
|
66
83
|
container: ruby:2.7
|
67
84
|
steps:
|
68
85
|
- uses: actions/checkout@v2
|
@@ -72,8 +89,8 @@ jobs:
|
|
72
89
|
run: bin/srb tc
|
73
90
|
|
74
91
|
lint:
|
75
|
-
runs-on: ubuntu-latest
|
76
|
-
container: ruby:2
|
92
|
+
runs-on: shopify-ubuntu-latest
|
93
|
+
container: ruby:3.2
|
77
94
|
steps:
|
78
95
|
- uses: actions/checkout@v2
|
79
96
|
- name: Install dependencies
|
data/.rubocop.yml
CHANGED
data/README.md
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
[About this repo](#about-this-repo) | [Commands](#commands) | [How to use this repo](#how-to-use-this-repo) | [Contribute to this repo](#contribute-to-this-repo) | [License](#license)
|
6
6
|
|
7
7
|
## About this repo
|
8
|
-
**Introduction:**
|
8
|
+
**Introduction:**
|
9
9
|
|
10
10
|
`minitest-distributed` is a plugin for [minitest](https://github.com/seattlerb/minitest)
|
11
11
|
for executing tests on a distributed set of unreliable workers.
|
@@ -87,11 +87,11 @@ them to fail.
|
|
87
87
|
- `--worker-id=IDENTIFIER` or `ENV[MINITEST_WORKER_ID]`: The ID of the worker,
|
88
88
|
which should be unique to the cluster. We will default to a UUID if this is
|
89
89
|
not set, which generally is fine.
|
90
|
-
- `--exclude-file=PATH_TO_FILE`: Specify a file of tests to be excluded
|
91
|
-
from running. The file should include test identifiers seperated by
|
90
|
+
- `--exclude-file=PATH_TO_FILE`: Specify a file of tests to be excluded
|
91
|
+
from running. The file should include test identifiers seperated by
|
92
92
|
newlines.
|
93
93
|
- `--include-file=PATH_TO_FILE`: Specify a file of tests to be included in
|
94
|
-
the test run. The file should include test identifiers seperated by
|
94
|
+
the test run. The file should include test identifiers seperated by
|
95
95
|
newlines.
|
96
96
|
|
97
97
|
**Limitations**
|
@@ -124,7 +124,7 @@ To bootstrap a local development environment:
|
|
124
124
|
- Start a Redis server by running `redis-server`, assuming you have Redis
|
125
125
|
installed locally and the binary is on your `PATH`. Alternatively, you can
|
126
126
|
set the `REDIS_URL` environment variable to point to a Redis instance running
|
127
|
-
elsewhere.
|
127
|
+
elsewhere. You can also use `docker-compose up` with the provided `docker-compose.yml`.
|
128
128
|
- Now, run `bin/rake test` to run the tests, and verify everything is working.
|
129
129
|
- You can also run `bin/console` for an interactive prompt that will allow you
|
130
130
|
to experiment.
|
data/bin/rake
CHANGED
@@ -9,8 +9,10 @@
|
|
9
9
|
#
|
10
10
|
|
11
11
|
require "pathname"
|
12
|
-
ENV["BUNDLE_GEMFILE"] ||= File.expand_path(
|
13
|
-
|
12
|
+
ENV["BUNDLE_GEMFILE"] ||= File.expand_path(
|
13
|
+
"../../Gemfile",
|
14
|
+
Pathname.new(__FILE__).realpath,
|
15
|
+
)
|
14
16
|
|
15
17
|
bundle_binstub = File.expand_path("../bundle", __FILE__)
|
16
18
|
|
data/bin/rubocop
CHANGED
@@ -9,8 +9,10 @@
|
|
9
9
|
#
|
10
10
|
|
11
11
|
require "pathname"
|
12
|
-
ENV["BUNDLE_GEMFILE"] ||= File.expand_path(
|
13
|
-
|
12
|
+
ENV["BUNDLE_GEMFILE"] ||= File.expand_path(
|
13
|
+
"../../Gemfile",
|
14
|
+
Pathname.new(__FILE__).realpath,
|
15
|
+
)
|
14
16
|
|
15
17
|
bundle_binstub = File.expand_path("../bundle", __FILE__)
|
16
18
|
|
data/bin/srb
CHANGED
@@ -9,8 +9,10 @@
|
|
9
9
|
#
|
10
10
|
|
11
11
|
require "pathname"
|
12
|
-
ENV["BUNDLE_GEMFILE"] ||= File.expand_path(
|
13
|
-
|
12
|
+
ENV["BUNDLE_GEMFILE"] ||= File.expand_path(
|
13
|
+
"../../Gemfile",
|
14
|
+
Pathname.new(__FILE__).realpath,
|
15
|
+
)
|
14
16
|
|
15
17
|
bundle_binstub = File.expand_path("../bundle", __FILE__)
|
16
18
|
|
data/dev.yml
ADDED
data/docker-compose.yml
ADDED
@@ -83,9 +83,18 @@ module Minitest
|
|
83
83
|
sig { override.returns(ResultAggregate) }
|
84
84
|
def combined_results
|
85
85
|
@combined_results ||= begin
|
86
|
-
stats_as_string = redis.mget(
|
87
|
-
key("
|
88
|
-
key("
|
86
|
+
stats_as_string = redis.mget(
|
87
|
+
key("runs"),
|
88
|
+
key("assertions"),
|
89
|
+
key("passes"),
|
90
|
+
key("failures"),
|
91
|
+
key("errors"),
|
92
|
+
key("skips"),
|
93
|
+
key("requeues"),
|
94
|
+
key("discards"),
|
95
|
+
key("acks"),
|
96
|
+
key("size"),
|
97
|
+
)
|
89
98
|
|
90
99
|
ResultAggregate.new(
|
91
100
|
max_failures: configuration.max_failures,
|
@@ -279,8 +288,14 @@ module Minitest
|
|
279
288
|
|
280
289
|
sig { params(block: Integer).returns(T::Array[EnqueuedRunnable]) }
|
281
290
|
def claim_fresh_runnables(block:)
|
282
|
-
result = redis.xreadgroup(
|
283
|
-
|
291
|
+
result = redis.xreadgroup(
|
292
|
+
group_name,
|
293
|
+
configuration.worker_id,
|
294
|
+
stream_key,
|
295
|
+
">",
|
296
|
+
block: block,
|
297
|
+
count: configuration.test_batch_size,
|
298
|
+
)
|
284
299
|
EnqueuedRunnable.from_redis_stream_claim(result.fetch(stream_key, []), configuration: configuration)
|
285
300
|
end
|
286
301
|
|
@@ -293,8 +308,13 @@ module Minitest
|
|
293
308
|
def xclaim_messages(pending_messages, max_idle_time_ms:)
|
294
309
|
return [] if pending_messages.empty?
|
295
310
|
|
296
|
-
claimed = redis.xclaim(
|
297
|
-
|
311
|
+
claimed = redis.xclaim(
|
312
|
+
stream_key,
|
313
|
+
group_name,
|
314
|
+
configuration.worker_id,
|
315
|
+
max_idle_time_ms,
|
316
|
+
pending_messages.keys,
|
317
|
+
)
|
298
318
|
|
299
319
|
EnqueuedRunnable.from_redis_stream_claim(claimed, pending_messages, configuration: configuration)
|
300
320
|
end
|
@@ -421,10 +441,19 @@ module Minitest
|
|
421
441
|
pipeline.incrby(key("size"), results.size)
|
422
442
|
end
|
423
443
|
|
424
|
-
@combined_results = ResultAggregate.new(
|
425
|
-
|
426
|
-
|
427
|
-
|
444
|
+
@combined_results = ResultAggregate.new(
|
445
|
+
max_failures: configuration.max_failures,
|
446
|
+
runs: updated[0],
|
447
|
+
assertions: updated[1],
|
448
|
+
passes: updated[2],
|
449
|
+
failures: updated[3],
|
450
|
+
errors: updated[4],
|
451
|
+
skips: updated[5],
|
452
|
+
requeues: updated[6],
|
453
|
+
discards: updated[7],
|
454
|
+
acks: updated[8],
|
455
|
+
size: updated[9],
|
456
|
+
)
|
428
457
|
end
|
429
458
|
|
430
459
|
sig { params(name: String).returns(String) }
|
@@ -203,7 +203,7 @@ module Minitest
|
|
203
203
|
sig do
|
204
204
|
params(
|
205
205
|
initial_result: Minitest::Result,
|
206
|
-
block: T.proc.params(arg0: Minitest::Result).returns(EnqueuedRunnable::Result::Commit)
|
206
|
+
block: T.proc.params(arg0: Minitest::Result).returns(EnqueuedRunnable::Result::Commit),
|
207
207
|
).returns(EnqueuedRunnable::Result)
|
208
208
|
end
|
209
209
|
def commit_result(initial_result, &block)
|
@@ -78,11 +78,10 @@ module Minitest
|
|
78
78
|
def add_tests_to(testsuites, suite, results)
|
79
79
|
# TODO: make path relative to project root
|
80
80
|
relative_path = T.must(results.first).source_location.first
|
81
|
-
lineno = T.must(results.first).source_location.last
|
82
81
|
|
83
82
|
testsuite = testsuites.add_element(
|
84
83
|
"testsuite",
|
85
|
-
{ "name" => suite, "filepath" => relative_path }.merge(aggregate_suite_results(results))
|
84
|
+
{ "name" => suite, "filepath" => relative_path }.merge(aggregate_suite_results(results)),
|
86
85
|
)
|
87
86
|
|
88
87
|
results.each do |test|
|
@@ -93,6 +92,7 @@ module Minitest
|
|
93
92
|
"time" => test.time,
|
94
93
|
# 'run-command' => ... # TODO
|
95
94
|
}
|
95
|
+
lineno = test.source_location.last
|
96
96
|
attributes["lineno"] = lineno if lineno != -1
|
97
97
|
|
98
98
|
testcase_tag = testsuite.add_element("testcase", attributes)
|
@@ -107,9 +107,11 @@ module Minitest
|
|
107
107
|
# noop
|
108
108
|
when ResultType::Error, ResultType::Failed
|
109
109
|
failure = T.must(result.failure)
|
110
|
-
failure_tag = testcase.add_element(
|
110
|
+
failure_tag = testcase.add_element(
|
111
|
+
"failure",
|
111
112
|
"type" => result_type.serialize,
|
112
|
-
"message" => truncate_message(failure.message)
|
113
|
+
"message" => truncate_message(failure.message),
|
114
|
+
)
|
113
115
|
failure_tag.add_text(REXML::CData.new(result.to_s))
|
114
116
|
else
|
115
117
|
T.absurd(result_type)
|
@@ -27,7 +27,9 @@ module Minitest
|
|
27
27
|
"\n\nThe test took %0.3fs to run, longer than the test timeout which is configured to be %0.1fs.\n" \
|
28
28
|
"Another worker likely claimed ownership of this test, and will commit the result instead.\n" \
|
29
29
|
"For best results, make sure that all your tests finish within %0.1fs.",
|
30
|
-
result.time,
|
30
|
+
result.time,
|
31
|
+
test_timeout_seconds,
|
32
|
+
test_timeout_seconds,
|
31
33
|
)
|
32
34
|
end
|
33
35
|
|
@@ -8,10 +8,17 @@ module Minitest
|
|
8
8
|
extend T::Sig
|
9
9
|
|
10
10
|
def plugin_distributed_options(opts, options)
|
11
|
+
continuous_integration = ENV.fetch("CI", "false") == "true"
|
12
|
+
options[:disable_distributed] = !continuous_integration
|
13
|
+
|
11
14
|
opts.on("--disable-distributed", "Disable the distributed plugin") do
|
12
15
|
options[:disable_distributed] = true
|
13
16
|
end
|
14
17
|
|
18
|
+
opts.on("--enable-distributed", "Enable the distributed plugin") do
|
19
|
+
options[:disable_distributed] = false
|
20
|
+
end
|
21
|
+
|
15
22
|
options[:distributed] = Minitest::Distributed::Configuration.from_command_line_options(opts, options)
|
16
23
|
end
|
17
24
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: minitest-distributed
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Willem van Bergen
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2023-01-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: minitest
|
@@ -80,6 +80,7 @@ executables: []
|
|
80
80
|
extensions: []
|
81
81
|
extra_rdoc_files: []
|
82
82
|
files:
|
83
|
+
- ".github/ISSUE_TEMPLATE/bug_report.md"
|
83
84
|
- ".github/dependabot.yml"
|
84
85
|
- ".github/workflows/ruby.yml"
|
85
86
|
- ".gitignore"
|
@@ -96,6 +97,8 @@ files:
|
|
96
97
|
- bin/rubocop
|
97
98
|
- bin/setup
|
98
99
|
- bin/srb
|
100
|
+
- dev.yml
|
101
|
+
- docker-compose.yml
|
99
102
|
- lib/minitest/distributed.rb
|
100
103
|
- lib/minitest/distributed/configuration.rb
|
101
104
|
- lib/minitest/distributed/coordinators/coordinator_interface.rb
|