capistrano_multiconfig_parallel 0.10.0 → 0.11.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/capistrano_multiconfig_parallel/celluloid/celluloid_worker.rb +14 -5
- data/lib/capistrano_multiconfig_parallel/celluloid/rake_worker.rb +21 -18
- data/lib/capistrano_multiconfig_parallel/celluloid/terminal_table.rb +21 -17
- data/lib/capistrano_multiconfig_parallel/extensions/extension_helper.rb +53 -31
- data/lib/capistrano_multiconfig_parallel/extensions/rake.rb +2 -5
- data/lib/capistrano_multiconfig_parallel/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2bdac07ad222d4fcad77e8a8ec5f18898262f834
|
4
|
+
data.tar.gz: 212281163ee493733d40eb1af17ecc2a5dfd7c9c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e7454e4f6f02a655932e940e50cadc77b6c19d7a551257b2d57d11219589635fec8b694d06b498725868ab7135dbce26f980284c44b9b2b6500ec65caf16118f
|
7
|
+
data.tar.gz: ab3f5c6f1c059582d90994e5c2150a9ab551da7ce4e9f840fb685ba2e3782245d47bcb13b23cd8da786e4d77d07ae15fb9ed5a40c05935f1fd6b9385230f872c
|
@@ -25,11 +25,12 @@ module CapistranoMulticonfigParallel
|
|
25
25
|
attr_accessor :job, :manager, :job_id, :app_name, :env_name, :action_name, :env_options, :machine, :client, :task_argv, :execute_deploy, :executed_dry_run,
|
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, :executing_dry_run
|
28
|
+
:job_termination_condition, :worker_state, :executing_dry_run, :job_argv
|
29
29
|
|
30
30
|
def work(job, manager)
|
31
31
|
@job = job
|
32
32
|
@worker_state = 'started'
|
33
|
+
@executing_dry_run = nil
|
33
34
|
@manager = manager
|
34
35
|
@job_confirmation_conditions = []
|
35
36
|
process_job(job) if job.present?
|
@@ -74,8 +75,7 @@ module CapistranoMulticonfigParallel
|
|
74
75
|
if @action_name != 'deploy:rollback' && CapistranoMulticonfigParallel.show_task_progress
|
75
76
|
@executed_dry_run = true
|
76
77
|
@rake_tasks = []
|
77
|
-
|
78
|
-
setup_task_arguments( '--dry-run','count_rake=true' )
|
78
|
+
setup_task_arguments(dry_run_command,'count_rake=true' )
|
79
79
|
@child_process = CapistranoMulticonfigParallel::ChildProcess.new
|
80
80
|
Actor.current.link @child_process
|
81
81
|
debug("worker #{@job_id} executes: #{generate_command}") if debug_enabled?
|
@@ -106,7 +106,6 @@ module CapistranoMulticonfigParallel
|
|
106
106
|
setup_task_arguments
|
107
107
|
debug("worker #{@job_id} executes: #{generate_command}") if debug_enabled?
|
108
108
|
@child_process.async.work(generate_command, actor: Actor.current, silent: true)
|
109
|
-
@executing_dry_run = false
|
110
109
|
@manager.wait_task_confirmations_worker(Actor.current)
|
111
110
|
end
|
112
111
|
|
@@ -130,6 +129,8 @@ module CapistranoMulticonfigParallel
|
|
130
129
|
end
|
131
130
|
|
132
131
|
def handle_subscription(message)
|
132
|
+
@executing_dry_run = message['action'] == 'count' ? true : false
|
133
|
+
@manager.jobs[@job_id]['job_argv'] = @job_argv
|
133
134
|
if message_is_about_a_task?(message)
|
134
135
|
check_gitflow
|
135
136
|
save_tasks_to_be_executed(message)
|
@@ -187,6 +188,14 @@ module CapistranoMulticonfigParallel
|
|
187
188
|
@task_argv
|
188
189
|
end
|
189
190
|
|
191
|
+
def dry_run_command
|
192
|
+
'--dry-run'
|
193
|
+
end
|
194
|
+
|
195
|
+
def dry_running?
|
196
|
+
@task_argv.include?(dry_run_command) == true
|
197
|
+
end
|
198
|
+
|
190
199
|
def worker_stage
|
191
200
|
@app_name.present? ? "#{@app_name}:#{@env_name}" : "#{@env_name}"
|
192
201
|
end
|
@@ -205,7 +214,7 @@ module CapistranoMulticonfigParallel
|
|
205
214
|
args.each do |arg|
|
206
215
|
array_options << arg
|
207
216
|
end
|
208
|
-
@
|
217
|
+
@job_argv= array_options.clone
|
209
218
|
array_options.unshift("#{worker_action}")
|
210
219
|
array_options.unshift("#{worker_stage}")
|
211
220
|
setup_command_line(*array_options)
|
@@ -11,29 +11,24 @@ module CapistranoMulticonfigParallel
|
|
11
11
|
|
12
12
|
|
13
13
|
|
14
|
-
def
|
15
|
-
@initialize_options = options.stringify_keys
|
16
|
-
@questions_prompted ||=[]
|
17
|
-
@stdin_result = nil
|
18
|
-
@job_id = @initialize_options['job_id']
|
19
|
-
@subscription_channel = @initialize_options['actor_id']
|
20
|
-
@publisher_channel = "worker_#{@job_id}"
|
21
|
-
@task_approved = false
|
22
|
-
@successfull_subscription = false
|
23
|
-
initialize_subscription
|
24
|
-
end
|
25
|
-
|
26
|
-
|
27
|
-
def work(env, options = {})
|
14
|
+
def work(env, options = {})
|
28
15
|
@options = options.stringify_keys
|
29
16
|
@env = env
|
30
|
-
|
17
|
+
default_settings
|
18
|
+
custom_attributes
|
19
|
+
initialize_subscription
|
20
|
+
end
|
21
|
+
|
22
|
+
def custom_attributes
|
23
|
+
@publisher_channel = "worker_#{@job_id}"
|
24
|
+
@action = @options['actor_id'].include?('_count') ? 'count' : 'invoke'
|
31
25
|
@task = @options['task']
|
32
|
-
wait_execution until @successfull_subscription == true && defined?(@client)
|
33
|
-
publish_to_worker(task_data)
|
34
26
|
end
|
35
27
|
|
36
|
-
|
28
|
+
def publish_new_work(env, new_options = {})
|
29
|
+
work(env, @options.merge(new_options))
|
30
|
+
publish_to_worker(task_data)
|
31
|
+
end
|
37
32
|
|
38
33
|
def wait_execution(name = task_name, time = 0.1)
|
39
34
|
# info "Before waiting #{name}"
|
@@ -47,6 +42,13 @@ module CapistranoMulticonfigParallel
|
|
47
42
|
# info "done waiting on #{name} "
|
48
43
|
end
|
49
44
|
|
45
|
+
def default_settings
|
46
|
+
@stdin_result = nil
|
47
|
+
@job_id = @options['job_id']
|
48
|
+
@subscription_channel = @options['actor_id']
|
49
|
+
@task_approved = false
|
50
|
+
@successfull_subscription = false
|
51
|
+
end
|
50
52
|
|
51
53
|
def initialize_subscription
|
52
54
|
@client = CelluloidPubsub::Client.connect(actor: Actor.current, enable_debug: debug_enabled?) do |ws|
|
@@ -80,6 +82,7 @@ module CapistranoMulticonfigParallel
|
|
80
82
|
if @client.succesfull_subscription?(message)
|
81
83
|
debug("Rake worker #{@job_id} received parse #{message}") if debug_enabled?
|
82
84
|
@successfull_subscription = true
|
85
|
+
publish_to_worker(task_data)
|
83
86
|
elsif message.present? && message['task'].present?
|
84
87
|
task_approval(message)
|
85
88
|
elsif message.present? && message['action'].present? && message['action'] == 'stdin'
|
@@ -112,8 +112,13 @@ module CapistranoMulticonfigParallel
|
|
112
112
|
{ value: "#{details['state']}" }
|
113
113
|
]
|
114
114
|
if CapistranoMulticonfigParallel.show_task_progress
|
115
|
-
|
116
|
-
|
115
|
+
if worker.alive?
|
116
|
+
row << { value: worker.rake_tasks.size }
|
117
|
+
row << { value: worker_progress(details, worker) }
|
118
|
+
else
|
119
|
+
row << { value: 0 }
|
120
|
+
row << { value: worker_state(worker) }
|
121
|
+
end
|
117
122
|
end
|
118
123
|
table.add_row(row)
|
119
124
|
table.add_separator if @manager.jobs.keys.last.to_i != job_id.to_i
|
@@ -123,22 +128,21 @@ module CapistranoMulticonfigParallel
|
|
123
128
|
system('cls') || system('clear') || puts("\e[H\e[2J")
|
124
129
|
end
|
125
130
|
|
126
|
-
def
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
131
|
+
def worker_dry_running?(worker)
|
132
|
+
worker.alive? && worker.dry_running?
|
133
|
+
end
|
134
|
+
|
135
|
+
def worker_progress(details, worker)
|
136
|
+
return worker_state(worker) unless worker.alive?
|
137
|
+
return if worker.executing_dry_run.nil?
|
138
|
+
tasks = worker.alive? ? worker.rake_tasks : []
|
139
|
+
current_task = worker_state(worker)
|
140
|
+
total_tasks = worker_dry_running?(worker) ? nil : tasks.size
|
141
|
+
task_index = worker_dry_running?(worker) ? 0 : tasks.index(current_task).to_i + 1
|
132
142
|
stringio = StringIO.new
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
progress.refresh
|
137
|
-
else
|
138
|
-
progress = ProgressBar.create(:format => '%a |%b %i| %p%% Completed', :output => stringio, :length => 40, :total => nil, :unknown_progress_animation_steps => ['==>', '>==', '=>='])
|
139
|
-
progress.increment
|
140
|
-
progress.refresh
|
141
|
-
end
|
143
|
+
progress_bar = ProgressBar.create(:output => stringio, :starting_at => task_index, :total => total_tasks, :length => 40, title: "JOB #{details['job_id']}: #{task_index.to_s} of #{total_tasks}")
|
144
|
+
progress_bar.refresh
|
145
|
+
progress_bar.stop
|
142
146
|
stringio.rewind
|
143
147
|
result = stringio.read
|
144
148
|
result = result.gsub("\r\n", '')
|
@@ -4,43 +4,65 @@ require_relative './input_stream'
|
|
4
4
|
require_relative './output_stream'
|
5
5
|
module CapistranoMulticonfigParallel
|
6
6
|
class ExtensionHelper
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
def rake_actor_id
|
18
|
-
ENV['count_rake'].present? ? "rake_worker_#{job_id}_count" : "rake_worker_#{job_id}"
|
19
|
-
end
|
20
|
-
|
21
|
-
def actor
|
22
|
-
CapistranoMulticonfigParallel::RakeWorker.supervise_as(rake_actor_id,
|
23
|
-
actor_id: rake_actor_id,
|
24
|
-
job_id: job_id) if Celluloid::Actor[rake_actor_id].blank?
|
25
|
-
Celluloid::Actor[rake_actor_id]
|
26
|
-
end
|
27
|
-
|
28
|
-
def run_the_actor(task, &block)
|
29
|
-
actor.work(ENV, task: task)
|
7
|
+
|
8
|
+
attr_accessor :task, :env
|
9
|
+
def initialize(env, task)
|
10
|
+
@env = env
|
11
|
+
@task = task
|
12
|
+
end
|
13
|
+
|
14
|
+
def work(&block)
|
15
|
+
if job_id.present?
|
16
|
+
actor_start_working
|
30
17
|
actor.wait_execution until actor.task_approved
|
31
|
-
return unless
|
32
|
-
|
33
|
-
|
34
|
-
CapistranoMulticonfigParallel::InputStream.hook(actor, stringio)
|
18
|
+
return unless actor.task_approved
|
19
|
+
actor_execute_block(&block)
|
20
|
+
else
|
35
21
|
block.call
|
36
|
-
CapistranoMulticonfigParallel::InputStream.unhook
|
37
|
-
CapistranoMulticonfigParallel::OutputStream.unhook
|
38
22
|
end
|
39
|
-
|
40
|
-
|
23
|
+
end
|
41
24
|
|
42
25
|
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
|
30
|
+
def actor_execute_block(&block)
|
31
|
+
stringio = StringIO.new
|
32
|
+
CapistranoMulticonfigParallel::OutputStream.hook(stringio)
|
33
|
+
CapistranoMulticonfigParallel::InputStream.hook(actor, stringio)
|
34
|
+
block.call
|
35
|
+
CapistranoMulticonfigParallel::InputStream.unhook
|
36
|
+
CapistranoMulticonfigParallel::OutputStream.unhook
|
37
|
+
end
|
38
|
+
|
39
|
+
def actor_start_working
|
40
|
+
if actor.blank?
|
41
|
+
CapistranoMulticonfigParallel::RakeWorker.supervise_as rake_actor_id
|
42
|
+
actor.work(@env, actor_id: rake_actor_id, job_id: job_id, task: @task)
|
43
|
+
else
|
44
|
+
actor.publish_new_work(@env, task: @task)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def supervise_actor
|
49
|
+
CapistranoMulticonfigParallel::RakeWorker.supervise_as(rake_actor_id,
|
50
|
+
actor_id: rake_actor_id,
|
51
|
+
job_id: job_id) if actor.blank?
|
52
|
+
end
|
53
|
+
|
54
|
+
def actor
|
55
|
+
Celluloid::Actor[rake_actor_id]
|
56
|
+
end
|
57
|
+
|
58
|
+
def job_id
|
59
|
+
@env[CapistranoMulticonfigParallel::ENV_KEY_JOB_ID]
|
60
|
+
end
|
61
|
+
|
43
62
|
|
63
|
+
def rake_actor_id
|
64
|
+
@env['count_rake'].present? ? "rake_worker_#{job_id}_count" : "rake_worker_#{job_id}"
|
44
65
|
end
|
66
|
+
|
45
67
|
end
|
46
68
|
end
|
@@ -3,11 +3,8 @@ Rake::Task.class_eval do
|
|
3
3
|
alias_method :original_execute, :execute
|
4
4
|
|
5
5
|
def execute(*args)
|
6
|
-
|
7
|
-
|
8
|
-
original_execute(*args)
|
9
|
-
end
|
10
|
-
else
|
6
|
+
rake = CapistranoMulticonfigParallel::ExtensionHelper.new(ENV, self)
|
7
|
+
rake.work do
|
11
8
|
original_execute(*args)
|
12
9
|
end
|
13
10
|
end
|