capistrano_multiconfig_parallel 0.16.2 → 0.17.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 +4 -4
- data/Gemfile.lock +1 -1
- data/README.md +10 -10
- data/img/interactive_menu.png +0 -0
- data/lib/capistrano_multiconfig_parallel/all.rb +1 -1
- data/lib/capistrano_multiconfig_parallel/application.rb +11 -73
- data/lib/capistrano_multiconfig_parallel/base.rb +31 -13
- data/lib/capistrano_multiconfig_parallel/celluloid/rake_worker.rb +19 -8
- data/lib/capistrano_multiconfig_parallel/{helpers → classes}/dependency_tracker.rb +0 -0
- data/lib/capistrano_multiconfig_parallel/{helpers → classes}/input_stream.rb +0 -0
- data/lib/capistrano_multiconfig_parallel/{helpers → classes}/interactive_menu.rb +0 -0
- data/lib/capistrano_multiconfig_parallel/{helpers → classes}/output_stream.rb +0 -0
- data/lib/capistrano_multiconfig_parallel/{helpers → classes}/rake_hook_actor.rb +0 -0
- data/lib/capistrano_multiconfig_parallel/{helpers → classes}/standard_deploy.rb +1 -1
- data/lib/capistrano_multiconfig_parallel/cli.rb +36 -18
- data/lib/capistrano_multiconfig_parallel/{initializers → configuration}/default.yml +0 -0
- data/lib/capistrano_multiconfig_parallel/helpers/application_helper.rb +45 -0
- data/lib/capistrano_multiconfig_parallel/helpers/configuration.rb +1 -17
- data/lib/capistrano_multiconfig_parallel/helpers/{helper.rb → core_helper.rb} +40 -55
- data/lib/capistrano_multiconfig_parallel/helpers/stages_helper.rb +33 -0
- data/lib/capistrano_multiconfig_parallel/{extensions → initializers}/rake.rb +1 -1
- data/lib/capistrano_multiconfig_parallel/version.rb +2 -2
- metadata +13 -11
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 383ca1a8dd3caa6d1ae38370f3a3f5b7d05c6dbc
|
4
|
+
data.tar.gz: 4a2bce60bf821d9f65692c40fd133c67e5e77a04
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a426aff1833349f6862f9aa2bd42f4f3e249df4057659f86f29a1e3c60e2682c4b474c7c0bbf8f4b25ef1f1400351aaf10fd85e6ae9e96ea1c40b2b54fe6f4c0
|
7
|
+
data.tar.gz: 5b3ed5196838866db3f1b4369785f3eb0fc49dec74665139e4dde7488f9ccf1995dc8542be6045125224c1ea4f724e47b36ddef3cbe2628a0d35ec683e872875
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -22,17 +22,17 @@ Requirements
|
|
22
22
|
|
23
23
|
1. [Ruby 1.9.x or Ruby 2.x.x](http://www.ruby-lang.org)
|
24
24
|
2. [ActiveSuport >= 4.2.0](https://rubygems.org/gems/activesupport)
|
25
|
-
3. [celluloid-pmap >= 0.2.
|
25
|
+
3. [celluloid-pmap >= 0.2.2](https://github.com/jwo/celluloid-pmap)
|
26
26
|
4. [composable_state_machine >= 1.0.2](https://github.com/swoop-inc/composable_state_machine)
|
27
|
-
5. [terminal-table >= 1.
|
28
|
-
6. [colorize](https://github.com/fazibear/colorize)
|
29
|
-
7. [eventmachine >= 1.0.
|
27
|
+
5. [terminal-table >= 1.5.2](https://github.com/tj/terminal-table)
|
28
|
+
6. [colorize >= 0.7](https://github.com/fazibear/colorize)
|
29
|
+
7. [eventmachine >= 1.0.3](https://github.com/eventmachine/eventmachine)
|
30
30
|
8. [right_popen >= 1.1.3](https://github.com/rightscale/right_popen)
|
31
|
-
9. [capistrano
|
32
|
-
10. [
|
33
|
-
11. [
|
34
|
-
12. [
|
35
|
-
13. [
|
31
|
+
9. [capistrano >= 3.0](https://github.com/capistrano/capistrano/)
|
32
|
+
10. [configliere >= 0.4](https://github.com/infochimps-platform/configliere)
|
33
|
+
11. [inquirer >= 0.2](https://github.com/arlimus/inquirer.rb)
|
34
|
+
12. [devnull >= 0.1](https://github.com/arlimus/inquirer.rb)
|
35
|
+
13. [versionomy >= 0.4.4](https://github.com/dazuma/versionomy)
|
36
36
|
|
37
37
|
Compatibility
|
38
38
|
-------------
|
@@ -46,7 +46,7 @@ Rubinius and Jruby support temporarily dropped due to Rails 4 incompatibility.
|
|
46
46
|
Installation Instructions
|
47
47
|
-------------------------
|
48
48
|
|
49
|
-
Add the following to your Gemfile
|
49
|
+
Add the following to your Gemfile after requiring **capistrano** and **capistrano-multiconfig**:
|
50
50
|
|
51
51
|
```ruby
|
52
52
|
gem "capistrano_multiconfig_parallel"
|
data/img/interactive_menu.png
CHANGED
Binary file
|
@@ -27,7 +27,7 @@ require 'stringio'
|
|
27
27
|
# fix error with not files that can not be found
|
28
28
|
Gem.find_files('composable_state_machine/**/*.rb').each { |path| require path }
|
29
29
|
|
30
|
-
Gem.find_files('capistrano_multiconfig_parallel/
|
30
|
+
Gem.find_files('capistrano_multiconfig_parallel/classes/**/*.rb').each { |path| require path }
|
31
31
|
Gem.find_files('capistrano_multiconfig_parallel/helpers/**/*.rb').each { |path| require path }
|
32
32
|
Gem.find_files('capistrano_multiconfig_parallel/celluloid/**/*.rb').each { |path| require path }
|
33
33
|
|
@@ -4,57 +4,33 @@ module CapistranoMulticonfigParallel
|
|
4
4
|
class Application
|
5
5
|
include Celluloid
|
6
6
|
include Celluloid::Logger
|
7
|
+
include CapistranoMulticonfigParallel::StagesHelper
|
8
|
+
include CapistranoMulticonfigParallel::ApplicationHelper
|
7
9
|
|
8
|
-
|
10
|
+
attr_reader :stages, :stage_apps, :top_level_tasks, :jobs, :branch_backup, :condition, :manager, :dependency_tracker, :application, :stage, :name, :args, :argv, :default_stage
|
9
11
|
|
10
12
|
def initialize
|
11
13
|
Celluloid.boot
|
12
14
|
@stages = fetch_stages
|
13
|
-
@stage_apps =
|
15
|
+
@stage_apps = multi_apps? ? @stages.map { |stage| stage.split(':').reverse[1] }.uniq : []
|
14
16
|
collect_command_line_tasks(CapistranoMulticonfigParallel.original_args)
|
15
17
|
@jobs = []
|
16
18
|
end
|
17
19
|
|
18
|
-
|
19
20
|
def start
|
20
|
-
verify_app_dependencies
|
21
|
+
verify_app_dependencies if multi_apps? && configuration.application_dependencies.present?
|
21
22
|
check_before_starting
|
22
23
|
initialize_data
|
23
24
|
run
|
24
25
|
end
|
25
26
|
|
26
|
-
def verify_app_dependencies
|
27
|
+
def verify_app_dependencies
|
27
28
|
wrong = configuration.application_dependencies.find do |hash|
|
28
29
|
!@stage_apps.include?(hash[:app]) || (hash[:dependencies].present? && hash[:dependencies].find { |val| !@stage_apps.include?(val) })
|
29
30
|
end
|
30
|
-
raise ArgumentError,"Invalid configuration for #{wrong.inspect}".red if wrong.present?
|
31
|
-
end
|
32
|
-
|
33
|
-
|
34
|
-
def fetch_stages
|
35
|
-
fetch_stages_paths do |paths|
|
36
|
-
paths.reject! { |path| check_stage_path(paths, path) }
|
37
|
-
paths.sort if paths.present?
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
def check_stage_path(paths, path)
|
42
|
-
paths.any? { |another| another != path && another.start_with?(path + ':') }
|
43
|
-
end
|
44
|
-
|
45
|
-
def stages_paths
|
46
|
-
stages_root = 'config/deploy'
|
47
|
-
Dir["#{stages_root}/**/*.rb"].map do |file|
|
48
|
-
file.slice(stages_root.size + 1..-4).tr('/', ':')
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
def fetch_stages_paths
|
53
|
-
stages_paths.tap { |paths| yield paths if block_given? }
|
31
|
+
raise ArgumentError, "Invalid configuration for #{wrong.inspect}".red if wrong.present?
|
54
32
|
end
|
55
33
|
|
56
|
-
|
57
|
-
|
58
34
|
def run_custom_command(options)
|
59
35
|
custom_stages = fetch_multi_stages
|
60
36
|
return if custom_stages.blank?
|
@@ -78,7 +54,6 @@ module CapistranoMulticonfigParallel
|
|
78
54
|
@argv['BRANCH'] = nil
|
79
55
|
end
|
80
56
|
|
81
|
-
|
82
57
|
def custom_command?
|
83
58
|
if multi_apps?
|
84
59
|
!@stages.include?(@top_level_tasks.first) && custom_commands.values.include?(@top_level_tasks.first)
|
@@ -100,7 +75,6 @@ module CapistranoMulticonfigParallel
|
|
100
75
|
CapistranoMulticonfigParallel.configuration
|
101
76
|
end
|
102
77
|
|
103
|
-
|
104
78
|
def initialize_data
|
105
79
|
@application = custom_command? ? nil : @top_level_tasks.first.split(':').reverse[1]
|
106
80
|
@stage = custom_command? ? nil : @top_level_tasks.first.split(':').reverse[0]
|
@@ -121,28 +95,6 @@ module CapistranoMulticonfigParallel
|
|
121
95
|
@top_level_tasks.push(Rake.application.default_task_name) if @top_level_tasks.blank?
|
122
96
|
end
|
123
97
|
|
124
|
-
def parse_task_string(string) # :nodoc:
|
125
|
-
/^([^\[]+)(?:\[(.*)\])$/ =~ string.to_s
|
126
|
-
|
127
|
-
name = Regexp.last_match(1)
|
128
|
-
remaining_args = Regexp.last_match(2)
|
129
|
-
|
130
|
-
return string, [] unless name
|
131
|
-
return name, [] if remaining_args.empty?
|
132
|
-
|
133
|
-
args = []
|
134
|
-
|
135
|
-
loop do
|
136
|
-
/((?:[^\\,]|\\.)*?)\s*(?:,\s*(.*))?$/ =~ remaining_args
|
137
|
-
|
138
|
-
remaining_args = Regexp.last_match(2)
|
139
|
-
args << Regexp.last_match(1).gsub(/\\(.)/, '\1')
|
140
|
-
break if remaining_args.blank?
|
141
|
-
end
|
142
|
-
|
143
|
-
[name, args]
|
144
|
-
end
|
145
|
-
|
146
98
|
def verify_options_custom_command(options)
|
147
99
|
options[:action] = @argv['ACTION'].present? ? @argv['ACTION'] : 'deploy'
|
148
100
|
options
|
@@ -181,10 +133,9 @@ module CapistranoMulticonfigParallel
|
|
181
133
|
CapistranoMulticonfigParallel.find_loaded_gem('capistrano-gitflow').present?
|
182
134
|
end
|
183
135
|
|
184
|
-
|
185
136
|
def fetch_multi_stages
|
186
137
|
custom_stages = @argv['STAGES'].blank? ? '' : @argv['STAGES']
|
187
|
-
custom_stages =
|
138
|
+
custom_stages = strip_characters_from_string(custom_stages).split(',').compact if custom_stages.present?
|
188
139
|
custom_stages = custom_stages.present? ? custom_stages : [@default_stage]
|
189
140
|
custom_stages
|
190
141
|
end
|
@@ -267,6 +218,7 @@ module CapistranoMulticonfigParallel
|
|
267
218
|
terminate
|
268
219
|
end
|
269
220
|
|
221
|
+
# rubocop:disable CyclomaticComplexity
|
270
222
|
def prepare_job(options)
|
271
223
|
options = options.stringify_keys
|
272
224
|
branch_name = options.fetch('branch', {})
|
@@ -302,24 +254,10 @@ module CapistranoMulticonfigParallel
|
|
302
254
|
options
|
303
255
|
end
|
304
256
|
|
305
|
-
def parse_inputted_value(options = {})
|
306
|
-
options = options.stringify_keys
|
307
|
-
value = options['value'].present? ? options['value'] : nil
|
308
|
-
if value.present?
|
309
|
-
branch = value.gsub("\r\n", '')
|
310
|
-
branch = branch.delete("\n") if branch.present?
|
311
|
-
branch = branch.gsub(/\s+/, ' ') if branch.present?
|
312
|
-
branch = branch.strip if branch.present?
|
313
|
-
return branch
|
314
|
-
else
|
315
|
-
return ''
|
316
|
-
end
|
317
|
-
end
|
318
|
-
|
319
257
|
def fetch_app_additional_env_options(variable)
|
320
258
|
options = {}
|
321
259
|
return options if variable.blank?
|
322
|
-
env_options =
|
260
|
+
env_options = strip_characters_from_string(variable)
|
323
261
|
env_options = env_options.split(' ')
|
324
262
|
options = multi_fetch_argv(env_options)
|
325
263
|
options.stringify_keys!
|
@@ -337,7 +275,7 @@ module CapistranoMulticonfigParallel
|
|
337
275
|
end
|
338
276
|
|
339
277
|
def execute_on_multiple_boxes(main_box_name, options)
|
340
|
-
boxes =
|
278
|
+
boxes = strip_characters_from_string(main_box_name).split(',').compact
|
341
279
|
boxes.each do |box_name|
|
342
280
|
options['env_options']['BOX'] = box_name
|
343
281
|
prepare_job(options)
|
@@ -1,24 +1,42 @@
|
|
1
1
|
# base module that has the statis methods that this gem is using
|
2
2
|
module CapistranoMulticonfigParallel
|
3
|
-
|
4
3
|
ENV_KEY_JOB_ID = 'multi_cap_job_id'
|
5
|
-
MULTI_KEY = 'multi'
|
6
|
-
SINGLE_KEY = 'single'
|
7
4
|
GITFLOW_TAG_STAGING_TASK = 'gitflow:tag_staging'
|
8
5
|
GITFLOW_CALCULATE_TAG_TASK = 'gitflow:calculate_tag'
|
9
6
|
GITFLOW_VERIFY_UPTODATE_TASK = 'gitflow:verify_up_to_date'
|
10
7
|
|
11
|
-
CUSTOM_COMMANDS = {
|
12
|
-
CapistranoMulticonfigParallel::MULTI_KEY => {
|
13
|
-
stages: 'deploy_multi_stages'
|
14
|
-
},
|
15
|
-
CapistranoMulticonfigParallel::SINGLE_KEY => {
|
16
|
-
stages: 'deploy_multi_stages'
|
17
|
-
}
|
18
|
-
}
|
19
|
-
|
20
8
|
class << self
|
21
|
-
|
9
|
+
attr_accessor :logger, :original_args
|
10
|
+
|
22
11
|
include CapistranoMulticonfigParallel::Configuration
|
12
|
+
include CapistranoMulticonfigParallel::ApplicationHelper
|
13
|
+
include CapistranoMulticonfigParallel::CoreHelper
|
14
|
+
|
15
|
+
def enable_logging
|
16
|
+
enable_file_logging
|
17
|
+
self.logger ||= ::Logger.new(DevNull.new)
|
18
|
+
Celluloid.logger = CapistranoMulticonfigParallel.logger
|
19
|
+
Celluloid.task_class = Celluloid::TaskThread
|
20
|
+
end
|
21
|
+
|
22
|
+
def enable_file_logging
|
23
|
+
return if configuration.multi_debug.to_s.downcase != 'true'
|
24
|
+
FileUtils.mkdir_p(log_directory) unless File.directory?(log_directory)
|
25
|
+
FileUtils.touch(main_log_file) unless File.file?(main_log_file)
|
26
|
+
log_file = File.open(main_log_file, 'w')
|
27
|
+
log_file.sync = true
|
28
|
+
self.logger = ::Logger.new(main_log_file)
|
29
|
+
end
|
30
|
+
|
31
|
+
def custom_commands
|
32
|
+
{
|
33
|
+
'multi ' => {
|
34
|
+
stages: 'deploy_multi_stages'
|
35
|
+
},
|
36
|
+
'single' => {
|
37
|
+
stages: 'deploy_multi_stages'
|
38
|
+
}
|
39
|
+
}
|
40
|
+
end
|
23
41
|
end
|
24
42
|
end
|
@@ -75,25 +75,34 @@ module CapistranoMulticonfigParallel
|
|
75
75
|
|
76
76
|
def on_message(message)
|
77
77
|
return unless message.present?
|
78
|
-
|
78
|
+
log_debug('on_message', message)
|
79
79
|
if @client.succesfull_subscription?(message)
|
80
|
-
|
81
|
-
|
82
|
-
publish_to_worker(task_data)
|
83
|
-
elsif message['task'].present?
|
80
|
+
publish_subscription_successfull(message)
|
81
|
+
elsif msg_for_task?(message) || msg_for_stdin?(message)
|
84
82
|
task_approval(message)
|
85
|
-
elsif message['action'].present? && message['action'] == 'stdin'
|
86
83
|
stdin_approval(message)
|
87
84
|
else
|
88
85
|
warn "unknown action: #{message.inspect}" if debug_enabled?
|
89
86
|
end
|
90
87
|
end
|
91
88
|
|
89
|
+
def log_debug(action, message)
|
90
|
+
debug("Rake worker #{@job_id} received after #{action}: #{message}") if debug_enabled?
|
91
|
+
end
|
92
|
+
|
92
93
|
def msg_for_stdin?(message)
|
93
94
|
message['action'] == 'stdin'
|
94
95
|
end
|
95
96
|
|
96
|
-
def
|
97
|
+
def msg_for_task?(message)
|
98
|
+
message['task'].present?
|
99
|
+
end
|
100
|
+
|
101
|
+
def publish_subscription_successfull(message)
|
102
|
+
return unless @client.succesfull_subscription?(message)
|
103
|
+
log_debug('publish_subscription_successfull', message)
|
104
|
+
@successfull_subscription = true
|
105
|
+
publish_to_worker(task_data)
|
97
106
|
end
|
98
107
|
|
99
108
|
def wait_for_stdin_input
|
@@ -104,7 +113,8 @@ module CapistranoMulticonfigParallel
|
|
104
113
|
end
|
105
114
|
|
106
115
|
def stdin_approval(message)
|
107
|
-
|
116
|
+
return unless msg_for_stdin?(message)
|
117
|
+
if @job_id.to_i == message['job_id'].to_i && message['result'].present?
|
108
118
|
@stdin_result = message['result']
|
109
119
|
else
|
110
120
|
warn "unknown invocation #{message.inspect}" if debug_enabled?
|
@@ -112,6 +122,7 @@ module CapistranoMulticonfigParallel
|
|
112
122
|
end
|
113
123
|
|
114
124
|
def task_approval(message)
|
125
|
+
return unless msg_for_task?(message)
|
115
126
|
if @job_id.to_i == message['job_id'].to_i && message['task'] == task_name && message['approved'] == 'yes'
|
116
127
|
@task_approved = true
|
117
128
|
else
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
@@ -4,7 +4,7 @@ module CapistranoMulticonfigParallel
|
|
4
4
|
class StandardDeploy
|
5
5
|
include FileUtils
|
6
6
|
|
7
|
-
|
7
|
+
attr_reader :app, :stage, :action, :task_arguments, :env_options
|
8
8
|
def initialize(options)
|
9
9
|
@app = options.fetch('app', '')
|
10
10
|
@stage = options.fetch('env', '')
|
@@ -1,26 +1,44 @@
|
|
1
1
|
require_relative './all'
|
2
|
-
Gem.find_files('capistrano_multiconfig_parallel/
|
2
|
+
Gem.find_files('capistrano_multiconfig_parallel/initializers/**/*.rb').each { |path| require path }
|
3
3
|
module CapistranoMulticonfigParallel
|
4
4
|
# this is the class that will be invoked from terminal , and willl use the invoke task as the primary function.
|
5
5
|
class CLI
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
6
|
+
class << self
|
7
|
+
# method used to start
|
8
|
+
def start
|
9
|
+
verify_validation
|
10
|
+
start_work
|
11
|
+
rescue Interrupt
|
12
|
+
rescue_interrupt
|
13
|
+
rescue => error
|
14
|
+
rescue_error(error)
|
15
|
+
end
|
16
|
+
|
17
|
+
def rescue_interrupt
|
18
|
+
`stty icanon echo`
|
19
|
+
$stderr.puts 'Command cancelled.'
|
20
|
+
end
|
21
|
+
|
22
|
+
def rescue_error(error)
|
23
|
+
$stderr.puts error
|
24
|
+
$stderr.puts error.backtrace if error.respond_to?(:backtrace)
|
25
|
+
exit(1)
|
26
|
+
end
|
27
|
+
|
28
|
+
def verify_validation
|
29
|
+
CapistranoMulticonfigParallel.check_terminal_tty
|
30
|
+
CapistranoMulticonfigParallel.original_args = ARGV.dup
|
31
|
+
CapistranoMulticonfigParallel.configuration_valid?
|
32
|
+
end
|
33
|
+
|
34
|
+
def start_work
|
35
|
+
job_manager = CapistranoMulticonfigParallel::Application.new
|
36
|
+
if job_manager.argv[CapistranoMulticonfigParallel::ENV_KEY_JOB_ID].blank?
|
37
|
+
job_manager.start
|
38
|
+
else
|
39
|
+
Capistrano::Application.new.run
|
40
|
+
end
|
16
41
|
end
|
17
|
-
rescue Interrupt
|
18
|
-
`stty icanon echo`
|
19
|
-
$stderr.puts 'Command cancelled.'
|
20
|
-
rescue => error
|
21
|
-
$stderr.puts error
|
22
|
-
$stderr.puts error.backtrace if error.respond_to?(:backtrace)
|
23
|
-
exit(1)
|
24
42
|
end
|
25
43
|
end
|
26
44
|
end
|
File without changes
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require_relative './core_helper'
|
2
|
+
module CapistranoMulticonfigParallel
|
3
|
+
# class that holds the options that are configurable for this gem
|
4
|
+
module ApplicationHelper
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
included do
|
7
|
+
def app_configuration
|
8
|
+
CapistranoMulticonfigParallel.configuration
|
9
|
+
end
|
10
|
+
|
11
|
+
def change_config_type(type)
|
12
|
+
['boolean'].include?(type) ? type.delete(':').to_sym : type.constantize
|
13
|
+
end
|
14
|
+
|
15
|
+
def strip_characters_from_string(value)
|
16
|
+
return unless value.present?
|
17
|
+
value = value.delete("\r\n").delete("\n")
|
18
|
+
value = value.gsub(/\s+/, ' ').strip if value.present?
|
19
|
+
value
|
20
|
+
end
|
21
|
+
|
22
|
+
def parse_task_string(string) # :nodoc:
|
23
|
+
/^([^\[]+)(?:\[(.*)\])$/ =~ string.to_s
|
24
|
+
|
25
|
+
name = Regexp.last_match(1)
|
26
|
+
remaining_args = Regexp.last_match(2)
|
27
|
+
|
28
|
+
return string, [] unless name
|
29
|
+
return name, [] if remaining_args.empty?
|
30
|
+
|
31
|
+
args = []
|
32
|
+
|
33
|
+
loop do
|
34
|
+
/((?:[^\\,]|\\.)*?)\s*(?:,\s*(.*))?$/ =~ remaining_args
|
35
|
+
|
36
|
+
remaining_args = Regexp.last_match(2)
|
37
|
+
args << Regexp.last_match(1).gsub(/\\(.)/, '\1')
|
38
|
+
break if remaining_args.blank?
|
39
|
+
end
|
40
|
+
|
41
|
+
[name, args]
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -4,14 +4,13 @@ module CapistranoMulticonfigParallel
|
|
4
4
|
extend ActiveSupport::Concern
|
5
5
|
|
6
6
|
included do
|
7
|
-
|
7
|
+
attr_reader :configuration
|
8
8
|
|
9
9
|
def configuration
|
10
10
|
@config ||= fetch_configuration
|
11
11
|
@config
|
12
12
|
end
|
13
13
|
|
14
|
-
|
15
14
|
def fetch_configuration
|
16
15
|
@fetched_config = Configliere::Param.new
|
17
16
|
command_line_params.each do |param|
|
@@ -33,24 +32,11 @@ module CapistranoMulticonfigParallel
|
|
33
32
|
@fetched_config.resolve!
|
34
33
|
end
|
35
34
|
|
36
|
-
def config_file
|
37
|
-
File.join(CapistranoMulticonfigParallel.detect_root.to_s, 'config', 'multi_cap.yml')
|
38
|
-
end
|
39
|
-
|
40
|
-
def internal_config_directory
|
41
|
-
File.join(CapistranoMulticonfigParallel.root.to_s, 'capistrano_multiconfig_parallel', 'initializers')
|
42
|
-
end
|
43
|
-
|
44
35
|
def command_line_params
|
45
36
|
@default_config ||= YAML.load_file(File.join(internal_config_directory, 'default.yml'))['default_config']
|
46
37
|
@default_config
|
47
38
|
end
|
48
39
|
|
49
|
-
def change_config_type(type)
|
50
|
-
['boolean'].include?(type) ? type.delete(':').to_sym : type.constantize
|
51
|
-
end
|
52
|
-
|
53
|
-
|
54
40
|
def verify_array_of_strings(value)
|
55
41
|
return true if value.blank?
|
56
42
|
value.reject(&:blank?)
|
@@ -72,8 +58,6 @@ module CapistranoMulticonfigParallel
|
|
72
58
|
end
|
73
59
|
end
|
74
60
|
|
75
|
-
|
76
|
-
|
77
61
|
def check_boolean(c, prop)
|
78
62
|
raise ArgumentError, "the property `#{prop}` must be boolean" unless %w(true false).include?(c[prop].to_s.downcase)
|
79
63
|
end
|
@@ -1,10 +1,41 @@
|
|
1
1
|
module CapistranoMulticonfigParallel
|
2
|
-
|
2
|
+
# class that holds the options that are configurable for this gem
|
3
|
+
module CoreHelper
|
3
4
|
extend ActiveSupport::Concern
|
4
|
-
|
5
5
|
included do
|
6
|
+
def config_file
|
7
|
+
File.join(detect_root.to_s, 'config', 'multi_cap.yml')
|
8
|
+
end
|
9
|
+
|
10
|
+
def internal_config_directory
|
11
|
+
File.join(root.to_s, 'capistrano_multiconfig_parallel', 'configuration')
|
12
|
+
end
|
6
13
|
|
7
|
-
|
14
|
+
def find_env_multi_cap_root
|
15
|
+
ENV['MULTI_CAP_ROOT']
|
16
|
+
end
|
17
|
+
|
18
|
+
def detect_root
|
19
|
+
if find_env_multi_cap_root
|
20
|
+
Pathname.new(find_env_multi_cap_root)
|
21
|
+
elsif defined?(::Rails)
|
22
|
+
::Rails.root
|
23
|
+
else
|
24
|
+
try_detect_capfile
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def log_directory
|
29
|
+
File.join(detect_root.to_s, 'log')
|
30
|
+
end
|
31
|
+
|
32
|
+
def main_log_file
|
33
|
+
File.join(log_directory, 'multi_cap.log')
|
34
|
+
end
|
35
|
+
|
36
|
+
def websokect_log_file
|
37
|
+
File.join(log_directory, 'multi_cap_websocket.log')
|
38
|
+
end
|
8
39
|
|
9
40
|
def root
|
10
41
|
File.expand_path(File.dirname(File.dirname(__dir__)))
|
@@ -26,72 +57,26 @@ module CapistranoMulticonfigParallel
|
|
26
57
|
return nil
|
27
58
|
end
|
28
59
|
|
29
|
-
def log_directory
|
30
|
-
File.join(CapistranoMulticonfigParallel.detect_root.to_s, 'log')
|
31
|
-
end
|
32
|
-
|
33
|
-
def main_log_file
|
34
|
-
File.join(log_directory, 'multi_cap.log')
|
35
|
-
end
|
36
|
-
|
37
|
-
def websokect_log_file
|
38
|
-
File.join(log_directory, 'multi_cap_websocket.log')
|
39
|
-
end
|
40
|
-
|
41
|
-
def enable_logging
|
42
|
-
FileUtils.mkdir_p(log_directory) unless File.directory?(log_directory)
|
43
|
-
if CapistranoMulticonfigParallel::CelluloidManager.debug_enabled.to_s.downcase == 'true'
|
44
|
-
FileUtils.touch(main_log_file) unless File.file?(main_log_file)
|
45
|
-
log_file = File.open(main_log_file, 'w')
|
46
|
-
log_file.sync = true
|
47
|
-
self.logger = ::Logger.new(main_log_file)
|
48
|
-
else
|
49
|
-
self.logger = ::Logger.new(DevNull.new)
|
50
|
-
end
|
51
|
-
Celluloid.logger = CapistranoMulticonfigParallel.logger
|
52
|
-
Celluloid.task_class = Celluloid::TaskThread
|
53
|
-
end
|
54
|
-
|
55
60
|
def log_message(message)
|
56
61
|
return unless logger.present?
|
57
|
-
|
58
|
-
err_backtrace = message.respond_to?(:backtrace) ? message.backtrace.join("\n\n") : ''
|
59
|
-
if err_backtrace.present?
|
60
|
-
logger.debug(
|
62
|
+
logger.debug(
|
61
63
|
class_name: message.class,
|
62
|
-
message:
|
63
|
-
backtrace:
|
64
|
-
|
65
|
-
else
|
66
|
-
logger.debug(message)
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
|
-
|
71
|
-
def detect_root
|
72
|
-
if ENV['MULTI_CAP_ROOT']
|
73
|
-
Pathname.new(ENV['MULTI_CAP_ROOT'])
|
74
|
-
elsif defined?(::Rails)
|
75
|
-
::Rails.root
|
76
|
-
else
|
77
|
-
try_detect_capfile
|
78
|
-
end
|
64
|
+
message: message.respond_to?(:message) ? message.message : message.inspect,
|
65
|
+
backtrace: message.respond_to?(:backtrace) ? message.backtrace.join("\n\n") : ''
|
66
|
+
)
|
79
67
|
end
|
80
68
|
|
81
69
|
def try_detect_capfile
|
82
70
|
root = Pathname.new(FileUtils.pwd)
|
83
71
|
root = root.parent unless root.directory?
|
84
72
|
root = root.parent until root.children.find { |f| f.file? && f.basename.to_s.downcase == 'capfile' }.present? || root.root?
|
85
|
-
|
73
|
+
fail "Can't detect Capfile in the application root".red if root.root?
|
86
74
|
root
|
87
75
|
end
|
88
76
|
|
89
77
|
def find_loaded_gem(name)
|
90
|
-
Gem.loaded_specs.values.
|
78
|
+
Gem.loaded_specs.values.find { |repo| repo.name == name }
|
91
79
|
end
|
92
|
-
|
93
|
-
|
94
|
-
|
95
80
|
end
|
96
81
|
end
|
97
82
|
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module CapistranoMulticonfigParallel
|
2
|
+
# module used to fetch the stages (code taken from https://github.com/railsware/capistrano-multiconfig)
|
3
|
+
# TODO: find a way to do this without copying code. Can't currently use gem specification to require that gem
|
4
|
+
# because that is only compatible with capistrano version 3
|
5
|
+
module StagesHelper
|
6
|
+
module_function
|
7
|
+
|
8
|
+
def fetch_stages
|
9
|
+
fetch_stages_paths do |paths|
|
10
|
+
checks_paths(paths)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def checks_paths(paths)
|
15
|
+
paths.reject! { |path| check_stage_path(paths, path) }.uniq.sort
|
16
|
+
end
|
17
|
+
|
18
|
+
def check_stage_path(paths, path)
|
19
|
+
paths.any? { |another| another != path && another.start_with?(path + ':') }
|
20
|
+
end
|
21
|
+
|
22
|
+
def stages_paths
|
23
|
+
stages_root = 'config/deploy'
|
24
|
+
Dir["#{stages_root}/**/*.rb"].map do |file|
|
25
|
+
file.slice(stages_root.size + 1..-4).tr('/', ':')
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def fetch_stages_paths
|
30
|
+
stages_paths.tap { |paths| yield paths if block_given? }
|
31
|
+
end
|
32
|
+
end
|
33
|
+
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.
|
4
|
+
version: 0.17.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- bogdanRada
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-12-
|
11
|
+
date: 2015-12-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: celluloid-pmap
|
@@ -628,17 +628,19 @@ files:
|
|
628
628
|
- lib/capistrano_multiconfig_parallel/celluloid/state_machine.rb
|
629
629
|
- lib/capistrano_multiconfig_parallel/celluloid/terminal_table.rb
|
630
630
|
- lib/capistrano_multiconfig_parallel/celluloid/web_server.rb
|
631
|
+
- lib/capistrano_multiconfig_parallel/classes/dependency_tracker.rb
|
632
|
+
- lib/capistrano_multiconfig_parallel/classes/input_stream.rb
|
633
|
+
- lib/capistrano_multiconfig_parallel/classes/interactive_menu.rb
|
634
|
+
- lib/capistrano_multiconfig_parallel/classes/output_stream.rb
|
635
|
+
- lib/capistrano_multiconfig_parallel/classes/rake_hook_actor.rb
|
636
|
+
- lib/capistrano_multiconfig_parallel/classes/standard_deploy.rb
|
631
637
|
- lib/capistrano_multiconfig_parallel/cli.rb
|
632
|
-
- lib/capistrano_multiconfig_parallel/
|
638
|
+
- lib/capistrano_multiconfig_parallel/configuration/default.yml
|
639
|
+
- lib/capistrano_multiconfig_parallel/helpers/application_helper.rb
|
633
640
|
- lib/capistrano_multiconfig_parallel/helpers/configuration.rb
|
634
|
-
- lib/capistrano_multiconfig_parallel/helpers/
|
635
|
-
- lib/capistrano_multiconfig_parallel/helpers/
|
636
|
-
- lib/capistrano_multiconfig_parallel/
|
637
|
-
- lib/capistrano_multiconfig_parallel/helpers/interactive_menu.rb
|
638
|
-
- lib/capistrano_multiconfig_parallel/helpers/output_stream.rb
|
639
|
-
- lib/capistrano_multiconfig_parallel/helpers/rake_hook_actor.rb
|
640
|
-
- lib/capistrano_multiconfig_parallel/helpers/standard_deploy.rb
|
641
|
-
- lib/capistrano_multiconfig_parallel/initializers/default.yml
|
641
|
+
- lib/capistrano_multiconfig_parallel/helpers/core_helper.rb
|
642
|
+
- lib/capistrano_multiconfig_parallel/helpers/stages_helper.rb
|
643
|
+
- lib/capistrano_multiconfig_parallel/initializers/rake.rb
|
642
644
|
- lib/capistrano_multiconfig_parallel/version.rb
|
643
645
|
homepage: http://github.com/bogdanRada/capistrano_multiconfig_parallel/
|
644
646
|
licenses:
|