capistrano_multiconfig_parallel 0.1.4 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 5e6f19bd4a7bf784e65f3bc34d3e49bb9e09cbe0
4
- data.tar.gz: 69ce6bff1ffa9bb244ee9c12e6a035850c458be5
3
+ metadata.gz: f5a35a7ede67c601da4e663947e5e58fb0e83065
4
+ data.tar.gz: 9307b72fb8716cf0117307eb5d9a5c86169b5601
5
5
  SHA512:
6
- metadata.gz: 500a0d5722c22bc3d00abfedd395050a7ce693fd9eec858cb4fc5d4f6ef82c62ce782b5cfb15aa6426fabf284f54dc4f0d3f1baee62b3ee00909ce74cfe41fbf
7
- data.tar.gz: 7be10e250b4ed0e1c3990e4071816203022b0b7b20d34a8f60a1a1d475ec469b8ffd6a782b976e2e47fa193a80944c6276ea1f4e668c54a17225555875e202a5
6
+ metadata.gz: 4ac2faaeabb21aae54db13122d077fd0a93d973fd172f54bd38c12d75fbbaa28f035eba4da08f643ad977e01f97300d45fa046ff6c0e986fa690e3d03277b046
7
+ data.tar.gz: dc6cbf259342a4f4e44e663e97a41b7295cb42286fb164f0780de80c4e631348b156fe74bcf5b5e778d92f049cb874ed956afbac76681fa0cec6a1d03eaa486b
@@ -56,9 +56,12 @@ module CapistranoMulticonfigParallel
56
56
  def enable_logging
57
57
  CapistranoMulticonfigParallel.configuration_valid?
58
58
  return unless CapistranoMulticonfigParallel::CelluloidManager.debug_enabled
59
- FileUtils.mkdir_p(log_directory)
60
- log_file = File.open(main_log_file, 'w')
61
- log_file.sync = true
59
+ FileUtils.mkdir_p(log_directory) unless File.directory?(log_directory)
60
+ FileUtils.touch(main_log_file) unless File.file?(main_log_file)
61
+ if ENV[CapistranoMulticonfigParallel::ENV_KEY_JOB_ID].blank?
62
+ log_file = File.open(main_log_file, 'w')
63
+ log_file.sync = true
64
+ end
62
65
  self.logger = ::Logger.new(main_log_file)
63
66
  Celluloid.logger = logger
64
67
  end
@@ -90,32 +90,52 @@ module CapistranoMulticonfigParallel
90
90
  end
91
91
 
92
92
  def process_jobs(&block)
93
- @job_to_worker.pmap do |_job_id, worker|
93
+ @job_to_worker.pmap do |job_id, worker|
94
+ setup_worker_conditions(job_id)
94
95
  worker.async.start_task
95
96
  end
96
- if block_given?
97
- block.call
98
- else
99
- wait_task_confirmations
97
+ block_given? ? block.call : wait_task_confirmations
98
+ until @job_to_worker.all?{|job_id, worker| worker.alive? && worker.worker_state =='finished'}
99
+ sleep(0.1) # keep current thread alive
100
100
  end
101
- results2 = []
102
- @job_to_condition.pmap do |_job_id, hash|
103
- results2 << hash[:last_condition].wait
101
+ mark_completed_remaining_tasks
102
+ @job_manager.condition.signal("completed")
103
+ end
104
+
105
+ def setup_worker_conditions(job_id)
106
+ hash_conditions = {}
107
+ if need_confirmations?
108
+ CapistranoMulticonfigParallel.configuration.task_confirmations.each do |task|
109
+ hash_conditions[task] = { condition: Celluloid::Condition.new, status: 'unconfirmed' }
110
+ end
104
111
  end
105
- @job_manager.condition.signal(results2) if results2.size == @jobs.size
112
+ @job_to_condition[job_id] = hash_conditions
106
113
  end
107
114
 
108
115
  def need_confirmations?
109
116
  CapistranoMulticonfigParallel.configuration.task_confirmation_active.to_s.downcase == 'true'
110
117
  end
111
118
 
