capistrano_multiconfig_parallel 2.0.0.rc3 → 2.0.0.rc4

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: 37e1fd5e54ce834910e9d5a10bc8b8fda48d7fcc
4
- data.tar.gz: 26042aa56996fccd7368b8cabff50d085b1f6014
3
+ metadata.gz: ac23d7c22bd2218a3698e42af759ca31f5acc788
4
+ data.tar.gz: 36698d180f0f36eb03c7d31d6a7de9151083c577
5
5
  SHA512:
6
- metadata.gz: 98552410ce19198066f3b6d5c13750e398a550cbc30261531f923b38909286e3cdc8ce73be8b7a9d449cb9cb24b06ab520ee113861221f7d85a125c287fb803c
7
- data.tar.gz: 1ceb4b40efe8193f5a9ed568685f36c86c6f5e39fa82d5174eb5c5d8b6255546d600880807833ed4893a7edbeb277922ade06ae4edb95be6d48d56c4c28893e5
6
+ metadata.gz: 40ca91f76026730c6a2202980b01a697ce81da78f2929405d2add331abc2c43b74a68db273d4698def4eaf9356814b0fa481f263fa340a8924c7e33ba89ed99c
7
+ data.tar.gz: 9874920c58f868739a8aa9a07a2d03c0d873a6850d3ce4838b87b6f14b27b6dd171dc0f3228dab9289664616cac78ced4a38e8a46709ac53b6da4765e67f15d2
@@ -30,6 +30,7 @@ Gem::Specification.new do |s|
30
30
  s.add_runtime_dependency 'inquirer', '~> 0.2', '>= 0.2'
31
31
  s.add_runtime_dependency 'devnull','~> 0.1', '>= 0.1'
32
32
  s.add_runtime_dependency 'capistrano_sentinel', '>= 0.0', '>= 0.0.16'
33
+ s.add_runtime_dependency 'ruby-progressbar', '~> 1.8', '>= 1.8.1'
33
34
 
34
35
  s.add_development_dependency 'rake', '>= 10.4', '>= 10.4'
35
36
  s.add_development_dependency 'rspec', '~> 3.4', '>= 3.4'
@@ -20,6 +20,7 @@ require 'configliere'
20
20
  require 'devnull'
21
21
  require 'inquirer'
22
22
  require "capistrano_sentinel"
23
+ require 'ruby-progressbar'
23
24
 
24
25
  require 'etc'
25
26
  require 'logger'
@@ -4,7 +4,8 @@ module CapistranoMulticonfigParallel
4
4
  class Application
5
5
  include CapistranoMulticonfigParallel::ApplicationHelper
6
6
 
7
- attr_reader :stage_apps, :top_level_tasks, :jobs, :condition, :manager, :dependency_tracker, :application, :stage, :name, :args, :argv, :default_stage
7
+ attr_reader :stage_apps, :top_level_tasks, :jobs, :condition, :manager, :dependency_tracker, :application, :stage, :name, :args, :argv, :default_stage,:patched_job_paths
8
+ attr_writer :patched_job_paths
8
9
 
9
10
  def initialize
10
11
  Celluloid.boot unless Celluloid.running?
@@ -12,6 +13,8 @@ module CapistranoMulticonfigParallel
12
13
  @stage_apps = multi_apps? ? app_names_from_stages : []
13
14
  collect_command_line_tasks(CapistranoMulticonfigParallel.original_args)
14
15
  @jobs = []
16
+ @checked_job_paths = []
17
+ @patched_job_paths = [] # for deploy
15
18
  end
16
19
 
17
20
  def start
@@ -50,13 +53,13 @@ module CapistranoMulticonfigParallel
50
53
  end
51
54
 
52
55
  def verify_valid_data
53
- return if @top_level_tasks != ['default']
54
- raise_invalid_job_config
56
+ return if @top_level_tasks != ['default']
57
+ raise_invalid_job_config
55
58
  end
56
59
 
57
60
  def raise_invalid_job_config
