capistrano_multiconfig_parallel 0.12.2 → 0.12.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/capistrano_multiconfig_parallel.gemspec +12 -12
- data/lib/capistrano_multiconfig_parallel/base.rb +1 -1
- data/lib/capistrano_multiconfig_parallel/celluloid/celluloid_manager.rb +21 -21
- data/lib/capistrano_multiconfig_parallel/celluloid/celluloid_worker.rb +18 -19
- data/lib/capistrano_multiconfig_parallel/celluloid/child_process.rb +5 -5
- data/lib/capistrano_multiconfig_parallel/celluloid/rake_worker.rb +23 -34
- data/lib/capistrano_multiconfig_parallel/celluloid/terminal_table.rb +22 -24
- data/lib/capistrano_multiconfig_parallel/cli.rb +6 -6
- data/lib/capistrano_multiconfig_parallel/extensions/extension_helper.rb +12 -18
- data/lib/capistrano_multiconfig_parallel/extensions/input_stream.rb +2 -4
- data/lib/capistrano_multiconfig_parallel/extensions/output_stream.rb +6 -11
- data/lib/capistrano_multiconfig_parallel/extensions/rake.rb +1 -1
- data/lib/capistrano_multiconfig_parallel/helpers/base_manager.rb +1 -1
- data/lib/capistrano_multiconfig_parallel/helpers/standard_deploy.rb +1 -1
- data/lib/capistrano_multiconfig_parallel/multi_app_helpers/dependency_tracker.rb +1 -1
- data/lib/capistrano_multiconfig_parallel/version.rb +1 -1
- metadata +42 -42
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1134ef03c3259ddc2f47c87618a95352e1150ba7
|
4
|
+
data.tar.gz: febbbf3bc691468932a2f06fe6fed0ae101f059a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7cada320b380bc82737932fe73429542745a8d0dc4539355963a0fa3cf4ac64929b7abf0b93dd124438f4b77198ff46534db850065b6d21aaced499ec483b6f6
|
7
|
+
data.tar.gz: 052bce86fe81fe36fa5a3f7ca7349dc293fda8b12b8d8df9b5a89db7979568d7ae9f4a19a8fa525d4f54aaa035db1acfc08a98bf1d4667b580c10f1a86bfc8e6
|
@@ -31,21 +31,21 @@ Gem::Specification.new do |s|
|
|
31
31
|
s.add_runtime_dependency 'inquirer', '~> 0.2', '>= 0.2'
|
32
32
|
s.add_runtime_dependency 'devnull','~> 0.1', '>= 0.1'
|
33
33
|
|
34
|
-
s.add_development_dependency 'rspec-rails', '~>
|
35
|
-
s.add_development_dependency 'guard', '~> 2.
|
36
|
-
s.add_development_dependency 'guard-rspec', '~> 4.
|
37
|
-
s.add_development_dependency 'simplecov', '~> 0.
|
34
|
+
s.add_development_dependency 'rspec-rails', '~> 3.3', '>= 3.3'
|
35
|
+
s.add_development_dependency 'guard', '~> 2.13', '>= 2.13'
|
36
|
+
s.add_development_dependency 'guard-rspec', '~> 4.6', '>= 4.6'
|
37
|
+
s.add_development_dependency 'simplecov', '~> 0.10', '>= 0.10'
|
38
38
|
s.add_development_dependency 'simplecov-summary', '~> 0.0.4', '>= 0.0.4'
|
39
39
|
s.add_development_dependency 'mocha', '~> 1.1', '>= 1.1'
|
40
40
|
s.add_development_dependency 'coveralls', '~> 0.7', '>= 0.7'
|
41
41
|
s.add_development_dependency 'rvm-tester', '~> 1.1', '>= 1.1'
|
42
42
|
|
43
|
-
s.add_development_dependency 'rubocop', '~> 0',
|
44
|
-
s.add_development_dependency 'phare', '~> 0', '>= 0.
|
45
|
-
s.add_development_dependency 'yard', '~> 0', '>= 0.8.7'
|
46
|
-
s.add_development_dependency 'yard-rspec', '~> 0', '>= 0.1'
|
47
|
-
s.add_development_dependency 'redcarpet', '~> 3', '>= 3.
|
48
|
-
s.add_development_dependency 'github-markup', '~> 1', '>= 1.3.3'
|
49
|
-
s.add_development_dependency 'inch', '~> 0', '>= 0.
|
50
|
-
s.add_development_dependency 'guard-inch', '~> 0', '>= 0.1.0'
|
43
|
+
s.add_development_dependency 'rubocop', '~> 0.33', '>= 0.33'
|
44
|
+
s.add_development_dependency 'phare', '~> 0.7', '>= 0.7'
|
45
|
+
s.add_development_dependency 'yard', '~> 0.8', '>= 0.8.7'
|
46
|
+
s.add_development_dependency 'yard-rspec', '~> 0.1', '>= 0.1'
|
47
|
+
s.add_development_dependency 'redcarpet', '~> 3.3', '>= 3.3'
|
48
|
+
s.add_development_dependency 'github-markup', '~> 1.3', '>= 1.3.3'
|
49
|
+
s.add_development_dependency 'inch', '~> 0.6', '>= 0.6'
|
50
|
+
s.add_development_dependency 'guard-inch', '~> 0.1', '>= 0.1.0'
|
51
51
|
end
|
@@ -19,7 +19,7 @@ module CapistranoMulticonfigParallel
|
|
19
19
|
}
|
20
20
|
|
21
21
|
class << self
|
22
|
-
attr_accessor
|
22
|
+
attr_accessor :execute_in_sequence, :logger, :original_args, :interactive_menu
|
23
23
|
|
24
24
|
def root
|
25
25
|
File.expand_path(File.dirname(__dir__))
|
@@ -94,9 +94,9 @@ module CapistranoMulticonfigParallel
|
|
94
94
|
end
|
95
95
|
|
96
96
|
def all_workers_finished?
|
97
|
-
@job_to_worker.all? { |job_id,
|
97
|
+
@job_to_worker.all? { |job_id, _worker| @jobs[job_id]['worker_action'] == 'finished' }
|
98
98
|
end
|
99
|
-
|
99
|
+
|
100
100
|
def process_jobs
|
101
101
|
@workers_terminated = Celluloid::Condition.new
|
102
102
|
if syncronized_confirmation?
|
@@ -110,7 +110,7 @@ module CapistranoMulticonfigParallel
|
|
110
110
|
sleep(0.1) # keep current thread alive
|
111
111
|
end
|
112
112
|
debug("all jobs have completed #{condition}") if self.class.debug_enabled?
|
113
|
-
Celluloid::Actor[:terminal_server].async.notify_time_change(
|
113
|
+
Celluloid::Actor[:terminal_server].async.notify_time_change(CapistranoMulticonfigParallel::TerminalTable::TOPIC, type: 'output') if Celluloid::Actor[:terminal_server].alive?
|
114
114
|
end
|
115
115
|
|
116
116
|
def apply_confirmations?
|
@@ -196,10 +196,10 @@ module CapistranoMulticonfigParallel
|
|
196
196
|
@jobs.pmap do |job_id, job|
|
197
197
|
worker = get_worker_for_job(job_id)
|
198
198
|
worker.publish_rake_event('approved' => 'yes',
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
199
|
+
'action' => 'invoke',
|
200
|
+
'job_id' => job['id'],
|
201
|
+
'task' => task
|
202
|
+
)
|
203
203
|
end
|
204
204
|
end
|
205
205
|
|
@@ -236,20 +236,20 @@ module CapistranoMulticonfigParallel
|
|
236
236
|
if job['processed']
|
237
237
|
@jobs[job['job_id']]
|
238
238
|
else
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
239
|
+
env_options = {}
|
240
|
+
job['env_options'].each do |key, value|
|
241
|
+
env_options[key] = value if value.present? && !filtered_env_keys.include?(key)
|
242
|
+
end
|
243
|
+
{
|
244
|
+
'job_id' => job['id'],
|
245
|
+
'app_name' => job['app'],
|
246
|
+
'env_name' => job['env'],
|
247
|
+
'action_name' => job['action'],
|
248
|
+
'env_options' => env_options,
|
249
|
+
'task_arguments' => job['task_arguments'],
|
250
|
+
'job_argv' => job.fetch('job_argv', []),
|
251
|
+
'processed' => true
|
252
|
+
}
|
253
253
|
end
|
254
254
|
end
|
255
255
|
|
@@ -47,14 +47,13 @@ module CapistranoMulticonfigParallel
|
|
47
47
|
def start_task
|
48
48
|
@manager.setup_worker_conditions(Actor.current)
|
49
49
|
debug("exec worker #{@job_id} starts task with #{@job.inspect}") if debug_enabled?
|
50
|
-
@client = CelluloidPubsub::Client.connect(actor: Actor.current, enable_debug: @manager.class.debug_websocket?, :
|
50
|
+
@client = CelluloidPubsub::Client.connect(actor: Actor.current, enable_debug: @manager.class.debug_websocket?, channel: subscription_channel)
|
51
51
|
end
|
52
52
|
|
53
53
|
def publish_rake_event(data)
|
54
54
|
@client.publish(rake_actor_id(data), data)
|
55
55
|
end
|
56
56
|
|
57
|
-
|
58
57
|
def rake_actor_id(data)
|
59
58
|
data['action'].present? && data['action'] == 'count' ? "rake_worker_#{@job_id}_count" : "rake_worker_#{@job_id}"
|
60
59
|
end
|
@@ -70,7 +69,7 @@ module CapistranoMulticonfigParallel
|
|
70
69
|
end
|
71
70
|
|
72
71
|
def execute_after_succesfull_subscription
|
73
|
-
|
72
|
+
async.execute_deploy
|
74
73
|
end
|
75
74
|
|
76
75
|
def rake_tasks
|
@@ -78,7 +77,7 @@ module CapistranoMulticonfigParallel
|
|
78
77
|
end
|
79
78
|
|
80
79
|
def dry_run_tasks
|
81
|
-
|
80
|
+
@dry_run_tasks ||= []
|
82
81
|
end
|
83
82
|
|
84
83
|
def cd_working_directory
|
@@ -116,13 +115,13 @@ module CapistranoMulticonfigParallel
|
|
116
115
|
end
|
117
116
|
|
118
117
|
def check_gitflow
|
119
|
-
return if dry_running? ||
|
118
|
+
return if dry_running? || @env_name != 'staging' || !@manager.can_tag_staging? || !executed_task?(CapistranoMulticonfigParallel::GITFLOW_TAG_STAGING_TASK)
|
120
119
|
@manager.dispatch_new_job(@job.merge('env' => 'production'))
|
121
120
|
end
|
122
121
|
|
123
122
|
def handle_subscription(message)
|
124
|
-
|
125
|
-
|
123
|
+
@executing_dry_run = message['action'] == 'count' ? true : false
|
124
|
+
@manager.jobs[@job_id]['job_argv'] = @job_argv
|
126
125
|
if message_is_about_a_task?(message)
|
127
126
|
check_gitflow
|
128
127
|
save_tasks_to_be_executed(message)
|
@@ -130,16 +129,16 @@ module CapistranoMulticonfigParallel
|
|
130
129
|
debug("worker #{@job_id} state is #{@machine.state}") if debug_enabled?
|
131
130
|
task_approval(message)
|
132
131
|
elsif message_is_for_stdout?(message)
|
133
|
-
|
134
|
-
|
132
|
+
result = Celluloid::Actor[:terminal_server].show_confirmation(message['question'], message['default'])
|
133
|
+
publish_rake_event(message.merge('action' => 'stdin', 'result' => result, 'client_action' => 'stdin'))
|
135
134
|
else
|
136
135
|
debug("worker #{@job_id} could not handle #{message}") if debug_enabled?
|
137
136
|
end
|
138
137
|
end
|
139
138
|
|
140
|
-
|
139
|
+
def message_is_for_stdout?(message)
|
141
140
|
message.present? && message.is_a?(Hash) && message['action'].present? && message['job_id'].present? && message['action'] == 'stdout'
|
142
|
-
|
141
|
+
end
|
143
142
|
|
144
143
|
def message_is_about_a_task?(message)
|
145
144
|
message.present? && message.is_a?(Hash) && message['action'].present? && message['job_id'].present? && message['task'].present?
|
@@ -162,7 +161,7 @@ module CapistranoMulticonfigParallel
|
|
162
161
|
def save_tasks_to_be_executed(message)
|
163
162
|
debug("worler #{@job_id} current invocation chain : #{rake_tasks.inspect}") if debug_enabled?
|
164
163
|
rake_tasks << message['task'] if rake_tasks.last != message['task']
|
165
|
-
dry_run_tasks << message['task'] if dry_running? &&
|
164
|
+
dry_run_tasks << message['task'] if dry_running? && dry_run_tasks.last != message['task']
|
166
165
|
end
|
167
166
|
|
168
167
|
def update_machine_state(name)
|
@@ -193,7 +192,7 @@ module CapistranoMulticonfigParallel
|
|
193
192
|
end
|
194
193
|
|
195
194
|
def worker_action
|
196
|
-
|
195
|
+
"#{@action_name}[#{@task_arguments.join(',')}]"
|
197
196
|
end
|
198
197
|
|
199
198
|
def setup_task_arguments(*args)
|
@@ -201,14 +200,14 @@ module CapistranoMulticonfigParallel
|
|
201
200
|
array_options = []
|
202
201
|
@env_options.each do |key, value|
|
203
202
|
array_options << "#{key}=#{value}" if value.present?
|
204
|
-
|
203
|
+
end
|
205
204
|
array_options << '--trace' if debug_enabled?
|
206
205
|
args.each do |arg|
|
207
206
|
array_options << arg
|
208
207
|
end
|
209
|
-
@job_argv= array_options.clone
|
208
|
+
@job_argv = array_options.clone
|
210
209
|
array_options.unshift("#{worker_action}")
|
211
|
-
|
210
|
+
array_options.unshift("#{worker_stage}")
|
212
211
|
setup_command_line(*array_options)
|
213
212
|
end
|
214
213
|
|
@@ -233,17 +232,17 @@ module CapistranoMulticonfigParallel
|
|
233
232
|
def finish_worker
|
234
233
|
@manager.mark_completed_remaining_tasks(Actor.current)
|
235
234
|
@manager.jobs[@job_id]['worker_action'] = 'finished'
|
236
|
-
@manager.workers_terminated.signal('completed')
|
235
|
+
@manager.workers_terminated.signal('completed') if @manager.all_workers_finished?
|
237
236
|
end
|
238
237
|
|
239
238
|
def worker_finshed?
|
240
|
-
|
239
|
+
@manager.jobs[@job_id]['worker_action'] == 'finished'
|
241
240
|
end
|
242
241
|
|
243
242
|
def notify_finished(exit_status)
|
244
243
|
if exit_status.exitstatus != 0
|
245
244
|
debug("worker #{job_id} tries to terminate") if debug_enabled?
|
246
|
-
raise(CapistranoMulticonfigParallel::CelluloidWorker::TaskFailed, "task failed with exit status #{exit_status.inspect} ")
|
245
|
+
raise(CapistranoMulticonfigParallel::CelluloidWorker::TaskFailed, "task failed with exit status #{exit_status.inspect} ") # force worker to rollback
|
247
246
|
else
|
248
247
|
update_machine_state('FINISHED')
|
249
248
|
debug("worker #{job_id} notifies manager has finished") if debug_enabled?
|
@@ -7,7 +7,7 @@ module CapistranoMulticonfigParallel
|
|
7
7
|
attr_accessor :actor, :pid, :exit_status, :process, :filename, :worker_log, :job_id, :debug_enabled
|
8
8
|
|
9
9
|
finalizer :process_finalizer
|
10
|
-
|
10
|
+
|
11
11
|
def work(cmd, options = {})
|
12
12
|
@options = options
|
13
13
|
@actor = @options.fetch(:actor, nil)
|
@@ -45,10 +45,10 @@ module CapistranoMulticonfigParallel
|
|
45
45
|
@timer.cancel
|
46
46
|
EM.stop if EM.reactor_running?
|
47
47
|
end
|
48
|
-
|
48
|
+
|
49
49
|
def check_exit_status
|
50
50
|
return unless @exit_status.present?
|
51
|
-
if @exit_status.exitstatus == 0 &&
|
51
|
+
if @exit_status.exitstatus == 0 && @options[:dry_run]
|
52
52
|
debug("worker #{@actor.job_id} starts execute deploy") if @debug_enabled
|
53
53
|
@actor.async.execute_deploy
|
54
54
|
elsif !@actor.worker_finshed?
|
@@ -63,7 +63,7 @@ module CapistranoMulticonfigParallel
|
|
63
63
|
target: self,
|
64
64
|
environment: options[:environment].present? ? options[:environment] : nil,
|
65
65
|
pid_handler: :on_pid,
|
66
|
-
input: :on_input_stdin
|
66
|
+
input: :on_input_stdin,
|
67
67
|
stdout_handler: :on_read_stdout,
|
68
68
|
stderr_handler: :on_read_stderr,
|
69
69
|
watch_handler: :watch_handler,
|
@@ -88,7 +88,7 @@ module CapistranoMulticonfigParallel
|
|
88
88
|
end
|
89
89
|
|
90
90
|
def on_exit(status)
|
91
|
-
|
91
|
+
@worker_log.debug "Child process for worker #{@job_id} on_exit disconnected due to error #{status.inspect}" if @debug_enabled
|
92
92
|
@exit_status = status
|
93
93
|
end
|
94
94
|
|
@@ -5,18 +5,16 @@ module CapistranoMulticonfigParallel
|
|
5
5
|
include Celluloid::Logger
|
6
6
|
|
7
7
|
attr_accessor :env, :client, :job_id, :action, :task,
|
8
|
-
|
9
|
-
|
8
|
+
:task_approved, :successfull_subscription,
|
9
|
+
:subscription_channel, :publisher_channel, :stdin_result
|
10
10
|
|
11
|
-
|
12
|
-
|
13
|
-
def work(env, options = {})
|
11
|
+
def work(env, options = {})
|
14
12
|
@options = options.stringify_keys
|
15
13
|
@env = env
|
16
14
|
default_settings
|
17
15
|
custom_attributes
|
18
16
|
initialize_subscription
|
19
|
-
|
17
|
+
end
|
20
18
|
|
21
19
|
def custom_attributes
|
22
20
|
@publisher_channel = "worker_#{@job_id}"
|
@@ -24,10 +22,10 @@ module CapistranoMulticonfigParallel
|
|
24
22
|
@task = @options['task']
|
25
23
|
end
|
26
24
|
|
27
|
-
|
25
|
+
def publish_new_work(env, new_options = {})
|
28
26
|
work(env, @options.merge(new_options))
|
29
|
-
|
30
|
-
|
27
|
+
publish_to_worker(task_data)
|
28
|
+
end
|
31
29
|
|
32
30
|
def wait_execution(name = task_name, time = 0.1)
|
33
31
|
# info "Before waiting #{name}"
|
@@ -35,7 +33,7 @@ module CapistranoMulticonfigParallel
|
|
35
33
|
# info "After waiting #{name}"
|
36
34
|
end
|
37
35
|
|
38
|
-
def wait_for(
|
36
|
+
def wait_for(_name, time)
|
39
37
|
# info "waiting for #{time} seconds on #{name}"
|
40
38
|
sleep time
|
41
39
|
# info "done waiting on #{name} "
|
@@ -51,11 +49,11 @@ module CapistranoMulticonfigParallel
|
|
51
49
|
|
52
50
|
def initialize_subscription
|
53
51
|
return if defined?(@client) && @client.present?
|
54
|
-
@client = CelluloidPubsub::Client.connect(actor: Actor.current, enable_debug: debug_enabled?, :
|
52
|
+
@client = CelluloidPubsub::Client.connect(actor: Actor.current, enable_debug: debug_enabled?, channel: @subscription_channel)
|
55
53
|
end
|
56
54
|
|
57
55
|
def debug_enabled?
|
58
|
-
|
56
|
+
CapistranoMulticonfigParallel::CelluloidManager.debug_websocket?
|
59
57
|
end
|
60
58
|
|
61
59
|
def task_name
|
@@ -70,17 +68,16 @@ module CapistranoMulticonfigParallel
|
|
70
68
|
}
|
71
69
|
end
|
72
70
|
|
73
|
-
|
74
71
|
def publish_to_worker(data)
|
75
72
|
@client.publish(@publisher_channel, data)
|
76
73
|
end
|
77
74
|
|
78
75
|
def on_message(message)
|
79
|
-
debug("Rake worker #{@job_id} received after parse #{message}") #if debug_enabled?
|
76
|
+
debug("Rake worker #{@job_id} received after parse #{message}") # if debug_enabled?
|
80
77
|
if @client.succesfull_subscription?(message)
|
81
|
-
|
82
|
-
|
83
|
-
|
78
|
+
debug("Rake worker #{@job_id} received parse #{message}") if debug_enabled?
|
79
|
+
@successfull_subscription = true
|
80
|
+
publish_to_worker(task_data)
|
84
81
|
elsif message.present? && message['task'].present?
|
85
82
|
task_approval(message)
|
86
83
|
elsif message.present? && message['action'].present? && message['action'] == 'stdin'
|
@@ -95,13 +92,10 @@ module CapistranoMulticonfigParallel
|
|
95
92
|
end
|
96
93
|
|
97
94
|
def publish_subscription_successfull
|
98
|
-
|
99
95
|
end
|
100
96
|
|
101
97
|
def wait_for_stdin_input
|
102
|
-
until @stdin_result.present?
|
103
|
-
wait_execution
|
104
|
-
end
|
98
|
+
wait_execution until @stdin_result.present?
|
105
99
|
output = @stdin_result.clone
|
106
100
|
Actor.current.stdin_result = nil
|
107
101
|
output
|
@@ -143,20 +137,15 @@ module CapistranoMulticonfigParallel
|
|
143
137
|
end
|
144
138
|
|
145
139
|
def user_prompt_needed?(data)
|
146
|
-
return if !printing_question?(data) || @action !=
|
147
|
-
|
148
|
-
details = get_question_details(data)
|
149
|
-
default = details.second.present? ? details.second : nil
|
150
|
-
publish_to_worker({
|
151
|
-
action: "stdout",
|
152
|
-
question: details.first,
|
153
|
-
default: default.delete('()'),
|
154
|
-
job_id: @job_id
|
155
|
-
})
|
156
|
-
wait_for_stdin_input
|
140
|
+
return if !printing_question?(data) || @action != 'invoke'
|
157
141
|
|
142
|
+
details = get_question_details(data)
|
143
|
+
default = details.second.present? ? details.second : nil
|
144
|
+
publish_to_worker(action: 'stdout',
|
145
|
+
question: details.first,
|
146
|
+
default: default.delete('()'),
|
147
|
+
job_id: @job_id)
|
148
|
+
wait_for_stdin_input
|
158
149
|
end
|
159
|
-
|
160
|
-
|
161
150
|
end
|
162
151
|
end
|
@@ -38,17 +38,16 @@ module CapistranoMulticonfigParallel
|
|
38
38
|
terminate
|
39
39
|
end
|
40
40
|
|
41
|
-
|
42
41
|
def show_confirmation(message, default)
|
43
42
|
exclusive do
|
44
43
|
CapistranoMulticonfigParallel.ask_confirm(message, default)
|
45
44
|
end
|
46
45
|
end
|
47
|
-
|
46
|
+
|
48
47
|
def message_valid?(message)
|
49
48
|
message[:type].present? && message[:type] == 'output' || message[:type] == 'event'
|
50
49
|
end
|
51
|
-
|
50
|
+
|
52
51
|
def show_terminal_screen(table)
|
53
52
|
return unless table.rows.present?
|
54
53
|
terminal_clear
|
@@ -57,7 +56,7 @@ module CapistranoMulticonfigParallel
|
|
57
56
|
puts table
|
58
57
|
puts "\n"
|
59
58
|
sleep(1)
|
60
|
-
@job_manager.condition.signal('completed') if @manager.all_workers_finished?
|
59
|
+
@job_manager.condition.signal('completed') if @manager.all_workers_finished?
|
61
60
|
end
|
62
61
|
|
63
62
|
def worker_state(worker)
|
@@ -76,7 +75,7 @@ module CapistranoMulticonfigParallel
|
|
76
75
|
end
|
77
76
|
worker_optons
|
78
77
|
end
|
79
|
-
|
78
|
+
|
80
79
|
def worker_action(processed_job)
|
81
80
|
processed_job['task_arguments'].present? ? "#{processed_job['action_name']}[#{processed_job['task_arguments'].join(',')}]" : processed_job['action_name']
|
82
81
|
end
|
@@ -88,7 +87,7 @@ module CapistranoMulticonfigParallel
|
|
88
87
|
def get_worker_details(job_id, worker)
|
89
88
|
job = @manager.jobs[job_id]
|
90
89
|
processed_job = @manager.process_job(job)
|
91
|
-
|
90
|
+
|
92
91
|
{
|
93
92
|
'job_id' => job_id,
|
94
93
|
'app_name' => processed_job['app_name'],
|
@@ -104,14 +103,14 @@ module CapistranoMulticonfigParallel
|
|
104
103
|
def add_job_to_table(table, job_id)
|
105
104
|
worker = @manager.get_worker_for_job(job_id)
|
106
105
|
details = get_worker_details(job_id, worker)
|
107
|
-
|
106
|
+
|
108
107
|
row = [{ value: job_id.to_s },
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
# if CapistranoMulticonfigParallel.show_task_progress
|
108
|
+
{ value: details['full_stage'] },
|
109
|
+
{ value: details['action_name'] },
|
110
|
+
{ value: details['env_options'] },
|
111
|
+
{ value: "#{details['state']}" }
|
112
|
+
]
|
113
|
+
# if CapistranoMulticonfigParallel.show_task_progress
|
115
114
|
# if worker.alive?
|
116
115
|
# row << { value: worker.rake_tasks.size }
|
117
116
|
# row << { value: worker_progress(details, worker) }
|
@@ -131,26 +130,25 @@ module CapistranoMulticonfigParallel
|
|
131
130
|
def worker_dry_running?(worker)
|
132
131
|
worker.alive? && worker.dry_running?
|
133
132
|
end
|
134
|
-
|
135
|
-
def worker_progress(
|
136
|
-
return worker_state(worker) unless worker.alive?
|
133
|
+
|
134
|
+
def worker_progress(_details, worker)
|
135
|
+
return worker_state(worker) unless worker.alive?
|
137
136
|
return if worker.executing_dry_run.nil?
|
138
|
-
tasks = worker.alive? ?
|
139
|
-
current_task =
|
140
|
-
total_tasks =
|
141
|
-
task_index =
|
137
|
+
tasks = worker.alive? ? worker.dry_run_tasks : []
|
138
|
+
current_task = worker.alive? ? worker.machine.state.to_s : ''
|
139
|
+
total_tasks = worker_dry_running?(worker) ? nil : tasks.size
|
140
|
+
task_index = worker_dry_running?(worker) ? 0 : tasks.index(current_task.to_s).to_i + 1
|
142
141
|
percent = percent_of(task_index, total_tasks)
|
143
|
-
result =
|
142
|
+
result = worker_dry_running?(worker) ? 'Please wait.. building the progress bars' : "Progress [#{sprintf('%.2f', percent)}%] (executed #{task_index} of #{total_tasks})"
|
144
143
|
if worker.alive?
|
145
144
|
worker.crashed? ? result.red : result.green
|
146
145
|
else
|
147
146
|
worker_state(worker)
|
148
147
|
end
|
149
148
|
end
|
150
|
-
|
149
|
+
|
151
150
|
def percent_of(index, total)
|
152
|
-
|
151
|
+
index.to_f / total.to_f * 100.0
|
153
152
|
end
|
154
|
-
|
155
153
|
end
|
156
154
|
end
|
@@ -7,12 +7,12 @@ module CapistranoMulticonfigParallel
|
|
7
7
|
CapistranoMulticonfigParallel.check_terminal_tty
|
8
8
|
CapistranoMulticonfigParallel.original_args = ARGV.dup
|
9
9
|
CapistranoMulticonfigParallel::Application.new.run
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
10
|
+
rescue Interrupt
|
11
|
+
`stty icanon echo`
|
12
|
+
$stderr.puts 'Command cancelled.'
|
13
|
+
rescue => error
|
14
|
+
$stderr.puts error
|
15
|
+
exit(1)
|
16
16
|
end
|
17
17
|
end
|
18
18
|
end
|
@@ -1,32 +1,28 @@
|
|
1
1
|
require 'celluloid/autostart'
|
2
|
-
require_relative
|
2
|
+
require_relative '../celluloid/rake_worker'
|
3
3
|
require_relative './input_stream'
|
4
4
|
require_relative './output_stream'
|
5
5
|
module CapistranoMulticonfigParallel
|
6
6
|
class ExtensionHelper
|
7
|
-
|
8
7
|
attr_accessor :task, :env
|
9
8
|
def initialize(env, task)
|
10
9
|
@env = env
|
11
10
|
@task = task
|
12
11
|
end
|
13
|
-
|
12
|
+
|
14
13
|
def work(&block)
|
15
|
-
if
|
14
|
+
if job_id.present?
|
16
15
|
actor_start_working
|
17
16
|
actor.wait_execution until actor.task_approved
|
18
|
-
return unless
|
17
|
+
return unless actor.task_approved
|
19
18
|
actor_execute_block(&block)
|
20
19
|
else
|
21
20
|
block.call
|
22
21
|
end
|
23
22
|
end
|
24
23
|
|
24
|
+
private
|
25
25
|
|
26
|
-
|
27
|
-
private
|
28
|
-
|
29
|
-
|
30
26
|
def actor_execute_block(&block)
|
31
27
|
stringio = StringIO.new
|
32
28
|
CapistranoMulticonfigParallel::OutputStream.hook(stringio)
|
@@ -35,7 +31,7 @@ module CapistranoMulticonfigParallel
|
|
35
31
|
CapistranoMulticonfigParallel::InputStream.unhook
|
36
32
|
CapistranoMulticonfigParallel::OutputStream.unhook
|
37
33
|
end
|
38
|
-
|
34
|
+
|
39
35
|
def actor_start_working
|
40
36
|
if actor.blank?
|
41
37
|
CapistranoMulticonfigParallel::RakeWorker.supervise_as rake_actor_id
|
@@ -44,25 +40,23 @@ module CapistranoMulticonfigParallel
|
|
44
40
|
actor.publish_new_work(@env, task: @task)
|
45
41
|
end
|
46
42
|
end
|
47
|
-
|
43
|
+
|
48
44
|
def supervise_actor
|
49
|
-
CapistranoMulticonfigParallel::RakeWorker.supervise_as(rake_actor_id,
|
50
|
-
|
51
|
-
|
45
|
+
CapistranoMulticonfigParallel::RakeWorker.supervise_as(rake_actor_id,
|
46
|
+
actor_id: rake_actor_id,
|
47
|
+
job_id: job_id) if actor.blank?
|
52
48
|
end
|
53
|
-
|
49
|
+
|
54
50
|
def actor
|
55
51
|
Celluloid::Actor[rake_actor_id]
|
56
52
|
end
|
57
|
-
|
53
|
+
|
58
54
|
def job_id
|
59
55
|
@env[CapistranoMulticonfigParallel::ENV_KEY_JOB_ID]
|
60
56
|
end
|
61
|
-
|
62
57
|
|
63
58
|
def rake_actor_id
|
64
59
|
@env['count_rake'].present? ? "rake_worker_#{job_id}_count" : "rake_worker_#{job_id}"
|
65
60
|
end
|
66
|
-
|
67
61
|
end
|
68
62
|
end
|
@@ -17,14 +17,13 @@ module CapistranoMulticonfigParallel
|
|
17
17
|
self.stringio = stringio
|
18
18
|
end
|
19
19
|
|
20
|
-
def gets(*
|
20
|
+
def gets(*_args)
|
21
21
|
@stringio.rewind
|
22
22
|
data = @stringio.read
|
23
|
-
@actor.user_prompt_needed?(data)
|
23
|
+
@actor.user_prompt_needed?(data)
|
24
24
|
end
|
25
25
|
|
26
26
|
def finish
|
27
|
-
|
28
27
|
end
|
29
28
|
|
30
29
|
def method_missing(name, *args, &block)
|
@@ -32,4 +31,3 @@ module CapistranoMulticonfigParallel
|
|
32
31
|
end
|
33
32
|
end
|
34
33
|
end
|
35
|
-
|
@@ -12,26 +12,21 @@ module CapistranoMulticonfigParallel
|
|
12
12
|
attr_accessor :real, :stringio
|
13
13
|
|
14
14
|
def initialize(real_stdout, stringio)
|
15
|
-
self.real= real_stdout
|
15
|
+
self.real = real_stdout
|
16
16
|
self.stringio = stringio
|
17
17
|
end
|
18
18
|
|
19
19
|
def write(*args)
|
20
20
|
@stringio.print(*args)
|
21
|
-
@real.write(*args)
|
21
|
+
@real.write(*args)
|
22
22
|
@real.flush
|
23
23
|
end
|
24
24
|
|
25
|
+
def finish
|
26
|
+
end
|
25
27
|
|
26
|
-
|
27
|
-
|
28
|
-
def finish
|
29
|
-
|
28
|
+
def method_missing(name, *args, &block)
|
29
|
+
@real.send name, *args, &block
|
30
30
|
end
|
31
|
-
|
32
|
-
def method_missing(name, *args, &block)
|
33
|
-
@real.send name, *args, &block
|
34
|
-
end
|
35
31
|
end
|
36
32
|
end
|
37
|
-
|
@@ -3,7 +3,7 @@ Rake::Task.class_eval do
|
|
3
3
|
alias_method :original_execute, :execute
|
4
4
|
|
5
5
|
def execute(*args)
|
6
|
-
rake =
|
6
|
+
rake = CapistranoMulticonfigParallel::ExtensionHelper.new(ENV, self)
|
7
7
|
rake.work do
|
8
8
|
original_execute(*args)
|
9
9
|
end
|
@@ -221,7 +221,7 @@ module CapistranoMulticonfigParallel
|
|
221
221
|
value = options['value'].present? ? options['value'] : fetch(options.fetch('key', :app_branch_name))
|
222
222
|
if value.present?
|
223
223
|
branch = value.gsub("\r\n", '')
|
224
|
-
branch = branch.
|
224
|
+
branch = branch.delete("\n") if branch.present?
|
225
225
|
branch = branch.gsub(/\s+/, ' ') if branch.present?
|
226
226
|
branch = branch.strip if branch.present?
|
227
227
|
return branch
|
@@ -19,7 +19,7 @@ module CapistranoMulticonfigParallel
|
|
19
19
|
action = "#{action_name}[#{options.fetch('task_arguments:', []).join(',')}]"
|
20
20
|
arguments = setup_command_line_standard(options.fetch('env_options', {}))
|
21
21
|
job_stage = app.present? ? "#{app}:#{stage}" : "#{stage}"
|
22
|
-
|
22
|
+
|
23
23
|
command = "bundle exec cap #{job_stage} #{action} #{arguments}"
|
24
24
|
puts("\n\n\n Executing '#{command}' \n\n\n .")
|
25
25
|
sh("#{command}")
|
@@ -20,7 +20,7 @@ module CapistranoMulticonfigParallel
|
|
20
20
|
interactive_menu = CapistranoMulticonfigParallel::InteractiveMenu.new
|
21
21
|
applications_selected = interactive_menu.show_all_websites_interactive_menu(applications)
|
22
22
|
applications_selected = applications_selected.gsub("\r\n", '') if applications_selected.present?
|
23
|
-
applications_selected = applications_selected.
|
23
|
+
applications_selected = applications_selected.delete("\n") if applications_selected.present?
|
24
24
|
applications_selected = applications_selected.split(',') if applications_selected.present?
|
25
25
|
applications_selected.present? ? applications_selected : []
|
26
26
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: capistrano_multiconfig_parallel
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.12.
|
4
|
+
version: 0.12.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- bogdanRada
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-11-
|
11
|
+
date: 2015-11-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: celluloid-pmap
|
@@ -276,80 +276,80 @@ dependencies:
|
|
276
276
|
requirements:
|
277
277
|
- - "~>"
|
278
278
|
- !ruby/object:Gem::Version
|
279
|
-
version: '
|
279
|
+
version: '3.3'
|
280
280
|
- - ">="
|
281
281
|
- !ruby/object:Gem::Version
|
282
|
-
version: '
|
282
|
+
version: '3.3'
|
283
283
|
type: :development
|
284
284
|
prerelease: false
|
285
285
|
version_requirements: !ruby/object:Gem::Requirement
|
286
286
|
requirements:
|
287
287
|
- - "~>"
|
288
288
|
- !ruby/object:Gem::Version
|
289
|
-
version: '
|
289
|
+
version: '3.3'
|
290
290
|
- - ">="
|
291
291
|
- !ruby/object:Gem::Version
|
292
|
-
version: '
|
292
|
+
version: '3.3'
|
293
293
|
- !ruby/object:Gem::Dependency
|
294
294
|
name: guard
|
295
295
|
requirement: !ruby/object:Gem::Requirement
|
296
296
|
requirements:
|
297
297
|
- - "~>"
|
298
298
|
- !ruby/object:Gem::Version
|
299
|
-
version: '2.
|
299
|
+
version: '2.13'
|
300
300
|
- - ">="
|
301
301
|
- !ruby/object:Gem::Version
|
302
|
-
version: 2.
|
302
|
+
version: '2.13'
|
303
303
|
type: :development
|
304
304
|
prerelease: false
|
305
305
|
version_requirements: !ruby/object:Gem::Requirement
|
306
306
|
requirements:
|
307
307
|
- - "~>"
|
308
308
|
- !ruby/object:Gem::Version
|
309
|
-
version: '2.
|
309
|
+
version: '2.13'
|
310
310
|
- - ">="
|
311
311
|
- !ruby/object:Gem::Version
|
312
|
-
version: 2.
|
312
|
+
version: '2.13'
|
313
313
|
- !ruby/object:Gem::Dependency
|
314
314
|
name: guard-rspec
|
315
315
|
requirement: !ruby/object:Gem::Requirement
|
316
316
|
requirements:
|
317
317
|
- - "~>"
|
318
318
|
- !ruby/object:Gem::Version
|
319
|
-
version: '4.
|
319
|
+
version: '4.6'
|
320
320
|
- - ">="
|
321
321
|
- !ruby/object:Gem::Version
|
322
|
-
version: 4.
|
322
|
+
version: '4.6'
|
323
323
|
type: :development
|
324
324
|
prerelease: false
|
325
325
|
version_requirements: !ruby/object:Gem::Requirement
|
326
326
|
requirements:
|
327
327
|
- - "~>"
|
328
328
|
- !ruby/object:Gem::Version
|
329
|
-
version: '4.
|
329
|
+
version: '4.6'
|
330
330
|
- - ">="
|
331
331
|
- !ruby/object:Gem::Version
|
332
|
-
version: 4.
|
332
|
+
version: '4.6'
|
333
333
|
- !ruby/object:Gem::Dependency
|
334
334
|
name: simplecov
|
335
335
|
requirement: !ruby/object:Gem::Requirement
|
336
336
|
requirements:
|
337
337
|
- - "~>"
|
338
338
|
- !ruby/object:Gem::Version
|
339
|
-
version: '0.
|
339
|
+
version: '0.10'
|
340
340
|
- - ">="
|
341
341
|
- !ruby/object:Gem::Version
|
342
|
-
version: '0.
|
342
|
+
version: '0.10'
|
343
343
|
type: :development
|
344
344
|
prerelease: false
|
345
345
|
version_requirements: !ruby/object:Gem::Requirement
|
346
346
|
requirements:
|
347
347
|
- - "~>"
|
348
348
|
- !ruby/object:Gem::Version
|
349
|
-
version: '0.
|
349
|
+
version: '0.10'
|
350
350
|
- - ">="
|
351
351
|
- !ruby/object:Gem::Version
|
352
|
-
version: '0.
|
352
|
+
version: '0.10'
|
353
353
|
- !ruby/object:Gem::Dependency
|
354
354
|
name: simplecov-summary
|
355
355
|
requirement: !ruby/object:Gem::Requirement
|
@@ -436,47 +436,47 @@ dependencies:
|
|
436
436
|
requirements:
|
437
437
|
- - "~>"
|
438
438
|
- !ruby/object:Gem::Version
|
439
|
-
version: '0'
|
439
|
+
version: '0.33'
|
440
440
|
- - ">="
|
441
441
|
- !ruby/object:Gem::Version
|
442
|
-
version: '0.
|
442
|
+
version: '0.33'
|
443
443
|
type: :development
|
444
444
|
prerelease: false
|
445
445
|
version_requirements: !ruby/object:Gem::Requirement
|
446
446
|
requirements:
|
447
447
|
- - "~>"
|
448
448
|
- !ruby/object:Gem::Version
|
449
|
-
version: '0'
|
449
|
+
version: '0.33'
|
450
450
|
- - ">="
|
451
451
|
- !ruby/object:Gem::Version
|
452
|
-
version: '0.
|
452
|
+
version: '0.33'
|
453
453
|
- !ruby/object:Gem::Dependency
|
454
454
|
name: phare
|
455
455
|
requirement: !ruby/object:Gem::Requirement
|
456
456
|
requirements:
|
457
457
|
- - "~>"
|
458
458
|
- !ruby/object:Gem::Version
|
459
|
-
version: '0'
|
459
|
+
version: '0.7'
|
460
460
|
- - ">="
|
461
461
|
- !ruby/object:Gem::Version
|
462
|
-
version: '0.
|
462
|
+
version: '0.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: '0'
|
469
|
+
version: '0.7'
|
470
470
|
- - ">="
|
471
471
|
- !ruby/object:Gem::Version
|
472
|
-
version: '0.
|
472
|
+
version: '0.7'
|
473
473
|
- !ruby/object:Gem::Dependency
|
474
474
|
name: yard
|
475
475
|
requirement: !ruby/object:Gem::Requirement
|
476
476
|
requirements:
|
477
477
|
- - "~>"
|
478
478
|
- !ruby/object:Gem::Version
|
479
|
-
version: '0'
|
479
|
+
version: '0.8'
|
480
480
|
- - ">="
|
481
481
|
- !ruby/object:Gem::Version
|
482
482
|
version: 0.8.7
|
@@ -486,7 +486,7 @@ dependencies:
|
|
486
486
|
requirements:
|
487
487
|
- - "~>"
|
488
488
|
- !ruby/object:Gem::Version
|
489
|
-
version: '0'
|
489
|
+
version: '0.8'
|
490
490
|
- - ">="
|
491
491
|
- !ruby/object:Gem::Version
|
492
492
|
version: 0.8.7
|
@@ -496,7 +496,7 @@ dependencies:
|
|
496
496
|
requirements:
|
497
497
|
- - "~>"
|
498
498
|
- !ruby/object:Gem::Version
|
499
|
-
version: '0'
|
499
|
+
version: '0.1'
|
500
500
|
- - ">="
|
501
501
|
- !ruby/object:Gem::Version
|
502
502
|
version: '0.1'
|
@@ -506,7 +506,7 @@ dependencies:
|
|
506
506
|
requirements:
|
507
507
|
- - "~>"
|
508
508
|
- !ruby/object:Gem::Version
|
509
|
-
version: '0'
|
509
|
+
version: '0.1'
|
510
510
|
- - ">="
|
511
511
|
- !ruby/object:Gem::Version
|
512
512
|
version: '0.1'
|
@@ -516,27 +516,27 @@ dependencies:
|
|
516
516
|
requirements:
|
517
517
|
- - "~>"
|
518
518
|
- !ruby/object:Gem::Version
|
519
|
-
version: '3'
|
519
|
+
version: '3.3'
|
520
520
|
- - ">="
|
521
521
|
- !ruby/object:Gem::Version
|
522
|
-
version: 3.
|
522
|
+
version: '3.3'
|
523
523
|
type: :development
|
524
524
|
prerelease: false
|
525
525
|
version_requirements: !ruby/object:Gem::Requirement
|
526
526
|
requirements:
|
527
527
|
- - "~>"
|
528
528
|
- !ruby/object:Gem::Version
|
529
|
-
version: '3'
|
529
|
+
version: '3.3'
|
530
530
|
- - ">="
|
531
531
|
- !ruby/object:Gem::Version
|
532
|
-
version: 3.
|
532
|
+
version: '3.3'
|
533
533
|
- !ruby/object:Gem::Dependency
|
534
534
|
name: github-markup
|
535
535
|
requirement: !ruby/object:Gem::Requirement
|
536
536
|
requirements:
|
537
537
|
- - "~>"
|
538
538
|
- !ruby/object:Gem::Version
|
539
|
-
version: '1'
|
539
|
+
version: '1.3'
|
540
540
|
- - ">="
|
541
541
|
- !ruby/object:Gem::Version
|
542
542
|
version: 1.3.3
|
@@ -546,7 +546,7 @@ dependencies:
|
|
546
546
|
requirements:
|
547
547
|
- - "~>"
|
548
548
|
- !ruby/object:Gem::Version
|
549
|
-
version: '1'
|
549
|
+
version: '1.3'
|
550
550
|
- - ">="
|
551
551
|
- !ruby/object:Gem::Version
|
552
552
|
version: 1.3.3
|
@@ -556,27 +556,27 @@ dependencies:
|
|
556
556
|
requirements:
|
557
557
|
- - "~>"
|
558
558
|
- !ruby/object:Gem::Version
|
559
|
-
version: '0'
|
559
|
+
version: '0.6'
|
560
560
|
- - ">="
|
561
561
|
- !ruby/object:Gem::Version
|
562
|
-
version: 0.
|
562
|
+
version: '0.6'
|
563
563
|
type: :development
|
564
564
|
prerelease: false
|
565
565
|
version_requirements: !ruby/object:Gem::Requirement
|
566
566
|
requirements:
|
567
567
|
- - "~>"
|
568
568
|
- !ruby/object:Gem::Version
|
569
|
-
version: '0'
|
569
|
+
version: '0.6'
|
570
570
|
- - ">="
|
571
571
|
- !ruby/object:Gem::Version
|
572
|
-
version: 0.
|
572
|
+
version: '0.6'
|
573
573
|
- !ruby/object:Gem::Dependency
|
574
574
|
name: guard-inch
|
575
575
|
requirement: !ruby/object:Gem::Requirement
|
576
576
|
requirements:
|
577
577
|
- - "~>"
|
578
578
|
- !ruby/object:Gem::Version
|
579
|
-
version: '0'
|
579
|
+
version: '0.1'
|
580
580
|
- - ">="
|
581
581
|
- !ruby/object:Gem::Version
|
582
582
|
version: 0.1.0
|
@@ -586,7 +586,7 @@ dependencies:
|
|
586
586
|
requirements:
|
587
587
|
- - "~>"
|
588
588
|
- !ruby/object:Gem::Version
|
589
|
-
version: '0'
|
589
|
+
version: '0.1'
|
590
590
|
- - ">="
|
591
591
|
- !ruby/object:Gem::Version
|
592
592
|
version: 0.1.0
|