capistrano_multiconfig_parallel 0.16.2 → 0.17.0
Sign up to get free protection for your applications and to get access to all the features.
- 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:
|