58
- puts 'Invalid execution, please call something such as `multi_cap production deploy`, where production is a stage you have defined'.red
59
- exit(false)
61
+ puts 'Invalid execution, please call something such as `multi_cap production deploy`, where production is a stage you have defined'.red
62
+ exit(false)
60
63
  end
61
64
 
62
65
  def initialize_data
@@ -105,7 +108,6 @@ module CapistranoMulticonfigParallel
105
108
 
106
109
  def process_jobs
107
110
  return unless @jobs.present?
108
- FileUtils.rm Dir["#{log_directory}/worker_*.log"]
109
111
  if configuration.multi_secvential.to_s.downcase == 'true'
110
112
  @jobs.each(&:execute_standard_deploy)
111
113
  else
@@ -153,6 +155,8 @@ module CapistranoMulticonfigParallel
153
155
  end
154
156
 
155
157
  def run
158
+ FileUtils.rm Dir["#{log_directory}/worker_*.log"]
159
+ FileUtils.rm Dir["#{log_directory}/multi_cap_worker_*.log"]
156
160
  options = {}
157
161
  if custom_command?
158
162
  options = verify_options_custom_command(options)
@@ -214,17 +218,27 @@ module CapistranoMulticonfigParallel
214
218
 
215
219
  env_options = options['env_options']
216
220
  job_env_options = custom_command? ? env_options.except(action_key) : env_options
221
+
217
222
  job = CapistranoMulticonfigParallel::Job.new(self, options.merge(
218
- action: custom_command? && env_options[action_key].present? ? env_options[action_key] : options['action'],
219
- env_options: job_env_options,
220
- path: job_path(options)
223
+ action: custom_command? && env_options[action_key].present? ? env_options[action_key] : options['action'],
224
+ env_options: job_env_options,
225
+ path: job_path(options)
221
226
 
222
227
  ))
228
+ if job.job_gemfile.present?
229
+ if !@checked_job_paths.include?(job.job_path)
230
+ @checked_job_paths << job.job_path
231
+ bundler_worker = CapistranoMulticonfigParallel::BundlerWorker.new
232
+ bundler_worker.work(job) # make sure we have installed the dependencies first for this application
233
+ end
234
+ else
235
+ raise "Please make sure you have a Gemfile in the project root directory #{job.job_path}"
236
+ end
223
237
  if job.find_capfile.blank?
224
238
  raise "Please make sure you have a Capfile in the project root directory #{job.job_path}"
225
239
  end
226
240
  unless job.capistrano_sentinel_needs_updating?
227
- raise "Please consider upgrading the gem #{job.capistrano_sentinel_name} to version #{job.loaded_capistrano_sentinel_version} from #{job.job_capistrano_sentinel_version} in #{job.job_path} "
241
+ raise "Please consider upgrading the gem #{job.capistrano_sentinel_name} to version #{job.loaded_capistrano_sentinel_version} from #{job.job_capistrano_sentinel_version} in #{job.job_path} "
228
242
  end
229
243
  @jobs << job unless job_can_tag_staging?(job)
230
244
  end
@@ -234,7 +248,8 @@ module CapistranoMulticonfigParallel
234
248
  end
235
249
 
236
250
  def job_path(options)
237
- options.fetch("path", nil).present? ? options["path"] : detect_root
251
+ path = options["path"].present? ? options["path"] : nil
252
+ path.present? && File.directory?(path) ? path : detect_root
238
253
  end
239
254
 
240
255
  def job_stage_valid?(options)
@@ -1,34 +1,67 @@
1
1
  require_relative './celluloid_worker'
2
2
  require_relative './process_runner'
3
- require_relative '../classes/runner_status'
3
+ require_relative '../classes/bundler_status'
4
4
  module CapistranoMulticonfigParallel
5
5
  class BundlerWorker
6
6
  include CapistranoMulticonfigParallel::BaseActorHelper
7
7
 
8
- def work(job, options = {}, &callback)
8
+ attr_reader *[
9
+ :job,
10
+ :job_id,
11
+ :runner_status,
12
+ :log_prefix,
13
+ :checked_bundler_deps,
14
+ :total_dependencies,
15
+ :show_bundler
16
+ ]
17
+
18
+ def work(job)
9
19
  @job = job