119
+ def mark_completed_remaining_tasks
120
+ return unless need_confirmations?
121
+ CapistranoMulticonfigParallel.configuration.task_confirmations.each_with_index do |task, index|
122
+ @jobs.pmap do |job_id, _job|
123
+ fake_result = proc{ |sum| sum }
124
+ task_confirmation = @job_to_condition[job_id][task]
125
+ if task_confirmation[:status] != 'confirmed'
126
+ task_confirmation[:status] = 'confirmed'
127
+ task_confirmation[:condition].signal(fake_result)
128
+ end
129
+ end
130
+ end
131
+ end
132
+
112
133
  def wait_task_confirmations
113
134
  return unless need_confirmations?
114
135
  CapistranoMulticonfigParallel.configuration.task_confirmations.each_with_index do |task, index|
115
136
  results = []
116
137
  @jobs.pmap do |job_id, _job|
117
- current_job = @job_to_condition[job_id][:first_condition][index]
118
- result = current_job.respond_to?(:wait) ? current_job.wait : current_job
138
+ result = @job_to_condition[job_id][task][:condition].wait
119
139
  results << result
120
140
  end
121
141
  if results.size == @jobs.size
@@ -124,6 +144,7 @@ module CapistranoMulticonfigParallel
124
144
  end
125
145
  end
126
146
 
147
+
127
148
  def confirm_task_approval(results, task)
128
149
  return unless results.present?
129
150
  if results.detect {|x| !x.is_a?(Proc)}
@@ -23,19 +23,19 @@ module CapistranoMulticonfigParallel
23
23
  class TaskFailed < StandardError; end
24
24
 
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
- :rake_tasks, :current_task_number, # tracking tasks
27
- :successfull_subscription, :subscription_channel, :publisher_channel, # for subscriptions and publishing events
28
- :task_confirmations, :manager_condition, :last_manager_condition # for task conifirmations from manager
26
+ :rake_tasks, :current_task_number, # tracking tasks
27
+ :successfull_subscription, :subscription_channel, :publisher_channel, # for subscriptions and publishing events
28
+ :job_termination_condition, :worker_state
29
29
 
30
30
  def work(job, manager)
31
31
  @job = job
32
+ @worker_state = 'started'
32
33
  @manager = manager
33
-
34
+ @job_confirmation_conditions = []
34
35
  process_job(job) if job.present?
35
36
  debug("worker #{@job_id} received #{job.inspect}") if debug_enabled?
36
37
  @subscription_channel = "worker_#{@job_id}"
37
38
  @machine = CapistranoMulticonfigParallel::StateMachine.new(job, Actor.current)
38
- setup_worker_condition
39
39
  manager.register_worker_for_job(job, Actor.current)
40
40
  end
41
41
 
@@ -45,7 +45,6 @@ module CapistranoMulticonfigParallel
45
45
 
46
46
  def start_task
47
47
  debug("exec worker #{@job_id} starts task with #{@job.inspect}") if debug_enabled?
48
- @task_confirmations = CapistranoMulticonfigParallel.configuration.task_confirmations
49
48
  @client = CelluloidPubsub::Client.connect(actor: Actor.current, enable_debug: @manager.class.debug_websocket?) do |ws|
50
49
  ws.subscribe(@subscription_channel)
51
50
  end
@@ -124,8 +123,10 @@ module CapistranoMulticonfigParallel
124
123
  end
125
124
 
126
125
  def task_approval(message)
127
- if @task_confirmations.include?(message['task']) && message['action'] == 'invoke'
128
- @manager_condition[message['task']].call(message['task'])
126
+ if CapistranoMulticonfigParallel.configuration.task_confirmations.include?(message['task']) && message['action'] == 'invoke'
127
+ task_confirmation = @manager.job_to_condition[@job_id][message['task']]
128
+ task_confirmation[:status] = 'confirmed'
129
+ task_confirmation[:condition].signal(message['task'])
129
130
  else
130
131
  publish_rake_event(message.merge('approved' => 'yes'))
131
132
  end
@@ -181,43 +182,6 @@ module CapistranoMulticonfigParallel
181
182
  @task_arguments = job['task_arguments']
182
183
  end
183
184
 
