capistrano_multiconfig_parallel 0.15.3 → 0.15.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Rakefile +3 -3
- data/capistrano_multiconfig_parallel.gemspec +1 -1
- data/lib/capistrano_multiconfig_parallel/base.rb +3 -3
- data/lib/capistrano_multiconfig_parallel/celluloid/celluloid_worker.rb +7 -19
- data/lib/capistrano_multiconfig_parallel/celluloid/child_process.rb +4 -9
- data/lib/capistrano_multiconfig_parallel/celluloid/rake_worker.rb +3 -2
- data/lib/capistrano_multiconfig_parallel/celluloid/terminal_table.rb +8 -9
- data/lib/capistrano_multiconfig_parallel/configuration.rb +23 -12
- data/lib/capistrano_multiconfig_parallel/helper.rb +3 -4
- data/lib/capistrano_multiconfig_parallel/version.rb +1 -1
- metadata +6 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b6cd09cc8132c08c2d8ae96463ddebaf9262f296
|
4
|
+
data.tar.gz: 8b2521b82d898dd019ed65db627b9c4e068b5181
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8b99f2a7c3dc0fbf602b816d8d59c37800ee19ed9c153209afc05887c88ac13d3cfb0d61fec4ad9cfbda34898b05bd53911923e1e9fee92a5cb0f5f33b8a2285
|
7
|
+
data.tar.gz: bc29a225e6eef5b902d66e030e342b3be7486c5a988dcc62354870f5d69b717c0c74c0e05a8a866b8c56052dded9ae3374498b2fc211dec5edd114fbf4daa0b8
|
data/Rakefile
CHANGED
@@ -45,12 +45,12 @@ task default: [:all]
|
|
45
45
|
desc 'Test the plugin under all supported Rails versions.'
|
46
46
|
task :all do |_t|
|
47
47
|
if ENV['TRAVIS']
|
48
|
-
exec(' bundle exec
|
48
|
+
exec(' bundle exec rubocop . && bundle exec reek . && bundle exec rake spec && bundle exec rake coveralls:push')
|
49
49
|
else
|
50
|
-
exec('bundle exec rubocop -a . && bundle exec
|
50
|
+
exec('bundle exec rubocop -a . && bundle exec rubocop . && bundle exec reek . && bundle exec rake spec')
|
51
51
|
end
|
52
52
|
end
|
53
53
|
|
54
54
|
task :docs do
|
55
|
-
exec('
|
55
|
+
exec('bundle exec rubocop -a . && bundle exec rubocop . && bundle exec reek . && bundle exec inch --pedantic && bundle exec yard')
|
56
56
|
end
|
@@ -41,7 +41,7 @@ Gem::Specification.new do |s|
|
|
41
41
|
s.add_development_dependency 'rvm-tester', '~> 1.1', '>= 1.1'
|
42
42
|
|
43
43
|
s.add_development_dependency 'rubocop', '~> 0.33', '>= 0.33'
|
44
|
-
s.add_development_dependency '
|
44
|
+
s.add_development_dependency 'reek', '~> 3.7', '>= 3.7'
|
45
45
|
s.add_development_dependency 'yard', '~> 0.8', '>= 0.8.7'
|
46
46
|
s.add_development_dependency 'yard-rspec', '~> 0.1', '>= 0.1'
|
47
47
|
s.add_development_dependency 'redcarpet', '~> 3.3', '>= 3.3'
|
@@ -76,9 +76,9 @@ module CapistranoMulticonfigParallel
|
|
76
76
|
err_backtrace = message.respond_to?(:backtrace) ? message.backtrace.join("\n\n") : ''
|
77
77
|
if err_backtrace.present?
|
78
78
|
logger.debug(
|
79
|
-
|
80
|
-
|
81
|
-
|
79
|
+
class_name: message.class,
|
80
|
+
message: error_message,
|
81
|
+
backtrace: err_backtrace
|
82
82
|
)
|
83
83
|
else
|
84
84
|
logger.debug(message)
|
@@ -22,15 +22,14 @@ module CapistranoMulticonfigParallel
|
|
22
22
|
include Celluloid::Logger
|
23
23
|
class TaskFailed < StandardError; end
|
24
24
|
|
25
|
-
attr_accessor :job, :manager, :job_id, :app_name, :env_name, :action_name, :env_options, :machine, :client, :task_argv,
|
25
|
+
attr_accessor :job, :manager, :job_id, :app_name, :env_name, :action_name, :env_options, :machine, :client, :task_argv,
|
26
26
|
:rake_tasks, :current_task_number, # tracking tasks
|
27
27
|
:successfull_subscription, :subscription_channel, :publisher_channel, # for subscriptions and publishing events
|
28
|
-
:job_termination_condition, :worker_state, :
|
28
|
+
:job_termination_condition, :worker_state, :invocation_chain
|
29
29
|
|
30
30
|
def work(job, manager)
|
31
31
|
@job = job
|
32
32
|
@worker_state = 'started'
|
33
|
-
@executing_dry_run = nil
|
34
33
|
@manager = manager
|
35
34
|
@job_confirmation_conditions = []
|
36
35
|
process_job(job) if job.present?
|
@@ -76,8 +75,8 @@ module CapistranoMulticonfigParallel
|
|
76
75
|
@rake_tasks ||= []
|
77
76
|
end
|
78
77
|
|
79
|
-
def
|
80
|
-
@
|
78
|
+
def invocation_chain
|
79
|
+
@invocation_chain ||= []
|
81
80
|
end
|
82
81
|
|
83
82
|
def cd_working_directory
|
@@ -91,7 +90,6 @@ module CapistranoMulticonfigParallel
|
|
91
90
|
end
|
92
91
|
|
93
92
|
def execute_deploy
|
94
|
-
@execute_deploy = true
|
95
93
|
debug("invocation chain #{@job_id} is : #{@rake_tasks.inspect}") if debug_enabled?
|
96
94
|
check_child_proces
|
97
95
|
setup_task_arguments
|
@@ -115,13 +113,11 @@ module CapistranoMulticonfigParallel
|
|
115
113
|
end
|
116
114
|
|
117
115
|
def check_gitflow
|
118
|
-
return if
|
116
|
+
return if @env_name != 'staging' || !@manager.can_tag_staging? || !executed_task?(CapistranoMulticonfigParallel::GITFLOW_TAG_STAGING_TASK)
|
119
117
|
@manager.dispatch_new_job(@job.merge('env' => 'production'))
|
120
118
|
end
|
121
119
|
|
122
120
|
def handle_subscription(message)
|
123
|
-
@executing_dry_run = message['action'] == 'count' ? true : false
|
124
|
-
@manager.jobs[@job_id]['job_argv'] = @job_argv
|
125
121
|
if message_is_about_a_task?(message)
|
126
122
|
check_gitflow
|
127
123
|
save_tasks_to_be_executed(message)
|
@@ -162,7 +158,7 @@ module CapistranoMulticonfigParallel
|
|
162
158
|
def save_tasks_to_be_executed(message)
|
163
159
|
debug("worler #{@job_id} current invocation chain : #{rake_tasks.inspect}") if debug_enabled?
|
164
160
|
rake_tasks << message['task'] if rake_tasks.last != message['task']
|
165
|
-
|
161
|
+
invocation_chain << message['task'] if invocation_chain.last != message['task']
|
166
162
|
end
|
167
163
|
|
168
164
|
def update_machine_state(name)
|
@@ -180,14 +176,6 @@ module CapistranoMulticonfigParallel
|
|
180
176
|
@task_argv
|
181
177
|
end
|
182
178
|
|
183
|
-
def dry_run_command
|
184
|
-
'--dry-run'
|
185
|
-
end
|
186
|
-
|
187
|
-
def dry_running?
|
188
|
-
@task_argv.include?(dry_run_command) == true
|
189
|
-
end
|
190
|
-
|
191
179
|
def worker_stage
|
192
180
|
@app_name.present? ? "#{@app_name}:#{@env_name}" : "#{@env_name}"
|
193
181
|
end
|
@@ -206,7 +194,7 @@ module CapistranoMulticonfigParallel
|
|
206
194
|
args.each do |arg|
|
207
195
|
array_options << arg
|
208
196
|
end
|
209
|
-
@job_argv = array_options.clone
|
197
|
+
@manager.jobs[@job_id]['job_argv'] = array_options.clone
|
210
198
|
array_options.unshift("#{worker_action}")
|
211
199
|
array_options.unshift("#{worker_stage}")
|
212
200
|
setup_command_line(*array_options)
|
@@ -32,7 +32,7 @@ module CapistranoMulticonfigParallel
|
|
32
32
|
def set_worker_log
|
33
33
|
FileUtils.mkdir_p(CapistranoMulticonfigParallel.log_directory) unless File.directory?(CapistranoMulticonfigParallel.log_directory)
|
34
34
|
@filename = File.join(CapistranoMulticonfigParallel.log_directory, "worker_#{@actor.job_id}.log")
|
35
|
-
FileUtils.rm_rf(@filename) if File.file?(@filename) && !@actor.crashed?
|
35
|
+
FileUtils.rm_rf(@filename) if File.file?(@filename) && !@actor.crashed?
|
36
36
|
@worker_log = ::Logger.new(@filename)
|
37
37
|
@worker_log.level = ::Logger::Severity::DEBUG
|
38
38
|
@worker_log.formatter = proc do |severity, datetime, progname, msg|
|
@@ -47,14 +47,9 @@ module CapistranoMulticonfigParallel
|
|
47
47
|
end
|
48
48
|
|
49
49
|
def check_exit_status
|
50
|
-
return
|
51
|
-
|
52
|
-
|
53
|
-
@actor.async.execute_deploy
|
54
|
-
elsif !@actor.worker_finshed?
|
55
|
-
debug("worker #{@actor.job_id} startsnotify finished") if @debug_enabled
|
56
|
-
@actor.notify_finished(@exit_status)
|
57
|
-
end
|
50
|
+
return if @exit_status.blank? || !@actor.worker_finshed?
|
51
|
+
debug("worker #{@actor.job_id} startsnotify finished") if @debug_enabled
|
52
|
+
@actor.notify_finished(@exit_status)
|
58
53
|
end
|
59
54
|
|
60
55
|
def start_async_deploy(cmd, options)
|
@@ -73,14 +73,15 @@ module CapistranoMulticonfigParallel
|
|
73
73
|
end
|
74
74
|
|
75
75
|
def on_message(message)
|
76
|
+
return unless message.present?
|
76
77
|
debug("Rake worker #{@job_id} received after parse #{message}") # if debug_enabled?
|
77
78
|
if @client.succesfull_subscription?(message)
|
78
79
|
debug("Rake worker #{@job_id} received parse #{message}") if debug_enabled?
|
79
80
|
@successfull_subscription = true
|
80
81
|
publish_to_worker(task_data)
|
81
|
-
elsif message
|
82
|
+
elsif message['task'].present?
|
82
83
|
task_approval(message)
|
83
|
-
elsif message
|
84
|
+
elsif message['action'].present? && message['action'] == 'stdin'
|
84
85
|
stdin_approval(message)
|
85
86
|
else
|
86
87
|
warn "unknown action: #{message.inspect}" if debug_enabled?
|
@@ -132,19 +132,18 @@ module CapistranoMulticonfigParallel
|
|
132
132
|
system('cls') || system('clear') || puts("\e[H\e[2J")
|
133
133
|
end
|
134
134
|
|
135
|
-
def worker_dry_running?(worker)
|
136
|
-
worker.alive? && worker.dry_running?
|
137
|
-
end
|
138
|
-
|
139
135
|
def worker_progress(_details, worker)
|
140
136
|
return worker_state(worker) unless worker.alive?
|
141
|
-
|
142
|
-
tasks = worker.alive? ? worker.dry_run_tasks : []
|
137
|
+
tasks = worker.alive? ? worker.invocation_chain : []
|
143
138
|
current_task = worker.alive? ? worker.machine.state.to_s : ''
|
144
|
-
|
145
|
-
|
139
|
+
show_worker_percent(worker, tasks, current_task)
|
140
|
+
end
|
141
|
+
|
142
|
+
def show_worker_percent(worker, tasks, current_task)
|
143
|
+
total_tasks = worker.alive? ? tasks.size : nil
|
144
|
+
task_index = worker.alive? ? tasks.index(current_task.to_s).to_i + 1 : 0
|
146
145
|
percent = percent_of(task_index, total_tasks)
|
147
|
-
result =
|
146
|
+
result = "Progress [#{format('%.2f', percent)}%] (executed #{task_index} of #{total_tasks})"
|
148
147
|
if worker.alive?
|
149
148
|
worker.crashed? ? result.red : result.green
|
150
149
|
else
|
@@ -65,18 +65,21 @@ module CapistranoMulticonfigParallel
|
|
65
65
|
raise ArgumentError, 'the array must contain only task names' if value.find { |row| !row.is_a?(String) }
|
66
66
|
end
|
67
67
|
|
68
|
-
def verify_application_dependencies(
|
68
|
+
def verify_application_dependencies(c, prop, props)
|
69
|
+
value = c[prop.to_sym]
|
70
|
+
return unless value.is_a?(Array)
|
69
71
|
value.reject { |val| val.blank? || !val.is_a?(Hash) }
|
70
|
-
wrong = value.
|
71
|
-
!Set[:app, :priority, :dependencies].subset?(hash.keys.to_set) ||
|
72
|
-
hash[:app].blank? ||
|
73
|
-
hash[:priority].blank?
|
74
|
-
!hash[:priority].is_a?(Numeric) ||
|
75
|
-
!hash[:dependencies].is_a?(Array)
|
76
|
-
end
|
72
|
+
wrong = check_array_of_hash(value, props.map(&:to_sym))
|
77
73
|
raise ArgumentError, "invalid configuration for #{wrong.inspect}" if wrong.present?
|
78
74
|
end
|
79
75
|
|
76
|
+
def check_array_of_hash(value, props)
|
77
|
+
value.find do|hash|
|
78
|
+
!Set.new(props).subset?(hash.keys.to_set) ||
|
79
|
+
hash.values.find(&:blank?).present?
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
80
83
|
def verify_app_dependencies(stages)
|
81
84
|
applications = stages.map { |stage| stage.split(':').reverse[1] }
|
82
85
|
wrong = configuration.application_dependencies.find do |hash|
|
@@ -94,14 +97,22 @@ module CapistranoMulticonfigParallel
|
|
94
97
|
verify_app_dependencies(stages) if configuration.application_dependencies.present?
|
95
98
|
end
|
96
99
|
|
97
|
-
def
|
98
|
-
|
100
|
+
def check_boolean_props(c, props)
|
101
|
+
props.each do |prop|
|
99
102
|
c.send("#{prop}=", c[prop.to_sym]) if check_boolean(c, prop.to_sym)
|
100
103
|
end
|
101
|
-
|
104
|
+
end
|
105
|
+
|
106
|
+
def check_array_props(c, props)
|
107
|
+
props.each do |prop|
|
102
108
|
c.send("#{prop}=", c[prop.to_sym]) if c[prop.to_sym].is_a?(Array) && verify_array_of_strings(c[prop.to_sym])
|
103
109
|
end
|
104
|
-
|
110
|
+
end
|
111
|
+
|
112
|
+
def check_configuration(c)
|
113
|
+
check_boolean_props(c, %w(multi_debug multi_secvential websocket_server.enable_debug))
|
114
|
+
check_array_props(c, %w(task_confirmations development_stages apply_stage_confirmation))
|
115
|
+
verify_application_dependencies(c, 'application_dependencies', %w(app priority dependencies))
|
105
116
|
CapistranoMulticonfigParallel::CelluloidManager.debug_enabled = true if c[:multi_debug].to_s.downcase == 'true'
|
106
117
|
end
|
107
118
|
end
|
@@ -1,8 +1,8 @@
|
|
1
1
|
# module used for feching gem information
|
2
2
|
module Helper
|
3
|
-
|
3
|
+
# function that makes the methods incapsulated as utility functions
|
4
4
|
|
5
|
-
|
5
|
+
module_function
|
6
6
|
|
7
7
|
def find_loaded_gem_property(gem_name, property)
|
8
8
|
gem_spec = Gem.loaded_specs.values.find { |repo| repo.name == gem_name }
|
@@ -15,7 +15,7 @@ module Helper
|
|
15
15
|
end
|
16
16
|
|
17
17
|
def get_parsed_version(version, options)
|
18
|
-
parsing_options = {optional_fields: [:tiny]}.merge(options.fetch(
|
18
|
+
parsing_options = { optional_fields: [:tiny] }.merge(options.fetch('unparse', {}))
|
19
19
|
Versionomy.parse(version).unparse(parsing_options)
|
20
20
|
rescue Versionomy::Errors::ParseError
|
21
21
|
nil
|
@@ -27,5 +27,4 @@ module Helper
|
|
27
27
|
gem_version = fetch_gem_version(gem_name, options)
|
28
28
|
gem_version.blank? ? false : gem_version.send(options.fetch('operator', '<='), version)
|
29
29
|
end
|
30
|
-
|
31
30
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: capistrano_multiconfig_parallel
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.15.
|
4
|
+
version: 0.15.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- bogdanRada
|
@@ -451,25 +451,25 @@ dependencies:
|
|
451
451
|
- !ruby/object:Gem::Version
|
452
452
|
version: '0.33'
|
453
453
|
- !ruby/object:Gem::Dependency
|
454
|
-
name:
|
454
|
+
name: reek
|
455
455
|
requirement: !ruby/object:Gem::Requirement
|
456
456
|
requirements:
|
457
457
|
- - "~>"
|
458
458
|
- !ruby/object:Gem::Version
|
459
|
-
version: '
|
459
|
+
version: '3.7'
|
460
460
|
- - ">="
|
461
461
|
- !ruby/object:Gem::Version
|
462
|
-
version: '
|
462
|
+
version: '3.7'
|
463
463
|
type: :development
|
464
464
|
prerelease: false
|
465
465
|
version_requirements: !ruby/object:Gem::Requirement
|
466
466
|
requirements:
|
467
467
|
- - "~>"
|
468
468
|
- !ruby/object:Gem::Version
|
469
|
-
version: '
|
469
|
+
version: '3.7'
|
470
470
|
- - ">="
|
471
471
|
- !ruby/object:Gem::Version
|
472
|
-
version: '
|
472
|
+
version: '3.7'
|
473
473
|
- !ruby/object:Gem::Dependency
|
474
474
|
name: yard
|
475
475
|
requirement: !ruby/object:Gem::Requirement
|