10
- @options = options.symbolize_keys
11
20
  @job_id = job.id
12
21
  @runner_status = nil
22
+ @log_prefix = 'bundler'
23
+ @checked_bundler_deps = []
24
+ @total_dependencies = bundler_dependencies.size
25
+ @show_bundler = true
26
+ progress_bar
13
27
  check_missing_deps
14
28
  end
15
29
 
16
- def actor_id
17
- "bundler_worker_#{@job_id}".to_sym
30
+ def progress_bar
31
+ @progress_bar ||= ProgressBar.create(:title => "Checking app #{File.basename(@job.job_path)} bundler dependencies ", :starting_at => 0, :total => @total_dependencies.to_i, length: 160, :format => '%a |%b>>%i| %p%% %t | Processed: %c from %C gem dependencies')
32
+ end
33
+
34
+ def bundler_dependencies
35
+ builder = Bundler::Dsl.new
36
+ builder.eval_gemfile(@job.job_gemfile)
37
+ definition = builder.to_definition(@job.job_gemfile_lock, {})
38
+ @bundler_dependencies ||= definition.dependencies
39
+ end
40
+
41
+ def show_bundler_progress(data)
42
+ @show_bundler = false if data.to_s.include?("The Gemfile's dependencies are satisfied") || data.to_s.include?("Bundle complete")
43
+ gem_spec = bundler_dependencies.find{|spec| data.include?(spec.name) }
44
+ if @show_bundler == true && gem_spec.present?
45
+ @checked_bundler_deps = [gem_spec.name]
46
+ progress_bar.increment
47
+ elsif @show_bundler == false
48
+ progress_bar.finish
49
+ end
18
50
  end
19
51
 
20
52
  def check_missing_deps
21
53
  command = @job.fetch_bundler_worker_command
22
- log_to_file("bundler worker #{@job_id} executes: #{command}")
54
+ log_to_file("bundler worker #{@job_id} executes: #{command}", job_id: @job_id, prefix: @log_prefix)
23
55
  do_bundle_sync_command(command)
24
56
  end
25
57
 
26
58
  def do_bundle_sync_command(command)
27
- CapistranoMulticonfigParallel::ProcessRunner.supervise as: actor_id
28
- result = Celluloid::Actor[actor_id].work(@job, command,sync: :sync, :callback => lambda { |runner_status| @runner_status = runner_status } )
59
+ process_runner = CapistranoMulticonfigParallel::ProcessRunner.new
60
+ process_runner.work(@job, command, process_sync: :sync, actor: Actor.current, log_prefix: @log_prefix, runner_status_klass: CapistranoMulticonfigParallel::BundlerStatus, :callback => lambda {|runner_status| @runner_status = runner_status })
29
61
  sleep(0.1) until @runner_status.present?
30
- @runner_status.output_text.include?("The Gemfile's dependencies are satisfied")
62
+ @runner_status.output_text
31
63
  end
32
64
 
65
+
33
66
  end
34
67
  end
@@ -236,7 +236,7 @@ module CapistranoMulticonfigParallel
236
236
  mailbox = worker.mailbox
237
237
  log_to_file("worker_died: worker job #{job.inspect} with mailbox #{mailbox.inspect} and #{mailbox.address.inspect} died for reason: #{reason}")
238
238
  return true if job.blank? || job.rolling_back? || job.action != 'deploy'
239
- job.rollback_changes_to_application
239
+ #job.rollback_changes_to_application
240
240
  @worker_to_job.delete(mailbox.address)
241
241
  log_to_file("RESTARTING: worker job #{job.inspect} with mailbox #{mailbox.inspect} and #{mailbox.address.inspect} died for reason: #{reason}")
242
242
 
@@ -100,7 +100,7 @@ module CapistranoMulticonfigParallel
100
100
  check_child_proces
101
101
  command = job.fetch_deploy_command
102
102
  log_to_file("worker #{@job_id} executes: #{command}")
