capistrano_multiconfig_parallel 0.0.3 → 0.1.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/README.md +103 -55
- data/capistrano_multiconfig_parallel.gemspec +1 -1
- data/lib/capistrano_multiconfig_parallel/all.rb +0 -1
- data/lib/capistrano_multiconfig_parallel/application.rb +1 -29
- data/lib/capistrano_multiconfig_parallel/base.rb +9 -7
- data/lib/capistrano_multiconfig_parallel/celluloid/celluloid_manager.rb +3 -3
- data/lib/capistrano_multiconfig_parallel/celluloid/celluloid_worker.rb +1 -2
- data/lib/capistrano_multiconfig_parallel/cli.rb +1 -2
- data/lib/capistrano_multiconfig_parallel/configuration.rb +137 -38
- data/lib/capistrano_multiconfig_parallel/helpers/base_manager.rb +19 -15
- data/lib/capistrano_multiconfig_parallel/helpers/multi_app_manager.rb +8 -11
- data/lib/capistrano_multiconfig_parallel/helpers/single_app_manager.rb +4 -6
- data/lib/capistrano_multiconfig_parallel/initializers/conf.rb +11 -4
- data/lib/capistrano_multiconfig_parallel/initializers/default.yml +16 -0
- data/lib/capistrano_multiconfig_parallel/multi_app_helpers/dependency_tracker.rb +2 -2
- data/lib/capistrano_multiconfig_parallel/version.rb +2 -2
- metadata +130 -129
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7e02536cc3ccf434baaac3f46f7b84b91d6eda10
|
4
|
+
data.tar.gz: 0631bf39e10f727ac6180498b18e5f997a4cf610
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f1fe7728cd4b3ccee8d7b698707e0bf2dac2668552f37b0eaae8dda5d317dace22acc607b3f081f466bb6eb485c8b690b45072ee19998bc2ed253dcba25240f9
|
7
|
+
data.tar.gz: 43cc88221c00e64976f2d2a367e3704ad7ce2c9b2b406e63765d3ed7fc8e7f19601cad34da711ae957dbee0c0a3803a59e16c08d3a153e7f2214485b83fe537f
|
data/README.md
CHANGED
@@ -6,6 +6,11 @@ capistrano_multiconfig_parallel
|
|
6
6
|
[](https://github.com/bogdanRada/capistrano_multiconfig_parallel)
|
7
7
|
[](https://github.com/bogdanRada/capistrano_multiconfig_parallel)
|
8
8
|
|
9
|
+
DEMO
|
10
|
+
--------
|
11
|
+
|
12
|
+
[](#features)
|
13
|
+
|
9
14
|
Description
|
10
15
|
--------
|
11
16
|
CapistranoMulticonfigParallel is a simple ruby implementation that allows you to run multiple tasks in parallel for multiple applications and uses websockets for inter-process communication and has a interactive menu
|
@@ -33,7 +38,8 @@ Requirements
|
|
33
38
|
10. [right_popen >= 1.1.3] [right_popen]
|
34
39
|
11. [capistrano-multiconfig >= 3.0.8] [capistrano-multiconfig]
|
35
40
|
12. [capistrano >= 3.0] [capistrano]
|
36
|
-
13. [
|
41
|
+
13. [configliere >= 0.4] [configliere]
|
42
|
+
14. [inquirer >= 0.2] [inquirer]
|
37
43
|
|
38
44
|
[ruby]: http://www.ruby-lang.org
|
39
45
|
[activesupport]:https://rubygems.org/gems/activesupport
|
@@ -47,7 +53,8 @@ Requirements
|
|
47
53
|
[right_popen]: https://github.com/rightscale/right_popen
|
48
54
|
[capistrano-multiconfig]: https://github.com/railsware/capistrano-multiconfig
|
49
55
|
[capistrano]: https://github.com/capistrano/capistrano/
|
50
|
-
[
|
56
|
+
[configliere]: https://github.com/infochimps-platform/configliere
|
57
|
+
[inquirer]: https://github.com/arlimus/inquirer.rb
|
51
58
|
|
52
59
|
Compatibility
|
53
60
|
--------
|
@@ -77,23 +84,83 @@ Add the following to your Capfile:
|
|
77
84
|
Please read [Release Details][release-details] if you are upgrading. We break backward compatibility between large ticks but you can expect it to be specified at release notes.
|
78
85
|
[release-details]: https://github.com/bogdanRada/capistrano_multiconfig_parallel/releases
|
79
86
|
|
80
|
-
|
87
|
+
Default Configuration:
|
81
88
|
--------
|
82
89
|
|
83
|
-
|
90
|
+
```yaml
|
91
|
+
---
|
92
|
+
multi_debug: true
|
93
|
+
multi_progres: false
|
94
|
+
multi_secvential: false
|
95
|
+
websocket_server:
|
96
|
+
enable_debug: false
|
97
|
+
|
98
|
+
development_stages:
|
99
|
+
- development
|
100
|
+
- webdev
|
101
|
+
|
102
|
+
task_confirmation_active: false
|
103
|
+
task_confirmations:
|
104
|
+
- deploy:symlink:release
|
105
|
+
|
106
|
+
track_dependencies: false
|
107
|
+
application_dependencies: []
|
108
|
+
---
|
109
|
+
```
|
110
|
+
|
111
|
+
Available command line options when executing a command
|
112
|
+
--------
|
113
|
+
|
114
|
+
* --multi-debug
|
115
|
+
* if option is present and has value TRUE , will enable debugging of workers
|
116
|
+
|
117
|
+
* --multi-progress
|
118
|
+
* If option is present and has value TRUE will first execute before any process , same task but with option "--dry-run" in order to show progress of how many tasks are in total for that task and what is the progress of executing
|
119
|
+
This will slow down the workers , because they will execute twice the same task.
|
120
|
+
|
121
|
+
* --multi-secvential
|
122
|
+
* If parallel executing does not work for you, you can use this option so that each process is executed normally and ouputted to the screen.
|
123
|
+
However this means that all other tasks will have to wait for each other to finish before starting
|
124
|
+
|
125
|
+
* --websocket_server.enable_debug
|
126
|
+
* if option is present and has value TRUE, will enable debugging of websocket communication between the workers
|
127
|
+
|
128
|
+
* --development_stages
|
129
|
+
* if option is present and has value an ARRAY of STRINGS, each of them will be used as a development stage
|
84
130
|
|
85
|
-
|
131
|
+
* --task_confirmation_active
|
132
|
+
* if option is present and has value TRUE, will enable user confirmation dialogs before executing each task from option **--task_confirmations**
|
133
|
+
|
134
|
+
* --task_confirmations:
|
135
|
+
* if option is present and has value an ARRAY of Strings, and --task_confirmation_active is TRUE , then will require a confirmation from user before executing the task.
|
136
|
+
This will syncronize all workers to wait before executing that task, then a confirmation will be displayed, and when user will confirm , all workers will resume their operation.
|
137
|
+
|
138
|
+
* --track_dependencies
|
139
|
+
* This should be useed only for Caphub-like applications , in order to deploy dependencies of an application in parallel.
|
140
|
+
This is used only in combination with option **--application_dependencies** which is described
|
141
|
+
at section **[2.) Multiple applications](#multiple_apps)**
|
142
|
+
|
143
|
+
Usage Instructions
|
144
|
+
========
|
145
|
+
|
146
|
+
In order to override default configurations, you can either specify them at runtime using command-line , or you can
|
147
|
+
create a file in location **config/multi_cap.yml** . This settings will be overriden by command line arguments( if any)
|
148
|
+
|
149
|
+
## 1) Single Apps ( normal Rails or rack applications)
|
86
150
|
|
87
151
|
CapistranoMulticonfigParallel recognizes only "development" and "webdev" as stages for development
|
88
|
-
if you use other stages for development, you need to configure it like this
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
152
|
+
if you use other stages for development, you need to configure it like this
|
153
|
+
|
154
|
+
```yaml
|
155
|
+
---
|
156
|
+
development_stages:
|
157
|
+
- development
|
158
|
+
- webdev
|
159
|
+
- something_custom
|
160
|
+
----
|
95
161
|
```
|
96
|
-
|
162
|
+
|
163
|
+
### 1.1) Deploying the application to multiple sandboxes ( works only with development environments)
|
97
164
|
|
98
165
|
```shell
|
99
166
|
# <box_name> - the name of a sandbox
|
@@ -110,7 +177,7 @@ The branch environment variable is then passed to the capistrano task
|
|
110
177
|
|
111
178
|
Also the script will ask if there are any other environment variables that user might want to pass to each of the sandboxes separately.
|
112
179
|
|
113
|
-
### Deploying the application to multiple stages ( Using the customized command "deploy_stages")
|
180
|
+
### 1.2) Deploying the application to multiple stages ( Using the customized command "deploy_stages")
|
114
181
|
|
115
182
|
|
116
183
|
```shell
|
@@ -126,33 +193,32 @@ Also the script will ask if there are any other environment variables that user
|
|
126
193
|
|
127
194
|
|
128
195
|
|
129
|
-
2.
|
196
|
+
## 2.) Multiple Apps ( like [Caphub][caphub] )
|
130
197
|
|
131
198
|
|
132
199
|
Configuration for this types of application is more complicated
|
133
200
|
|
134
|
-
```
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
201
|
+
```yaml
|
202
|
+
---
|
203
|
+
track_dependencies: true
|
204
|
+
application_dependencies:
|
205
|
+
- app: foo'
|
206
|
+
priority: 1
|
207
|
+
dependencies: []
|
208
|
+
- app: bar
|
209
|
+
priority: 1
|
210
|
+
dependencies:
|
211
|
+
- foo
|
212
|
+
- app: foo2
|
213
|
+
priority: 1
|
214
|
+
dependencies:
|
215
|
+
- foo
|
216
|
+
- bar
|
217
|
+
---
|
146
218
|
```
|
147
219
|
|
148
220
|
The "development_stages" options is used so that the gem can know if sandboxes are allowed for those environments.
|
149
221
|
|
150
|
-
The "task_confirmation_active" option can have only two values:
|
151
|
-
- false - all threads are executing normally without needing confirmation from user
|
152
|
-
- true - means threads need confirmation from user ( Can we used to synchronize all processes to wait before executing a task)
|
153
|
-
For this we use the option "task_confirmations" which is a array with string.
|
154
|
-
Each string is the name of the task that needs confirmation.
|
155
|
-
|
156
222
|
|
157
223
|
If you want to deploy an application with dependencies you can use the option "track_dependencies".
|
158
224
|
If that options has value "true" , it will ask the user before deploying a application if he needs the dependencies deployed too
|
@@ -160,32 +226,14 @@ If that options has value "true" , it will ask the user before deploying a appli
|
|
160
226
|
The dependencies are being kept in the option "application_dependencies"
|
161
227
|
This is an array of hashes. Each hash has only the keys "app" ( app name), "priority" and "dependencies" ( an array of app names that this app is dependent to)
|
162
228
|
|
163
|
-
|
164
|
-
--------
|
229
|
+
In this example, if we execute this command:
|
165
230
|
|
166
231
|
```ruby
|
167
|
-
|
168
|
-
c.task_confirmations = ['deploy:symlink:release']
|
169
|
-
c.task_confirmation_active = false
|
170
|
-
c.track_dependencies = false
|
171
|
-
c.websocket_server = { enable_debug: false }
|
172
|
-
c.development_stages = ['development', 'webdev']
|
173
|
-
end
|
232
|
+
bundle exec multi_cap foo2:development deploy
|
174
233
|
```
|
175
234
|
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
--multi-debug
|
180
|
-
If option is present , will enable debugging of workers
|
181
|
-
|
182
|
-
--multi-progress
|
183
|
-
If option is present will first execute before any process , same task but with option "--dry-run" in order to show progress of how many tasks are in total for that task and what is the progress of executing
|
184
|
-
This will slow down the workers , because they will execute twice the same task.
|
185
|
-
|
186
|
-
--multi-secvential
|
187
|
-
If parallel executing does not work for you, you can use this option so that each process is executed normally and ouputted to the screen.
|
188
|
-
However this means that all other tasks will have to wait for each other to finish before starting
|
235
|
+
Will ask user if he wants to deploy the apps "foo" and "bar" , since they appear in the dependencies list for the application "foo2"
|
236
|
+
|
189
237
|
|
190
238
|
Testing
|
191
239
|
--------
|
@@ -28,7 +28,7 @@ Gem::Specification.new do |s|
|
|
28
28
|
s.add_runtime_dependency 'capistrano-multiconfig','~> 3.0', '>= 3.0.8'
|
29
29
|
s.add_runtime_dependency 'capistrano','~> 3.0','>= 3.0'
|
30
30
|
s.add_runtime_dependency 'activesupport', '~> 4.0','>= 4.0'
|
31
|
-
s.add_runtime_dependency '
|
31
|
+
s.add_runtime_dependency 'configliere', '~> 0.4', '>=0.4'
|
32
32
|
s.add_runtime_dependency 'inquirer', '~> 0.2', '>= 0.2'
|
33
33
|
|
34
34
|
s.add_development_dependency 'rspec-rails', '~> 2.0', '>= 2.0'
|
@@ -6,35 +6,7 @@ module CapistranoMulticonfigParallel
|
|
6
6
|
end
|
7
7
|
|
8
8
|
def sort_options(options)
|
9
|
-
super.
|
10
|
-
end
|
11
|
-
|
12
|
-
def multi_debug
|
13
|
-
['--multi-debug', '-D',
|
14
|
-
'Sets the debug enabled for celluloid actors',
|
15
|
-
lambda do |_value|
|
16
|
-
CapistranoMulticonfigParallel::CelluloidManager.debug_enabled = true
|
17
|
-
Celluloid.task_class = Celluloid::TaskThread
|
18
|
-
end
|
19
|
-
]
|
20
|
-
end
|
21
|
-
|
22
|
-
def multi_progress
|
23
|
-
['--multi-progress', '--multi-progress',
|
24
|
-
'Sets the debug enabled for celluloid actors',
|
25
|
-
lambda do |_value|
|
26
|
-
CapistranoMulticonfigParallel.show_task_progress = true
|
27
|
-
end
|
28
|
-
]
|
29
|
-
end
|
30
|
-
|
31
|
-
def multi_secvential
|
32
|
-
['--multi-secvential', '--multi-secvential',
|
33
|
-
'Sets the debug enabled for celluloid actors',
|
34
|
-
lambda do |_value|
|
35
|
-
CapistranoMulticonfigParallel.execute_in_sequence = true
|
36
|
-
end
|
37
|
-
]
|
9
|
+
super.concat(CapistranoMulticonfigParallel.capistrano_options)
|
38
10
|
end
|
39
11
|
|
40
12
|
def top_level
|
@@ -1,7 +1,6 @@
|
|
1
1
|
require 'rubygems'
|
2
2
|
require 'bundler'
|
3
3
|
require 'bundler/setup'
|
4
|
-
require 'configurations'
|
5
4
|
require 'inquirer'
|
6
5
|
require_relative './version'
|
7
6
|
require_relative './configuration'
|
@@ -29,9 +28,9 @@ module CapistranoMulticonfigParallel
|
|
29
28
|
def root
|
30
29
|
File.expand_path(File.dirname(__dir__))
|
31
30
|
end
|
32
|
-
|
31
|
+
|
33
32
|
def ask_confirm(message, default)
|
34
|
-
|
33
|
+
Ask.input message, default: default
|
35
34
|
end
|
36
35
|
|
37
36
|
def verify_app_dependencies(stages)
|
@@ -51,10 +50,11 @@ module CapistranoMulticonfigParallel
|
|
51
50
|
end
|
52
51
|
|
53
52
|
def websokect_log_file
|
54
|
-
File.join(log_directory, '
|
53
|
+
File.join(log_directory, 'multi_cap_websocket.log')
|
55
54
|
end
|
56
55
|
|
57
56
|
def enable_logging
|
57
|
+
CapistranoMulticonfigParallel.configuration_valid?
|
58
58
|
return unless CapistranoMulticonfigParallel::CelluloidManager.debug_enabled
|
59
59
|
FileUtils.mkdir_p(log_directory)
|
60
60
|
log_file = File.open(main_log_file, 'w')
|
@@ -68,9 +68,11 @@ module CapistranoMulticonfigParallel
|
|
68
68
|
error_message = message.respond_to?(:message) ? message.message : message.inspect
|
69
69
|
err_backtrace = message.respond_to?(:backtrace) ? message.backtrace.join("\n\n") : ''
|
70
70
|
if err_backtrace.present?
|
71
|
-
logger.debug(
|
72
|
-
|
73
|
-
|
71
|
+
logger.debug(
|
72
|
+
class_name: message.class,
|
73
|
+
message: error_message,
|
74
|
+
backtrace: err_backtrace
|
75
|
+
)
|
74
76
|
else
|
75
77
|
logger.debug(message)
|
76
78
|
end
|
@@ -44,12 +44,12 @@ module CapistranoMulticonfigParallel
|
|
44
44
|
def self.debug_websocket?
|
45
45
|
websocket_config['enable_debug'].to_s == 'true'
|
46
46
|
end
|
47
|
-
|
47
|
+
|
48
48
|
def self.websocket_config
|
49
|
-
config = CapistranoMulticonfigParallel.configuration
|
49
|
+
config = CapistranoMulticonfigParallel.configuration[:websocket_server]
|
50
50
|
config.present? && config.is_a?(Hash) ? config.stringify_keys : {}
|
51
51
|
end
|
52
|
-
|
52
|
+
|
53
53
|
def generate_job_id(job)
|
54
54
|
primary_key = @jobs.size + 1
|
55
55
|
job['id'] = primary_key
|
@@ -42,12 +42,11 @@ module CapistranoMulticonfigParallel
|
|
42
42
|
def debug_enabled?
|
43
43
|
@manager.class.debug_enabled?
|
44
44
|
end
|
45
|
-
|
46
45
|
|
47
46
|
def start_task
|
48
47
|
debug("exec worker #{@job_id} starts task with #{@job.inspect}") if debug_enabled?
|
49
48
|
@task_confirmations = CapistranoMulticonfigParallel.configuration.task_confirmations
|
50
|
-
@client = CelluloidPubsub::Client.connect(actor: Actor.current, enable_debug:
|
49
|
+
@client = CelluloidPubsub::Client.connect(actor: Actor.current, enable_debug: @manager.class.debug_websocket?) do |ws|
|
51
50
|
ws.subscribe(@subscription_channel)
|
52
51
|
end
|
53
52
|
end
|
@@ -10,8 +10,7 @@ module CapistranoMulticonfigParallel
|
|
10
10
|
if $stdout.isatty
|
11
11
|
$stdout.sync = true
|
12
12
|
end
|
13
|
-
CapistranoMulticonfigParallel.
|
14
|
-
CapistranoMulticonfigParallel.verify_app_dependencies(stages) if CapistranoMulticonfigParallel.configuration.track_dependencies
|
13
|
+
CapistranoMulticonfigParallel.enable_logging
|
15
14
|
CapistranoMulticonfigParallel::Application.new.run
|
16
15
|
rescue Interrupt
|
17
16
|
`stty icanon echo`
|
@@ -4,17 +4,127 @@ module CapistranoMulticonfigParallel
|
|
4
4
|
module Configuration
|
5
5
|
extend ActiveSupport::Concern
|
6
6
|
|
7
|
-
|
8
|
-
|
7
|
+
class_methods do
|
8
|
+
attr_accessor :configuration
|
9
9
|
|
10
|
-
|
11
|
-
|
10
|
+
def configuration
|
11
|
+
@config ||= Configliere::Param.new
|
12
|
+
@config.use :commandline
|
13
|
+
command_line_params.each do |param|
|
14
|
+
@config.define param[:name], type: param[:type], description: param[:description], default: param[:default]
|
15
|
+
end
|
16
|
+
@config.merge(Settings.use(:commandline).resolve!)
|
17
|
+
@config.read config_file if File.file?(config_file)
|
18
|
+
|
19
|
+
@config.use :config_block
|
20
|
+
@config.finally do |c|
|
21
|
+
check_configuration(c)
|
22
|
+
end
|
23
|
+
@config.resolve!
|
24
|
+
rescue => ex
|
25
|
+
puts ex.inspect
|
26
|
+
puts ex.backtrace if ex.respond_to?(:backtrace)
|
27
|
+
end
|
28
|
+
|
29
|
+
def default_config
|
30
|
+
@default_config ||= Configliere::Param.new
|
31
|
+
@default_config.read File.join(CapistranoMulticonfigParallel.root.to_s, 'capistrano_multiconfig_parallel', 'initializers', 'default.yml')
|
32
|
+
@default_config.resolve!
|
33
|
+
end
|
34
|
+
|
35
|
+
def config_file
|
36
|
+
File.join(CapistranoMulticonfigParallel.detect_root.to_s, 'config', 'multi_cap.yml')
|
37
|
+
end
|
38
|
+
|
39
|
+
def command_line_params
|
40
|
+
[
|
41
|
+
{
|
42
|
+
name: 'multi_debug',
|
43
|
+
type: :boolean,
|
44
|
+
description: '[MULTI_CAP] if option is present and has value TRUE , will enable debugging of workers',
|
45
|
+
default: default_config[:multi_debug]
|
46
|
+
},
|
47
|
+
{
|
48
|
+
name: 'multi_progress',
|
49
|
+
type: :boolean,
|
50
|
+
description: "[MULTI_CAP] if option is present and has value TRUE will first execute before any process ,
|
51
|
+
same task but with option '--dry-run' in order to show progress of how many tasks are in total for that task and what is the progress of executing
|
52
|
+
This will slow down the workers , because they will execute twice the same task.",
|
53
|
+
default: default_config[:multi_progress]
|
54
|
+
},
|
55
|
+
{
|
56
|
+
name: 'multi_secvential',
|
57
|
+
type: :boolean,
|
58
|
+
description: "[MULTI_CAP] If parallel executing does not work for you, you can use this option so that each process is executed normally and ouputted to the screen.
|
59
|
+
However this means that all other tasks will have to wait for each other to finish before starting ",
|
60
|
+
default: default_config[:multi_secvential]
|
61
|
+
},
|
62
|
+
{
|
63
|
+
name: 'websocket_server.enable_debug',
|
64
|
+
type: :boolean,
|
65
|
+
description: '[MULTI_CAP] if option is present and has value TRUE, will enable debugging of websocket communication between the workers',
|
66
|
+
default: default_config[:websocket_server][:enable_debug]
|
67
|
+
},
|
68
|
+
{
|
69
|
+
name: 'development_stages',
|
70
|
+
type: Array,
|
71
|
+
description: '[MULTI_CAP] if option is present and has value an ARRAY of STRINGS, each of them will be used as a development stage',
|
72
|
+
default: default_config[:development_stages]
|
73
|
+
},
|
74
|
+
{
|
75
|
+
name: 'task_confirmations',
|
76
|
+
type: Array,
|
77
|
+
description: '[MULTI_CAP] if option is present and has value TRUE, will enable user confirmation dialogs
|
78
|
+
before executing each task from option **--task_confirmations**',
|
79
|
+
default: default_config[:task_confirmations]
|
80
|
+
},
|
81
|
+
{
|
82
|
+
name: 'task_confirmation_active',
|
83
|
+
type: :boolean,
|
84
|
+
description: "[MULTI_CAP] if option is present and has value an ARRAY of Strings, and --task_confirmation_active is TRUE ,
|
85
|
+
then will require a confirmation from user before executing the task.
|
86
|
+
This will syncronize all workers to wait before executing that task, then a confirmation will be displayed,
|
87
|
+
and when user will confirm , all workers will resume their operation",
|
88
|
+
default: default_config[:task_confirmation_active]
|
89
|
+
},
|
90
|
+
{
|
91
|
+
name: 'track_dependencies',
|
92
|
+
type: :boolean,
|
93
|
+
description: "[MULTI_CAP] This should be useed only for Caphub-like applications , in order to deploy dependencies of an application in parallel.
|
94
|
+
This is used only in combination with option **--application_dependencies** which is described
|
95
|
+
at section **[2.) Multiple applications](#multiple_apps)**",
|
96
|
+
default: default_config[:track_dependencies]
|
97
|
+
},
|
98
|
+
{
|
99
|
+
name: 'application_dependencies',
|
100
|
+
type: Array,
|
101
|
+
description: "[MULTI_CAP] This is an array of hashes. Each hash has only the keys 'app' ( app name), 'priority' and 'dependencies'
|
102
|
+
( an array of app names that this app is dependent to) ",
|
103
|
+
default: default_config[:application_dependencies]
|
104
|
+
}
|
105
|
+
]
|
106
|
+
end
|
107
|
+
|
108
|
+
def capistrano_options
|
109
|
+
command_line_params.map do |param|
|
110
|
+
[
|
111
|
+
"--#{param[:name]}[=CAP_VALUE]",
|
112
|
+
"--#{param[:name]}",
|
113
|
+
param[:description],
|
114
|
+
lambda do |_value|
|
115
|
+
end
|
116
|
+
]
|
117
|
+
end
|
118
|
+
end
|
12
119
|
|
13
|
-
|
14
|
-
|
120
|
+
def verify_array_of_strings(c, prop)
|
121
|
+
value = c[prop]
|
122
|
+
return unless value.present?
|
123
|
+
value.reject(&:blank?)
|
124
|
+
raise ArgumentError, 'the array must contain only task names' if value.find { |row| !row.is_a?(String) }
|
15
125
|
end
|
16
126
|
|
17
|
-
|
127
|
+
def verify_application_dependencies(value)
|
18
128
|
value.reject { |val| val.blank? || !val.is_a?(Hash) }
|
19
129
|
wrong = value.find do|hash|
|
20
130
|
!Set[:app, :priority, :dependencies].subset?(hash.keys.to_set) ||
|
@@ -26,44 +136,33 @@ module CapistranoMulticonfigParallel
|
|
26
136
|
raise ArgumentError, "invalid configuration for #{wrong.inspect}" if wrong.present?
|
27
137
|
end
|
28
138
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
configurable Array, :task_confirmations do |value|
|
34
|
-
value.reject(&:blank?)
|
35
|
-
if value.find { |row| !row.is_a?(String) }
|
36
|
-
raise ArgumentError, 'the array must contain only task names'
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
configuration_defaults do |c|
|
41
|
-
c.task_confirmations = ['deploy:symlink:release']
|
42
|
-
c.task_confirmation_active = false
|
43
|
-
c.track_dependencies = false
|
44
|
-
c.websocket_server = { enable_debug: false }
|
45
|
-
c.development_stages = ['development', 'webdev']
|
46
|
-
end
|
47
|
-
|
48
|
-
not_configured do |prop| # omit the arguments to get a catch-all not_configured
|
49
|
-
raise NoMethodError, "Please configure the property `#{prop}` by assigning a value of type #{configuration.property_type(prop)}"
|
139
|
+
def check_boolean(c, prop)
|
140
|
+
return unless c[prop].present?
|
141
|
+
raise ArgumentError, "the property `#{prop}` must be boolean" unless [true, false, 'true', 'false'].include?(c[prop].to_s.downcase)
|
50
142
|
end
|
51
143
|
|
52
|
-
def
|
53
|
-
|
144
|
+
def configuration_valid?
|
145
|
+
configuration
|
54
146
|
end
|
55
147
|
|
56
|
-
def
|
57
|
-
|
58
|
-
|
148
|
+
def check_configuration(c)
|
149
|
+
%w(multi_debug multi_progress multi_secvential task_confirmation_active track_dependencies websocket_server.enable_debug).each do |prop|
|
150
|
+
c.send("#{prop}=", c[prop.to_sym]) if check_boolean(c, prop.to_sym)
|
151
|
+
end
|
152
|
+
%w(task_confirmations development_stages).each do |prop|
|
153
|
+
c.send("#{prop}=", c[prop.to_sym]) if verify_array_of_strings(c, prop.to_sym)
|
59
154
|
end
|
155
|
+
c.application_dependencies = c[:application_dependencies] if c[:track_dependencies].to_s.downcase == 'true' && verify_application_dependencies(c[:application_dependencies])
|
156
|
+
check_additional_config(c)
|
60
157
|
end
|
61
158
|
|
62
|
-
def
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
159
|
+
def check_additional_config(c)
|
160
|
+
if c[:multi_debug].to_s.downcase == 'true'
|
161
|
+
CapistranoMulticonfigParallel::CelluloidManager.debug_enabled = true
|
162
|
+
Celluloid.task_class = Celluloid::TaskThread
|
163
|
+
end
|
164
|
+
CapistranoMulticonfigParallel.show_task_progress = true if c[:multi_progress].to_s.downcase == 'true'
|
165
|
+
CapistranoMulticonfigParallel.execute_in_sequence = true if c[:multi_secvential].to_s.downcase == 'true'
|
67
166
|
end
|
68
167
|
end
|
69
168
|
end
|
@@ -13,6 +13,8 @@ module CapistranoMulticonfigParallel
|
|
13
13
|
@top_level_tasks = top_level_tasks
|
14
14
|
@stages = stages
|
15
15
|
@jobs = []
|
16
|
+
CapistranoMulticonfigParallel.configuration_valid?
|
17
|
+
CapistranoMulticonfigParallel.verify_app_dependencies(@stages) if CapistranoMulticonfigParallel.configuration.track_dependencies
|
16
18
|
end
|
17
19
|
|
18
20
|
def can_start?
|
@@ -38,7 +40,6 @@ module CapistranoMulticonfigParallel
|
|
38
40
|
@name, @args = @cap_app.parse_task_string(@top_level_tasks.second)
|
39
41
|
@argv = @cap_app.handle_options.delete_if { |arg| arg == @stage || arg == @name || arg == @top_level_tasks.first }
|
40
42
|
@argv = multi_fetch_argv(@argv)
|
41
|
-
CapistranoMulticonfigParallel.enable_logging
|
42
43
|
block.call if block_given?
|
43
44
|
run
|
44
45
|
end
|
@@ -58,31 +59,30 @@ module CapistranoMulticonfigParallel
|
|
58
59
|
run_async_jobs(&block)
|
59
60
|
end
|
60
61
|
end
|
61
|
-
|
62
|
+
|
62
63
|
def fetch_multi_stages
|
63
64
|
stages = @argv['STAGES'].blank? ? '' : @argv['STAGES']
|
64
65
|
stages = parse_inputted_value(value: stages).split(',').compact if stages.present?
|
65
66
|
stages
|
66
67
|
end
|
67
|
-
|
68
|
-
|
68
|
+
|
69
69
|
def deploy_app(options = {})
|
70
70
|
options = options.stringify_keys
|
71
|
-
app = options['app'].is_a?(Hash) ?
|
71
|
+
app = options['app'].is_a?(Hash) ? options['app'] : { 'app' => options['app'] }
|
72
72
|
branch = @branch_backup.present? ? @branch_backup : @argv['BRANCH'].to_s
|
73
73
|
call_task_deploy_app({
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
74
|
+
branch: branch,
|
75
|
+
app: app,
|
76
|
+
action: options['action']
|
77
|
+
}.reverse_merge(options))
|
78
78
|
end
|
79
79
|
|
80
|
-
|
81
|
-
|
80
|
+
private
|
81
|
+
|
82
82
|
def call_task_deploy_app(options = {})
|
83
83
|
options = options.stringify_keys
|
84
84
|
main_box_name = @argv['BOX'].blank? ? '' : @argv['BOX']
|
85
|
-
stage = options.fetch('stage', @default_stage
|
85
|
+
stage = options.fetch('stage', @default_stage)
|
86
86
|
if CapistranoMulticonfigParallel.configuration.development_stages.include?(stage) && main_box_name.present? && /^[a-z0-9,]+/.match(main_box_name)
|
87
87
|
execute_on_multiple_boxes(main_box_name, options)
|
88
88
|
else
|
@@ -167,8 +167,12 @@ module CapistranoMulticonfigParallel
|
|
167
167
|
|
168
168
|
def get_applications_branch_from_stdin(app, app_message)
|
169
169
|
app_name = (app.is_a?(Hash) && app[:app].present?) ? app[:app].camelcase : app
|
170
|
-
app_name = app_name.present? ? app_name :
|
170
|
+
app_name = app_name.present? ? app_name : 'current application'
|
171
171
|
message = "Please enter Branch name for #{app_name} for #{app_message}"
|
172
|
+
get_branch_name_from_stdin(message)
|
173
|
+
end
|
174
|
+
|
175
|
+
def get_branch_name_from_stdin(message)
|
172
176
|
branch = ''
|
173
177
|
if @argv['BRANCH'].blank? || (@argv['BRANCH'].present? && !custom_command?)
|
174
178
|
set :app_branch_name, CapistranoMulticonfigParallel.ask_confirm(message, nil)
|
@@ -178,10 +182,10 @@ module CapistranoMulticonfigParallel
|
|
178
182
|
end
|
179
183
|
branch
|
180
184
|
end
|
181
|
-
|
185
|
+
|
182
186
|
def get_app_additional_env_options(app, app_message)
|
183
187
|
app_name = (app.is_a?(Hash) && app[:app].present?) ? app[:app].camelcase : app
|
184
|
-
app_name = app_name.present? ? app_name :
|
188
|
+
app_name = app_name.present? ? app_name : 'current application'
|
185
189
|
message = "Please write additional ENV options for #{app_name} for #{app_message}"
|
186
190
|
set :app_additional_env_options, CapistranoMulticonfigParallel.ask_confirm(message, nil)
|
187
191
|
fetch_app_additional_env_options
|