knapsack 0.0.3 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +12 -1
- data/CHANGELOG.md +11 -0
- data/LICENSE.txt +1 -1
- data/README.md +71 -24
- data/Rakefile +3 -1
- data/TODO.md +5 -0
- data/knapsack_report.json +9 -12
- data/lib/knapsack.rb +25 -6
- data/lib/knapsack/adapters/{base.rb → base_adapter.rb} +18 -8
- data/lib/knapsack/adapters/{rspec.rb → rspec_adapter.rb} +13 -6
- data/lib/knapsack/allocator.rb +65 -0
- data/lib/knapsack/distributors/base_distributor.rb +67 -0
- data/lib/knapsack/distributors/leftover_distributor.rb +49 -0
- data/lib/knapsack/distributors/report_distributor.rb +76 -0
- data/lib/knapsack/presenter.rb +38 -5
- data/lib/knapsack/report.rb +27 -12
- data/lib/knapsack/task_loader.rb +11 -0
- data/lib/knapsack/tracker.rb +30 -13
- data/lib/knapsack/version.rb +1 -1
- data/lib/tasks/knapsack.rake +21 -0
- data/spec/knapsack/adapters/base_adapter_spec.rb +91 -0
- data/spec/knapsack/adapters/rspec_adapter_spec.rb +29 -0
- data/spec/knapsack/allocator_spec.rb +57 -0
- data/spec/knapsack/distributors/base_distributor_spec.rb +85 -0
- data/spec/knapsack/distributors/leftover_distributor_spec.rb +110 -0
- data/spec/knapsack/distributors/report_distributor_spec.rb +152 -0
- data/spec/knapsack/presenter_spec.rb +83 -0
- data/spec/knapsack/report_spec.rb +73 -0
- data/spec/knapsack/task_loader_spec.rb +10 -0
- data/spec/knapsack/tracker_spec.rb +84 -20
- data/spec/knapsack_spec.rb +23 -2
- data/spec/spec_helper.rb +16 -0
- data/spec_examples/fast/1_spec.rb +1 -4
- data/spec_examples/fast/2_spec.rb +1 -4
- data/spec_examples/fast/3_spec.rb +1 -4
- data/spec_examples/fast/4_spec.rb +1 -4
- data/spec_examples/fast/5_spec.rb +1 -4
- data/spec_examples/fast/6_spec.rb +1 -4
- data/spec_examples/leftover/1_spec.rb +4 -0
- data/spec_examples/leftover/a_spec.rb +8 -0
- data/spec_examples/slow/a_spec.rb +1 -3
- data/spec_examples/slow/b_spec.rb +3 -5
- data/spec_examples/slow/c_spec.rb +1 -3
- data/spec_examples/spec_helper.rb +5 -2
- metadata +32 -7
- data/spec_examples/slow/d_spec.rb +0 -7
- data/spec_examples/slow/e_spec.rb +0 -7
- data/spec_examples/slow/f_spec.rb +0 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 987e3a066be096679bd6378e1423d23b4235c9cf
|
4
|
+
data.tar.gz: 082b1df779eaf2db8f18f4dc4afb1c02539fda1d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: aab5c000855a105e7b9691fa38390ce242eb768d59f8b5ff62eebba1e9fa015b8880015ab53cf70b1fb22f8f611deff7c594ad748952e883f12da4db88dfdfe7
|
7
|
+
data.tar.gz: 578b23a46f3e0d4f268d0a9761d9f1d40eb3104c041a6dd8130ab3bb39d8d566674598474e7ef124b19ebc4aaaa8f048e8d36cb15f26c437f4062caaf001b847
|
data/.travis.yml
CHANGED
@@ -13,9 +13,20 @@ before_install:
|
|
13
13
|
- "echo 'gem: --no-ri --no-rdoc' > ~/.gemrc"
|
14
14
|
script:
|
15
15
|
- bundle exec rspec spec
|
16
|
+
|
16
17
|
# generate knapsack report
|
17
|
-
- KNAPSACK_GENERATE_REPORT=true bundle exec rspec --default-path spec_examples
|
18
|
+
- KNAPSACK_GENERATE_REPORT=true bundle exec rspec --default-path spec_examples --tag focus
|
19
|
+
|
18
20
|
# run specs with enabled time offset warning
|
19
21
|
- bundle exec rspec --default-path spec_examples
|
22
|
+
|
23
|
+
# run rake task for the first CI node
|
24
|
+
- CI_NODE_TOTAL=2 CI_NODE_INDEX=0 KNAPSACK_SPEC_PATTERN="spec_examples/**/*_spec.rb" bundle exec rake knapsack:rspec
|
25
|
+
# run rake task for the second CI node
|
26
|
+
- CI_NODE_TOTAL=2 CI_NODE_INDEX=1 KNAPSACK_SPEC_PATTERN="spec_examples/**/*_spec.rb" bundle exec rake knapsack:rspec
|
27
|
+
|
28
|
+
# run specs for custom knapsack report path
|
29
|
+
- cp knapsack_report.json custom_knapsack_report.json
|
30
|
+
- KNAPSACK_SPEC_PATTERN="spec_examples/**/*_spec.rb" KNAPSACK_REPORT_PATH="custom_knapsack_report.json" bundle exec rake knapsack:rspec
|
20
31
|
notifications:
|
21
32
|
email: false
|
data/CHANGELOG.md
ADDED
data/LICENSE.txt
CHANGED
data/README.md
CHANGED
@@ -1,18 +1,20 @@
|
|
1
1
|
# Knapsack
|
2
2
|
|
3
|
-
[![
|
4
|
-
[![
|
3
|
+
[![Gem Version](https://badge.fury.io/rb/knapsack.png)][gem_version]
|
4
|
+
[![Build Status](https://travis-ci.org/ArturT/knapsack.svg?branch=master)][travis]
|
5
|
+
[![Code Climate](https://codeclimate.com/github/ArturT/knapsack.png)][codeclimate]
|
5
6
|
[![Coverage Status](https://codeclimate.com/github/ArturT/knapsack/coverage.png)][coverage]
|
6
7
|
|
8
|
+
[gem_version]: https://rubygems.org/gems/knapsack
|
7
9
|
[travis]: http://travis-ci.org/ArturT/knapsack
|
8
10
|
[codeclimate]: https://codeclimate.com/github/ArturT/knapsack
|
9
11
|
[coverage]: https://codeclimate.com/github/ArturT/knapsack
|
10
12
|
|
11
|
-
Parallel specs across CI server nodes based on each spec file's time execution.
|
13
|
+
Parallel specs across CI server nodes based on each spec file's time execution. It generates spec time execution report and uses it for further test runs.
|
12
14
|
|
13
15
|
## Installation
|
14
16
|
|
15
|
-
Add this line to your application's Gemfile:
|
17
|
+
Add this line to your application's Gemfile in test group:
|
16
18
|
|
17
19
|
gem 'knapsack'
|
18
20
|
|
@@ -20,35 +22,66 @@ And then execute:
|
|
20
22
|
|
21
23
|
$ bundle
|
22
24
|
|
23
|
-
Or install it yourself as:
|
24
|
-
|
25
|
-
$ gem install knapsack
|
26
|
-
|
27
25
|
## Usage
|
28
26
|
|
29
27
|
Add at the beginning of your `spec_helper.rb`:
|
30
28
|
|
31
29
|
require 'knapsack'
|
32
|
-
|
30
|
+
|
31
|
+
# default configuration, you can change it or omit completely
|
33
32
|
Knapsack.tracker.config({
|
34
33
|
enable_time_offset_warning: true,
|
35
|
-
|
34
|
+
time_offset_in_seconds: 30
|
35
|
+
})
|
36
|
+
|
37
|
+
# default configuration for report, you can change it or omit completely
|
38
|
+
Knapsack.report.config({
|
39
|
+
report_path: 'knapsack_report.json'
|
36
40
|
})
|
37
|
-
|
41
|
+
|
42
|
+
Knapsack::Adapters::RspecAdapter.bind
|
43
|
+
|
44
|
+
Add in your `Rakefile` this lines:
|
45
|
+
|
46
|
+
require 'knapsack'
|
47
|
+
Knapsack.load_tasks
|
38
48
|
|
39
49
|
Generate time execution report for your spec files.
|
40
50
|
|
41
|
-
$ KNAPSACK_GENERATE_REPORT=true rspec spec
|
51
|
+
$ KNAPSACK_GENERATE_REPORT=true bundle exec rspec spec
|
42
52
|
|
43
53
|
Commit generated report `knapsack_report.json` into your repository.
|
44
54
|
|
45
|
-
##
|
55
|
+
## Setup your CI server
|
46
56
|
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
57
|
+
On your CI server run this command for the first CI node. Update `CI_NODE_INDEX` for the next one.
|
58
|
+
|
59
|
+
$ CI_NODE_TOTAL=2 CI_NODE_INDEX=0 bundle exec rake knapsack:rspec
|
60
|
+
|
61
|
+
You can add `KNAPSACK_SPEC_PATTERN` if your specs are not in `spec` directory. For instance:
|
62
|
+
|
63
|
+
$ KNAPSACK_SPEC_PATTERN="directory_with_specs/**/*_spec.rb" CI_NODE_TOTAL=2 CI_NODE_INDEX=0 bundle exec rake knapsack:rspec
|
64
|
+
|
65
|
+
You can set `KNAPSACK_REPORT_PATH` if your knapsack report was saved in non default location. Example:
|
66
|
+
|
67
|
+
$ KNAPSACK_REPORT_PATH="custom_knapsack_report.json" CI_NODE_TOTAL=2 CI_NODE_INDEX=0 bundle exec rake knapsack:rspec
|
68
|
+
|
69
|
+
### Info about ENV variables
|
70
|
+
|
71
|
+
`CI_NODE_TOTAL` - total number CI nodes you have.
|
72
|
+
|
73
|
+
`CI_NODE_INDEX` - index of current CI node starts from 0. Second CI node should have `CI_NODE_INDEX=1`.
|
74
|
+
|
75
|
+
### Info for CircleCI users
|
76
|
+
|
77
|
+
If you are using circleci.com you can omit `CI_NODE_TOTAL` and `CI_NODE_INDEX`. Knapsack will use `CIRCLE_NODE_TOTAL` and `CIRCLE_NODE_INDEX` provided by CircleCI.
|
78
|
+
|
79
|
+
Here is example for test configuration in your `circleci.yml` file.
|
80
|
+
|
81
|
+
test:
|
82
|
+
override:
|
83
|
+
- bundle exec rake knapsack:rspec
|
84
|
+
parallel: true
|
52
85
|
|
53
86
|
## Tests
|
54
87
|
|
@@ -56,16 +89,30 @@ Commit generated report `knapsack_report.json` into your repository.
|
|
56
89
|
|
57
90
|
To run specs for Knapsack gem type:
|
58
91
|
|
59
|
-
$ rspec spec
|
92
|
+
$ bundle exec rspec spec
|
60
93
|
|
61
94
|
### Spec examples
|
62
95
|
|
63
|
-
Directory `spec_examples` contains examples of fast and slow specs. There is a `spec_helper.rb` with binded Knapsack.
|
96
|
+
Directory `spec_examples` contains examples of fast and slow specs. There is a `spec_example/spec_helper.rb` with binded Knapsack.
|
97
|
+
|
98
|
+
To generate a new knapsack report for specs with `focus` tag (only specs in `spec_examples/leftover` directory have no `focus` tag), please type:
|
64
99
|
|
65
|
-
|
100
|
+
$ KNAPSACK_GENERATE_REPORT=true bundle exec rspec --default-path spec_examples --tag focus
|
66
101
|
|
67
|
-
|
102
|
+
**Warning:** Current `knapsack_report.json` file was generated for `spec_examples` except `spec_examples/leftover` directory. Just for testing reason to see how leftover specs will be distribute in a dumb way across CI nodes.
|
68
103
|
|
69
|
-
To
|
104
|
+
To see specs distributed for the first CI node type:
|
70
105
|
|
71
|
-
$
|
106
|
+
$ CI_NODE_TOTAL=2 CI_NODE_INDEX=0 KNAPSACK_SPEC_PATTERN="spec_examples/**/*_spec.rb" bundle exec rake knapsack:rspec
|
107
|
+
|
108
|
+
Specs in `spec_examples/leftover` take more than 3 seconds. This should cause a Knapsack time offset warning because we set `time_offset_in_seconds` to 3 in `spec_examples/spec_helper.rb`. Type below to see warning:
|
109
|
+
|
110
|
+
$ bundle exec rspec --default-path spec_examples
|
111
|
+
|
112
|
+
## Contributing
|
113
|
+
|
114
|
+
1. Fork it ( https://github.com/ArturT/knapsack/fork )
|
115
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
116
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
117
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
118
|
+
5. Create a new Pull Request
|
data/Rakefile
CHANGED
data/TODO.md
ADDED
data/knapsack_report.json
CHANGED
@@ -1,14 +1,11 @@
|
|
1
1
|
{
|
2
|
-
"
|
3
|
-
"
|
4
|
-
"
|
5
|
-
"
|
6
|
-
"
|
7
|
-
"
|
8
|
-
"
|
9
|
-
"
|
10
|
-
"
|
11
|
-
"./spec_examples/slow/d_spec.rb": 4.001989841461182,
|
12
|
-
"./spec_examples/slow/e_spec.rb": 2.4013099670410156,
|
13
|
-
"./spec_examples/slow/f_spec.rb": 0.60198974609375
|
2
|
+
"spec_examples/fast/6_spec.rb": 6.628036499023438e-05,
|
3
|
+
"spec_examples/fast/3_spec.rb": 2.8133392333984375e-05,
|
4
|
+
"spec_examples/fast/2_spec.rb": 2.002716064453125e-05,
|
5
|
+
"spec_examples/fast/1_spec.rb": 1.0013580322265625e-05,
|
6
|
+
"spec_examples/fast/5_spec.rb": 7.867813110351562e-05,
|
7
|
+
"spec_examples/slow/b_spec.rb": 0.9035449028015137,
|
8
|
+
"spec_examples/fast/4_spec.rb": 6.842613220214844e-05,
|
9
|
+
"spec_examples/slow/a_spec.rb": 1.6037836074829102,
|
10
|
+
"spec_examples/slow/c_spec.rb": 1.0028371810913086
|
14
11
|
}
|
data/lib/knapsack.rb
CHANGED
@@ -1,14 +1,33 @@
|
|
1
|
-
require '
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
1
|
+
require 'singleton'
|
2
|
+
require_relative 'knapsack/version'
|
3
|
+
require_relative 'knapsack/tracker'
|
4
|
+
require_relative 'knapsack/presenter'
|
5
|
+
require_relative 'knapsack/report'
|
6
|
+
require_relative 'knapsack/allocator'
|
7
|
+
require_relative 'knapsack/task_loader'
|
8
|
+
require_relative 'knapsack/distributors/base_distributor'
|
9
|
+
require_relative 'knapsack/distributors/report_distributor'
|
10
|
+
require_relative 'knapsack/distributors/leftover_distributor'
|
11
|
+
require_relative 'knapsack/adapters/base_adapter'
|
12
|
+
require_relative 'knapsack/adapters/rspec_adapter'
|
7
13
|
|
8
14
|
module Knapsack
|
9
15
|
class << self
|
10
16
|
def tracker
|
11
17
|
Knapsack::Tracker.instance
|
12
18
|
end
|
19
|
+
|
20
|
+
def report
|
21
|
+
Knapsack::Report.instance
|
22
|
+
end
|
23
|
+
|
24
|
+
def root
|
25
|
+
File.expand_path '../..', __FILE__
|
26
|
+
end
|
27
|
+
|
28
|
+
def load_tasks
|
29
|
+
task_loader = Knapsack::TaskLoader.new
|
30
|
+
task_loader.load_tasks
|
31
|
+
end
|
13
32
|
end
|
14
33
|
end
|
@@ -1,21 +1,21 @@
|
|
1
1
|
module Knapsack
|
2
2
|
module Adapters
|
3
|
-
class
|
3
|
+
class BaseAdapter
|
4
4
|
def self.bind
|
5
|
-
new
|
5
|
+
adapter = new
|
6
|
+
adapter.bind
|
7
|
+
adapter
|
6
8
|
end
|
7
9
|
|
8
|
-
|
9
|
-
|
10
|
-
def initialize
|
11
|
-
if Knapsack.tracker.generate_report?
|
10
|
+
def bind
|
11
|
+
if tracker.config[:generate_report]
|
12
12
|
puts 'Knapsack report generator started!'
|
13
13
|
bind_time_tracker
|
14
14
|
bind_report_generator
|
15
|
-
elsif
|
15
|
+
elsif tracker.config[:enable_time_offset_warning]
|
16
16
|
puts 'Knapsack time offset warning enabled!'
|
17
17
|
bind_time_tracker
|
18
|
-
|
18
|
+
bind_time_offset_warning
|
19
19
|
else
|
20
20
|
puts 'Knapsack is off!'
|
21
21
|
end
|
@@ -28,6 +28,16 @@ module Knapsack
|
|
28
28
|
def bind_report_generator
|
29
29
|
raise NotImplementedError
|
30
30
|
end
|
31
|
+
|
32
|
+
def bind_time_offset_warning
|
33
|
+
raise NotImplementedError
|
34
|
+
end
|
35
|
+
|
36
|
+
protected
|
37
|
+
|
38
|
+
def tracker
|
39
|
+
Knapsack.tracker
|
40
|
+
end
|
31
41
|
end
|
32
42
|
end
|
33
43
|
end
|
@@ -1,12 +1,10 @@
|
|
1
1
|
module Knapsack
|
2
2
|
module Adapters
|
3
|
-
class
|
4
|
-
protected
|
5
|
-
|
3
|
+
class RspecAdapter < BaseAdapter
|
6
4
|
def bind_time_tracker
|
7
5
|
::RSpec.configure do |config|
|
8
6
|
config.before(:each) do
|
9
|
-
Knapsack.tracker.spec_path =
|
7
|
+
Knapsack.tracker.spec_path = RspecAdapter.spec_path
|
10
8
|
Knapsack.tracker.start_timer
|
11
9
|
end
|
12
10
|
|
@@ -15,7 +13,6 @@ module Knapsack
|
|
15
13
|
end
|
16
14
|
|
17
15
|
config.after(:suite) do
|
18
|
-
puts
|
19
16
|
puts Presenter.global_time
|
20
17
|
end
|
21
18
|
end
|
@@ -24,12 +21,22 @@ module Knapsack
|
|
24
21
|
def bind_report_generator
|
25
22
|
::RSpec.configure do |config|
|
26
23
|
config.after(:suite) do
|
27
|
-
|
24
|
+
Knapsack.report.save
|
28
25
|
puts Presenter.report_details
|
29
26
|
end
|
30
27
|
end
|
31
28
|
end
|
32
29
|
|
30
|
+
def bind_time_offset_warning
|
31
|
+
::RSpec.configure do |config|
|
32
|
+
config.after(:suite) do
|
33
|
+
puts Presenter.time_offset_warning
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
protected
|
39
|
+
|
33
40
|
def self.spec_path
|
34
41
|
::RSpec.current_example.metadata[:example_group][:file_path]
|
35
42
|
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
module Knapsack
|
2
|
+
class Allocator
|
3
|
+
def initialize(args={})
|
4
|
+
@config = default_args.merge(args)
|
5
|
+
@report_distributor = Knapsack::Distributors::ReportDistributor.new(@config)
|
6
|
+
@leftover_distributor = Knapsack::Distributors::LeftoverDistributor.new(@config)
|
7
|
+
end
|
8
|
+
|
9
|
+
def report_node_specs
|
10
|
+
@report_node_specs ||= @report_distributor.specs_for_current_node
|
11
|
+
end
|
12
|
+
|
13
|
+
def leftover_node_specs
|
14
|
+
@leftover_node_specs ||= @leftover_distributor.specs_for_current_node
|
15
|
+
end
|
16
|
+
|
17
|
+
def node_specs
|
18
|
+
@node_specs ||= report_node_specs + leftover_node_specs
|
19
|
+
end
|
20
|
+
|
21
|
+
def stringify_node_specs
|
22
|
+
node_specs.join(' ')
|
23
|
+
end
|
24
|
+
|
25
|
+
def custom_spec_dir
|
26
|
+
return unless @config[:spec_pattern]
|
27
|
+
@config[:spec_pattern].gsub(/^(.*?)\//).first
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
def default_args
|
33
|
+
{
|
34
|
+
ci_node_total: env_ci_node_total,
|
35
|
+
ci_node_index: env_ci_node_index,
|
36
|
+
spec_pattern: env_spec_pattern,
|
37
|
+
report: report
|
38
|
+
}
|
39
|
+
end
|
40
|
+
|
41
|
+
def env_ci_node_total
|
42
|
+
ENV['CI_NODE_TOTAL'] || ENV['CIRCLE_NODE_TOTAL']
|
43
|
+
end
|
44
|
+
|
45
|
+
def env_ci_node_index
|
46
|
+
ENV['CI_NODE_INDEX'] || ENV['CIRCLE_NODE_INDEX']
|
47
|
+
end
|
48
|
+
|
49
|
+
def env_spec_pattern
|
50
|
+
ENV['KNAPSACK_SPEC_PATTERN']
|
51
|
+
end
|
52
|
+
|
53
|
+
def env_report_path
|
54
|
+
ENV['KNAPSACK_REPORT_PATH']
|
55
|
+
end
|
56
|
+
|
57
|
+
def report
|
58
|
+
return unless env_report_path
|
59
|
+
Knapsack.report.config({
|
60
|
+
report_path: env_report_path
|
61
|
+
})
|
62
|
+
Knapsack.report.open
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
module Knapsack
|
2
|
+
module Distributors
|
3
|
+
class BaseDistributor
|
4
|
+
attr_reader :report, :node_specs
|
5
|
+
|
6
|
+
DEFAULT_CI_NODE_TOTAL = 1
|
7
|
+
DEFAULT_CI_NODE_INDEX = 0
|
8
|
+
|
9
|
+
def initialize(args={})
|
10
|
+
@report = args[:report] || default_report
|
11
|
+
@ci_node_total = args[:ci_node_total] || DEFAULT_CI_NODE_TOTAL
|
12
|
+
@ci_node_index = args[:ci_node_index] || DEFAULT_CI_NODE_INDEX
|
13
|
+
post_initialize(args)
|
14
|
+
end
|
15
|
+
|
16
|
+
def default_report
|
17
|
+
Knapsack.report.open
|
18
|
+
end
|
19
|
+
|
20
|
+
def ci_node_total
|
21
|
+
@ci_node_total.to_i
|
22
|
+
end
|
23
|
+
|
24
|
+
def ci_node_index
|
25
|
+
@ci_node_index.to_i
|
26
|
+
end
|
27
|
+
|
28
|
+
def specs_for_current_node
|
29
|
+
specs_for_node(ci_node_index)
|
30
|
+
end
|
31
|
+
|
32
|
+
def specs_for_node(node_index)
|
33
|
+
assign_spec_files_to_node
|
34
|
+
post_specs_for_node(node_index)
|
35
|
+
end
|
36
|
+
|
37
|
+
def assign_spec_files_to_node
|
38
|
+
default_node_specs
|
39
|
+
@node_index = 0
|
40
|
+
post_assign_spec_files_to_node
|
41
|
+
end
|
42
|
+
|
43
|
+
protected
|
44
|
+
|
45
|
+
def post_initialize(args)
|
46
|
+
nil
|
47
|
+
end
|
48
|
+
|
49
|
+
def post_specs_for_node(node_index)
|
50
|
+
raise NotImplementedError
|
51
|
+
end
|
52
|
+
|
53
|
+
def post_assign_spec_files_to_node
|
54
|
+
raise NotImplementedError
|
55
|
+
end
|
56
|
+
|
57
|
+
def default_node_specs
|
58
|
+
raise NotImplementedError
|
59
|
+
end
|
60
|
+
|
61
|
+
def update_node_index
|
62
|
+
@node_index += 1
|
63
|
+
@node_index = 0 if @node_index == ci_node_total
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|