103
- @child_process.async.work(@job, command, actor: Actor.current, silent: true,sync: :async, runner_status_klass: CapistranoMulticonfigParallel::ChildProcessStatus)
103
+ @child_process.async.work(@job, command, actor: Actor.current, silent: true, process_sync: :async, runner_status_klass: CapistranoMulticonfigParallel::ChildProcessStatus)
104
104
  end
105
105
 
106
106
  def check_child_proces
@@ -186,12 +186,9 @@ module CapistranoMulticonfigParallel
186
186
  @manager.workers_terminated.signal('completed') if !@job.marked_for_dispatching_new_job? && @manager.present? && @manager.alive? && @manager.all_workers_finished?
187
187
  end
188
188
 
189
- def mark_for_dispatching_new_job
190
- @job.will_dispatch_new_job = @job.new_jobs_dispatched.size + 1 unless @job.rolling_back?
191
- end
192
189
 
193
- def notify_finished(exit_status)
194
- mark_for_dispatching_new_job if exit_status != 0
190
+ def notify_finished(exit_status, _runner_status)
191
+ @job.mark_for_dispatching_new_job if exit_status != 0
195
192
  @job.exit_status = exit_status
196
193
  finish_worker(exit_status)
197
194
  return if exit_status == 0
@@ -27,14 +27,14 @@ module CapistranoMulticonfigParallel
27
27
 
28
28
  @runner_status_klass = @options[:runner_status_klass].present? ? @options[:runner_status_klass] : RunnerStatus
29
29
  @runner_status = @runner_status_klass.new(Actor.current, job, cmd, @options)
30
- @synchronicity = @options[:sync]
30
+ @synchronicity = @options[:process_sync]
31
31
  start_running
32
32
  end
33
33
 
34
34
  def start_running
35
35
  setup_attributes
36
36
  run_right_popen3
37
- setup_em_error_handler if @synchronicity == :async
37
+ setup_em_error_handler
38
38
  end
39
39
 
40
40
  def setup_attributes
@@ -63,9 +63,9 @@ module CapistranoMulticonfigParallel
63
63
  log_to_file("worker #{@job_id} startsnotify finished with exit status #{exit_status.inspect}")
64
64
  if @actor.present? && @actor.respond_to?(:notify_finished)
65
65
  if @actor.respond_to?(:async) && @synchronicity == :async
66
- @actor.async.notify_finished(exit_status)
67
- elsif @synchronicity == :sync
68
- @actor.notify_finished(exit_status)
66
+ @actor.async.notify_finished(exit_status, @runner_status)
67
+ else
68
+ @actor.notify_finished(exit_status, @runner_status)
69
69
  end
70
70
  end
71
71
  end
@@ -96,7 +96,6 @@ module CapistranoMulticonfigParallel
96
96
 
97
97
  def run_right_popen3_sync(command, popen3_options)
98
98
  do_right_popen3_sync(command, popen3_options)
99
- sleep(0.1) until @runner_status.exit_status.present?
100
99
  end
101
100
 
102
101
  def run_right_popen3_async(command, popen3_options)
@@ -0,0 +1,28 @@
1
+ require_relative './runner_status'
2
+ module CapistranoMulticonfigParallel
3
+ # class that is used to execute the capistrano tasks and it is invoked by the celluloid worker
4
+ class BundlerStatus < CapistranoMulticonfigParallel::RunnerStatus
5
+
6
+ def on_read_stdout(data)
7
+ show_bundler_progress(data)
8
+ super(data)
9
+ end
10
+
11
+ def show_bundler_progress(data)
12
+ data = data.strip
13
+ return if data.blank? || data == '.'
14
+ if @actor.present? && @actor.respond_to?(:show_bundler_progress)
15
+ call_bundler_progress(data)
16
+ end
17
+ end
18
+
19
+ def call_bundler_progress(data)
20
+ if @actor.respond_to?(:async)
21
+ @actor.async.show_bundler_progress(data)
22
+ else
23
+ @actor.show_bundler_progress(data)
24
+ end
25
+ end
26
+
27
+ end
28
+ end
@@ -65,7 +65,7 @@ module CapistranoMulticonfigParallel
65
65
  end
66
66
 
67
67
  def io_callback(io, data)