184
- def need_confirmation_for_tasks?
185
- executes_deploy? == true && @manager.need_confirmations?
186
- end
187
-
188
- def executes_deploy?
189
- (@action_name == 'deploy' || @action_name == 'deploy:rollback')
190
- end
191
-
192
- def setup_worker_condition
193
- job_termination_condition = Celluloid::Condition.new
194
- job_confirmation_conditions = []
195
- CapistranoMulticonfigParallel.configuration.task_confirmations.each do |_task|
196
- if need_confirmation_for_tasks?
197
- job_confirmation_conditions << Celluloid::Condition.new
198
- else
199
- job_confirmation_conditions << proc { |sum| sum }
200
- end
201
- end
202
- @manager.job_to_condition[@job_id] = { first_condition: job_confirmation_conditions, last_condition: job_termination_condition }
203
- construct_blocks_for_conditions(job_confirmation_conditions, job_termination_condition)
204
- end
205
-
206
- def construct_blocks_for_conditions(job_confirmation_conditions, job_termination_condition)
207
- hash_conditions = {}
208
- CapistranoMulticonfigParallel.configuration.task_confirmations.each_with_index do |task, index|
209
- blk = lambda do |sum|
210
- need_confirmation_for_tasks? ? job_confirmation_conditions[index].signal(sum) : job_confirmation_conditions[index].call(sum)
211
- end
212
- hash_conditions[task] = blk
213
- end
214
- blk_termination = lambda do |sum|
215
- job_termination_condition.signal(sum)
216
- end
217
- @manager_condition = hash_conditions
218
- @last_manager_condition = blk_termination
219
- end
220
-
221
185
  def crashed?
222
186
  @action_name == 'deploy:rollback'
223
187
  end
@@ -225,13 +189,21 @@ module CapistranoMulticonfigParallel
225
189
  def notify_finished(exit_status)
226
190
  return unless @execute_deploy
227
191
  if exit_status.exitstatus != 0
228
- debug("worker #{job_id} tries to terminate")
192
+ debug("worker #{job_id} tries to terminate") if debug_enabled?
229
193
  terminate
230
194
  else
231
195
  update_machine_state('FINISHED')
232
- debug("worker #{job_id} notifies manager has finished")
233
- @last_manager_condition.call('yes')
196
+ debug("worker #{job_id} notifies manager has finished") if debug_enabled?
197
+ @worker_state = "finished"
198
+ if debug_enabled?
199
+ debug("worker #{job_id}has state #{@worker_state}")
200
+ @manager.job_to_worker.each{|job_id, worker|
201
+ debug("worker #{worker.job_id}has state #{worker.worker_state}") if worker.alive?
202
+ }
203
+ end
234
204
  end
235
205
  end
206
+
207
+
236
208
  end
237
209
  end
@@ -6,14 +6,6 @@ module CapistranoMulticonfigParallel
6
6
 
7
7
  attr_accessor :actor, :pid, :exit_status, :process, :filename,:worker_log
8
8
 
9
- def finalize
10
- EM.stop
11
- @timer.cancel
12
- super
13
- true
14
- end
15
-
16
- alias_method :terminate, :finalize
17
9
 
18
10
  def work(cmd, options = {})
19
11
  @options = options
@@ -10,7 +10,6 @@ module CapistranoMulticonfigParallel
10
10
  if $stdout.isatty
11
11
  $stdout.sync = true
12
12
  end
13
- CapistranoMulticonfigParallel.enable_logging
14
13
  CapistranoMulticonfigParallel::Application.new.run
15
14
  rescue Interrupt
16
15
  `stty icanon echo`
@@ -13,6 +13,7 @@ module CapistranoMulticonfigParallel
13
13
  @top_level_tasks = top_level_tasks
14
14
  @stages = stages
15
15
  @jobs = []
16
+ CapistranoMulticonfigParallel.enable_logging
16
17
  CapistranoMulticonfigParallel.configuration_valid?
17
18
  CapistranoMulticonfigParallel.verify_app_dependencies(@stages) if CapistranoMulticonfigParallel.configuration.track_dependencies
18
19
  end
@@ -7,8 +7,8 @@ module CapistranoMulticonfigParallel
7
7
  # module used for generating the version
8
8
  module VERSION
9
9
  MAJOR = 0
10
- MINOR = 1
11
- TINY = 4
10
+ MINOR = 2
11
+ TINY = 0
12
12
  PRE = nil
13
13
 
14
14
  STRING = [MAJOR, MINOR, TINY, PRE].compact.join('.')
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.1.4
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - bogdanRada