Skip to content

Commit 9690fd9

Browse files
committed
support for manual setting the timing key that will be updated
1 parent 78f4d58 commit 9690fd9

5 files changed

Lines changed: 41 additions & 5 deletions

File tree

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ OPTIONS:
6969
--redis-host HOST Redis host to connect to (default: 127.0.0.1).
7070
--redis-url URL Redis URL to connect to (e.g.: redis://127.0.0.1:6379/0).
7171
--update-timings Update the global job timings key with the timings of this build. Note: This key is used as the basis for job scheduling.
72+
--timings-key KEY Update KEY instead of the default global timings key.
7273
--file-split-threshold N Split spec files slower than N seconds and schedule them as individual examples.
7374
--early-push-max-jobs N Only emit up to N jobs early
7475
--graceful-shutdown-signal Graceful shutdown worker on signal.
@@ -100,6 +101,7 @@ $ RSPECQ_BUILD=123 RSPECQ_WORKER=foo1 rspecq spec/
100101
| `RSPECQ_SEED` | RSpec seed |
101102
| `RSPECQ_REDIS` | Redis HOST |
102103
| `RSPECQ_UPDATE_TIMINGS` | Timings |
104+
| `RSPECQ_TIMINGS_KEY` | Timings key to update (reporter only) |
103105
| `RSPECQ_FILE_SPLIT_THRESHOLD` | File split threshold |
104106
| `RSPECQ_EARLY_PUSH_MAX_JOBS` | Push jobs early up to a certain number |
105107
| `RSPECQ_GRACEFUL_SHUTDOWN_SIGNAL` | Graceful worker shutdown signal |

bin/rspecq

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,10 @@ OptionParser.new do |o|
7070
opts[:update_timings] = v
7171
end
7272

73+
o.on("--timings-key KEY", "Update KEY instead of the default global job timings key.") do |v|
74+
opts[:timings_key] = v
75+
end
76+
7377
o.on("--file-split-threshold N", Integer, "Split spec files slower than N " \
7478
"seconds and schedule them as individual examples.") do |v|
7579
opts[:file_split_threshold] = v
@@ -147,6 +151,7 @@ opts[:worker] ||= ENV.fetch("RSPECQ_WORKER", nil)
147151
opts[:seed] ||= ENV.fetch("RSPECQ_SEED", nil)
148152
opts[:redis_host] ||= ENV["RSPECQ_REDIS"] || DEFAULT_REDIS_HOST
149153
opts[:update_timings] ||= env_set?("RSPECQ_UPDATE_TIMINGS")
154+
opts[:timings_key] ||= ENV.fetch("RSPECQ_TIMINGS_KEY", nil)
150155
opts[:file_split_threshold] ||= Integer(ENV["RSPECQ_FILE_SPLIT_THRESHOLD"] || 9_999_999)
151156
opts[:early_push_max_jobs] ||= Integer(ENV["RSPECQ_EARLY_PUSH_MAX_JOBS"]) if ENV["RSPECQ_EARLY_PUSH_MAX_JOBS"]
152157
opts[:graceful_shutdown_signal] ||= ENV.fetch("RSPECQ_GRACEFUL_SHUTDOWN_SIGNAL", DEFAULT_GRACEFUL_SHUTDOWN_SIGNAL)
@@ -181,6 +186,7 @@ if opts[:report]
181186
timeout: opts[:report_timeout],
182187
redis_opts: redis_opts,
183188
update_timings: opts[:update_timings],
189+
timings_key: opts[:timings_key],
184190
queue_wait_timeout: opts[:queue_wait_timeout]
185191
)
186192

lib/rspecq/queue.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -239,8 +239,8 @@ def record_build_timing(job, duration)
239239

240240
# Persist build timings to the global timings key, so that they can be
241241
# used for scheduling future builds.
242-
def update_global_timings
243-
@redis.copy(key_build_timings, key_timings, replace: true)
242+
def update_global_timings(dst = key_timings)
243+
@redis.copy(key_build_timings, dst, replace: true)
244244
end
245245

246246
def record_build_time(duration)

lib/rspecq/reporter.rb

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,16 @@ class Reporter
1414
# Defaults to false
1515
attr_accessor :update_timings
1616

17-
def initialize(build_id:, timeout:, redis_opts:, queue_wait_timeout: 30, update_timings: false)
17+
def initialize(build_id:, timeout:, redis_opts:,
18+
queue_wait_timeout: 30,
19+
update_timings: false,
20+
timings_key: nil)
1821
@build_id = build_id
1922
@timeout = timeout
2023
@queue = Queue.new(build_id, "reporter", redis_opts)
2124
@queue_wait_timeout = queue_wait_timeout
2225
@update_timings = update_timings
26+
@timings_key = timings_key
2327

2428
# We want feedback to be immediattely printed to CI users, so
2529
# we disable buffering.
@@ -62,8 +66,13 @@ def report
6266
@queue.record_build_time(build_duration) if build_duration
6367

6468
if update_timings && @queue.build_successful?
65-
puts "Updating global job timings"
66-
@queue.update_global_timings
69+
if @timings_key
70+
puts "Updating job timings @ #{@timings_key}"
71+
@queue.update_global_timings(@timings_key)
72+
else
73+
puts "Updating global job timings"
74+
@queue.update_global_timings
75+
end
6776
end
6877

6978
flaky_jobs = @queue.flaky_jobs

test/test_e2e.rb

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,25 @@ def test_build_timings_update
9191
], queue.build_timings.sort_by { |_, v| v }.map(&:first)
9292
end
9393

94+
def test_global_timings_update_different_key
95+
queue = exec_build("timings")
96+
97+
custom_key = "timings-#{rand_id}"
98+
exec_reporter("--update-timings --timings-key=#{custom_key}", build_id: queue.build_id)
99+
100+
assert queue.build_successful?
101+
102+
redis = Redis.new(REDIS_OPTS)
103+
assert_equal [
104+
"./spec/very_fast_spec.rb",
105+
"./spec/fast_spec.rb",
106+
"./spec/medium_spec.rb",
107+
"./spec/slow_spec.rb",
108+
"./spec/very_slow_spec.rb",
109+
], redis.zrevrange(custom_key, 0, -1, withscores: true).to_h
110+
.sort_by { |_, v| v }.map(&:first)
111+
end
112+
94113
def test_global_timings_update
95114
queue = exec_build("timings")
96115
exec_reporter("--update-timings", build_id: queue.build_id)

0 commit comments

Comments
 (0)