68
- log_to_file("#{io.upcase} ---- #{data}", job_id: @job_id)
68
+ log_to_worker(data, io)
69
69
  end
70
70
  end
71
71
  end
@@ -15,9 +15,11 @@ module CapistranoMulticonfigParallel
15
15
  @options = options.stringify_keys
16
16
  @application = application
17
17
  @manager = @application.manager
18
- @gitflow ||= command.gitflow_enabled?
19
18
  end
20
19
 
20
+ def gitflow
21
+ @gitflow ||= command.gitflow_enabled?
22
+ end
21
23
 
22
24
  def save_stderr_error(data)
23
25
  return unless development_debug?
@@ -111,7 +113,6 @@ module CapistranoMulticonfigParallel
111
113
 
112
114
  def setup_additional_env_variables(value)
113
115
  value["#{env_variable}"] = id
114
- value["capistrano_version"] = job_capistrano_version
115
116
  end
116
117
 
117
118
  def finished?
@@ -126,6 +127,11 @@ module CapistranoMulticonfigParallel
126
127
  ['deploy:rollback'].include?(action)
127
128
  end
128
129
 
130
+ def mark_for_dispatching_new_job
131
+ return if rolling_back?
132
+ will_dispatch_new_job = new_jobs_dispatched.size + 1
133
+ end
134
+
129
135
  def marked_for_dispatching_new_job?
130
136
  will_dispatch_new_job.to_i != new_jobs_dispatched.size
131
137
  end
@@ -12,14 +12,13 @@ module CapistranoMulticonfigParallel
12
12
  def initialize(job)
13
13
  @job = job
14
14
  @job_final_gemfile = job_gemfile_multi
15
- @legacy_capistrano = legacy_capistrano? ? true : false
16
15
  end
17
16
 
18
17
  def lockfile_parser
19
18
  if File.exists?(job_gemfile) && File.exists?(job_gemfile_lock)
20
19
  @lockfile_parser ||= Bundler::LockfileParser.new(Bundler.read_file("#{job_gemfile_lock}"))
21
20
  else
22
- raise RuntimeError, "please install the gems separately for this application #{job_path} and re-try again!"
21
+ raise "please install the gems separately for this application #{job_path} and re-try again!"
23
22
  end
24
23
  end
25
24
 
@@ -28,12 +27,12 @@ module CapistranoMulticonfigParallel
28
27
  end
29
28
 
30
29
  def fetch_bundler_worker_command
31
- get_command_script(fetch_bundler_check_command)
30
+ get_command_script(fetch_bundler_check_command, "bundler")
32
31
  end
33
32
 
34
33
 
35
34
  def find_capfile(custom_path = job_path)
36
- @capfile_path ||= Pathname.new(custom_path).children.find { |file| check_file(file, 'capfile') }
35
+ @capfile_path ||= find_file_by_names(custom_path, 'capfile').first
37
36
  end
38
37
 
39
38
  def capfile_name
@@ -109,13 +108,13 @@ module CapistranoMulticonfigParallel
109
108
  array_options = []
110
109
  filtered_keys = options.delete(:filtered_keys) || []
111
110
  env_options.each do |key, value|
112
- array_options << "#{env_prefix(key, @legacy_capistrano)} #{env_key_format(key, @legacy_capistrano)}=#{value}" if value.present? && !env_option_filtered?(key, filtered_keys)
111
+ array_options << "#{env_prefix(key, legacy_capistrano)} #{env_key_format(key, legacy_capistrano)}=#{value}" if value.present? && !env_option_filtered?(key, filtered_keys)
113
112
  end
114
113
  setup_remaining_flags(array_options, options)
115
114
  end
116
115
 
117
116
  def setup_remaining_flags(array_options, options)
118
- array_options << trace_flag(@legacy_capistrano) if app_debug_enabled?
117
+ array_options << trace_flag(legacy_capistrano) if app_debug_enabled?
119
118
  array_options.concat(setup_flags_for_job(options))
120
119
  end
121
120
 
@@ -128,10 +127,14 @@ module CapistranoMulticonfigParallel
128
127
  @job_capistrano_version ||= job_gem_version("capistrano")
129
128
  end
130
129
 
131
- def legacy_capistrano?
130
+ def legacy_capistrano_version?
132
131
  verify_gem_version(job_capistrano_version, '3.0', operator: '<')
133
132
  end
134
133
 
134
+ def legacy_capistrano
135
+ @legacy_capistrano ||= legacy_capistrano_version? ? true : false
136
+ end
137
+
135
138
  def capistrano_sentinel_needs_updating?
136
139
  if capistrano_sentinel_available?
137
140
  loaded_capistrano_sentinel_version == job_capistrano_sentinel_version
@@ -198,7 +201,15 @@ module CapistranoMulticonfigParallel
198
201
  rvm_enabled_for_job? ? "bash --login -c '#{command}'" : command
199
202
  end
200
203
 
201
- def get_command_script(command)
204
+ def log_to_worker(message, action = nil)
205
+ if action.present? || action.to_s == id.to_s
206
+ log_to_file(message, job_id: id, prefix: action)
207
+ else
208
+ log_to_file(message)
209
+ end
210
+ end
211
+
212
+ def get_command_script(command, action = nil)
202
213
  command = rvm_bash_prefix(command)
203
214
  command = command.inspect
204
215
  command_text =<<-CMD
@@ -211,13 +222,13 @@ module CapistranoMulticonfigParallel
211
222
 
212
223
  if rvm_enabled_for_job?
213
224
  create_job_tempfile_command(command_text)
214
- log_to_file "JOB #{@job_id} created Tempfile #{@tempfile.path} with contents #{File.read(@tempfile.path)}"
225
+ log_to_worker("JOB #{@job_id} created Tempfile #{@tempfile.path} with contents #{File.read(@tempfile.path)}", action)
215
226
  "ruby #{@tempfile.path}"
216
227
  else
217
228
  final_command=<<-CMD
218
229
  cd #{job_path} && bundle exec ruby -e "#{command_text}"
219
230
  CMD
220
- log_to_file "JOB #{@job_id} prepared command #{final_command}"
231
+ log_to_worker("JOB #{@job_id} prepared command #{final_command}", action)
221
232
  final_command
222
233
  end
223
234
  end
@@ -250,12 +261,15 @@ module CapistranoMulticonfigParallel
250
261
  end
251
262
 
252
263
  def prepare_application_for_deployment
253
- if ENV['MULTI_CAP_WEB_APP'].present?
254
- bundler_worker = CapistranoMulticonfigParallel::BundlerWorker.new
255
- result = bundler_worker.work(job)
264
+ config = @job.application.patched_job_paths.find{|hash| hash[:path] == job_path}
265
+ if config.present?
266
+ @job_final_gemfile = config[:gemfile]
267
+ @job_final_capfile = config[:capfile]
268
+ else
269
+ check_capistrano_sentinel_availability
270
+ prepare_capfile
271
+ @job.application.patched_job_paths << {path: job_path, gemfile: @job_final_gemfile, capfile: @job_final_capfile}
256
272
  end
257
- check_capistrano_sentinel_availability
258
- prepare_capfile
259
273
  end
260
274
 
261
275
  def check_capistrano_sentinel_availability
@@ -307,17 +321,7 @@ module CapistranoMulticonfigParallel
307
321
  def rollback_changes_to_application
308
322
  FileUtils.rm_rf(job_gemfile_multi) if File.exists?(job_gemfile_multi)
309
323
  FileUtils.rm_rf("#{job_gemfile_multi}.lock") if File.exists?("#{job_gemfile_multi}.lock")
310
- unless capistrano_sentinel_available?
311
- File.open(job_capfile, 'r') do |f|
312
- File.open("#{job_capfile}.tmp", 'w') do |f2|
313
- f.each_line do |line|
314
- f2.write(line) unless line.include?(capistrano_sentinel_name)
315
- end
316
- end
317
- end
318
- FileUtils.mv "#{job_capfile}.tmp", job_capfile
319
- FileUtils.rm_rf("#{job_capfile}.tmp")
320
- end
324
+ FileUtils.rm_rf(job_capfile_multi) if File.exists?(job_capfile_multi)
321
325
  FileUtils.rm_rf(@tempfile.path) if defined?(@tempfile) && @tempfile
322
326
  end
323
327
 
@@ -331,7 +335,7 @@ module CapistranoMulticonfigParallel
331
335
  private
332
336
 
333
337
  def run_shell_command(command)
334
- sh("#{command}")
338
+ Kernel.system("#{command}")
335
339
  end
336
340
  end
337
341
  end
@@ -52,49 +52,59 @@ module CapistranoMulticonfigParallel
52
52
  @async_exception = nil
53
53
  end
54
54
 
55
+ def log_to_worker(message, io = nil)
56
+ if io.present?
57
+ log_to_file("#{io.upcase} ---- #{message}", job_id: @job_id, prefix: @options[:log_prefix])
58
+ elsif @options[:log_prefix].present?
59
+ log_to_file(message, job_id: @job_id, prefix: @options[:log_prefix])
60
+ else
61
+ log_to_file(message)
62
+ end
63
+ end
64
+
55
65
  def on_pid(pid)
56
- log_to_file "Child process for worker #{@job_id} on_pid #{pid.inspect}"
66
+ log_to_worker"Child process for worker #{@job_id} on_pid #{pid.inspect}"
57
67
  @pid ||= pid
58
68
  end
59
69
 
60
70
 
61
71
  def on_input_stdin(data)
62
- log_to_file "Child process for worker #{@job_id} on_input_stdin #{data.inspect}"
63
- @output_text << data
72
+ log_to_worker(data, "stdin")
73
+ @output_text << data
64
74
  end
65
75
 
66
76
  def on_read_stdout(data)
67
- log_to_file "Child process for worker #{@job_id} on_read_stdout #{data.inspect}"
77
+ log_to_worker(data, "stdout")
68
78
  @output_text << data
69
79
  end
70
80
 
71
81
  def on_read_stderr(data)
72
- log_to_file "Child process for worker #{@job_id} on_read_stderr #{data.inspect}"
82
+ log_to_worker(data, "stderr")
73
83
  @error_text << data
74
84
  end
75
85
 
76
86
 
77
87
  def on_timeout
78
- log_to_file "Child process for worker #{@job_id} on_timeout disconnected"
88
+ log_to_worker "Child process for worker #{@job_id} on_timeout disconnected"
79
89
  @did_timeout = true
80
- @callback.call(self) if @callback && @expect_timeout
90
+ @callback.call(self) if @callback && process_runner.synchronicity == :sync && @expect_timeout
81
91
  end
82
92
 
83
93
  def on_size_limit
84
- log_to_file "Child process for worker #{@job_id} on_size_limit disconnected"
94
+ log_to_worker "Child process for worker #{@job_id} on_size_limit disconnected"
85
95
  @did_size_limit = true
86
- @callback.call(self) if @callback && @expect_size_limit
96
+ @callback.call(self) if @callback && process_runner.synchronicity == :sync && @expect_size_limit
87
97
  end
88
98
 
89
99
  def on_exit(status)
90
- log_to_file "Child process for worker #{@job_id} on_exit disconnected due to error #{status.inspect}"
100
+ log_to_worker "Child process for worker #{@job_id} on_exit disconnected due to #{status.inspect}"
91
101
  @exit_status = status.exitstatus
92
- @callback.call(self) if @callback
102
+ @callback.call(self) if @callback && process_runner.synchronicity == :sync
93
103
  end
94
104
 
95
105
  def async_exception_handler(async_exception)
96
106
  @async_exception = async_exception
97
- log_to_file "Child process for worker #{@job_id} async_exception_handler disconnected due to error #{data.inspect}"
107
+ log_to_worker "Child process for worker #{@job_id} async_exception_handler disconnected due to error #{data.inspect}"
98
108
  @exit_status = 1
99
109
  end
100
110
 
@@ -84,7 +84,7 @@ module CapistranoMulticonfigParallel
84
84
  end
85
85
 
86
86
  def log_to_file(message, options = {})
87
- worker_log = options.fetch(:job_id, '').present? ? find_worker_log(options[:job_id]) : logger
87
+ worker_log = options.fetch(:job_id, '').present? ? find_worker_log(options[:job_id], options[:prefix]) : logger
88
88
  print_to_log_file(worker_log, options.merge(message: message)) if worker_log.present? && app_debug_enabled?
89
89
  end
90
90
 
@@ -94,10 +94,10 @@ module CapistranoMulticonfigParallel
94
94
  end
95
95
  end
96
96
 
97
- def find_worker_log(job_id)
97
+ def find_worker_log(job_id, prefix = nil)
98
98
  return if job_id.blank?
99
99
  FileUtils.mkdir_p(log_directory) unless File.directory?(log_directory)
100
- filename = File.join(log_directory, "worker_#{job_id}.log")
100
+ filename = File.join(log_directory, "multi_cap_worker_#{prefix.present? ? "#{prefix}_" : ''}#{job_id}.log")
101
101
  setup_filename_logger(filename)
102
102
  end
103
103
 
@@ -125,6 +125,15 @@ module CapistranoMulticonfigParallel
125
125
  root.children.find { |file| check_file(file, filename) }.present? || pathname_is_root?(root)
126
126
  end
127
127
 
128
+ def find_file_by_names(custom_path = detect_root, names = ['capfile'])
129
+ names = names.is_a?(Array) ? names : [names]
130
+ pathnames = names.collect do |name|
131
+ Pathname.new(custom_path).children.find { |file| check_file(file, name) }
132
+ end
133
+ pathnames.present? && pathnames.is_a?(Array) ? pathnames.compact : pathnames
134
+ end
135
+
136
+
128
137
  def try_detect_file(filename = 'capfile')
129
138
  root = pwd_parent_dir
130
139
  root = root.parent until find_file_in_directory(root, filename)
@@ -10,7 +10,7 @@ module CapistranoMulticonfigParallel
10
10
  MAJOR = 2
11
11
  MINOR = 0
12
12
  TINY = 0
13
- PRE = 'rc3'
13
+ PRE = 'rc4'
14
14
 
15
15
  STRING = [MAJOR, MINOR, TINY, PRE].compact.join('.')
16
16
  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: 2.0.0.rc3
4
+ version: 2.0.0.rc4
5
5
  platform: ruby
6
6
  authors:
7
7
  - bogdanRada
@@ -258,6 +258,26 @@ dependencies:
258
258
  - - ">="
259
259
  - !ruby/object:Gem::Version
260
260
  version: 0.0.16
261
+ - !ruby/object:Gem::Dependency
262
+ name: ruby-progressbar
263
+ requirement: !ruby/object:Gem::Requirement
264
+ requirements:
265
+ - - "~>"
266
+ - !ruby/object:Gem::Version
267
+ version: '1.8'
268
+ - - ">="
269
+ - !ruby/object:Gem::Version
270
+ version: 1.8.1
271
+ type: :runtime
272
+ prerelease: false
273
+ version_requirements: !ruby/object:Gem::Requirement
274
+ requirements:
275
+ - - "~>"
276
+ - !ruby/object:Gem::Version
277
+ version: '1.8'
278
+ - - ">="
279
+ - !ruby/object:Gem::Version
280
+ version: 1.8.1
261
281
  - !ruby/object:Gem::Dependency
262
282
  name: rake
263
283
  requirement: !ruby/object:Gem::Requirement
@@ -491,6 +511,7 @@ files:
491
511
  - lib/capistrano_multiconfig_parallel/celluloid/state_machine.rb
492
512
  - lib/capistrano_multiconfig_parallel/celluloid/terminal_table.rb
493
513
  - lib/capistrano_multiconfig_parallel/celluloid/web_server.rb
514
+ - lib/capistrano_multiconfig_parallel/classes/bundler_status.rb
494
515
  - lib/capistrano_multiconfig_parallel/classes/child_process_status.rb
495
516
  - lib/capistrano_multiconfig_parallel/classes/cursor.rb
496
517
  - lib/capistrano_multiconfig_parallel/classes/dependency_tracker.rb