capistrano_multiconfig_parallel 0.4.0 → 0.5.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 +21 -7
- data/lib/capistrano_multiconfig_parallel/base.rb +1 -2
- data/lib/capistrano_multiconfig_parallel/celluloid/celluloid_manager.rb +14 -13
- data/lib/capistrano_multiconfig_parallel/celluloid/celluloid_worker.rb +3 -3
- data/lib/capistrano_multiconfig_parallel/configuration.rb +9 -2
- data/lib/capistrano_multiconfig_parallel/helpers/base_manager.rb +9 -9
- data/lib/capistrano_multiconfig_parallel/helpers/multi_app_manager.rb +1 -3
- data/lib/capistrano_multiconfig_parallel/initializers/default.yml +2 -0
- data/lib/capistrano_multiconfig_parallel/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 576d2d4c017df766b649b56f90a3410f58beaf9a
|
|
4
|
+
data.tar.gz: e4952851b1bab357329ece299ee8de1346256956
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: fe9d160ac7cf3658b94f70627b6a0a498097074185ebe1465de2baa638c278a80ba5d5cae140876d6ae02dc3b4e5e588b0070467ee680ef8e74d5cd7a561bc11
|
|
7
|
+
data.tar.gz: baa62229473d2fda8046a4aed016834327b9c659d088f98c876a5bdd91c7553b737a50b488b09893f844fe5d5823dbcd61620392035afd215a24035093ee54b5
|
data/README.md
CHANGED
|
@@ -99,7 +99,9 @@ development_stages:
|
|
|
99
99
|
- development
|
|
100
100
|
- webdev
|
|
101
101
|
|
|
102
|
-
syncronize_confirmation: true
|
|
102
|
+
syncronize_confirmation: true
|
|
103
|
+
apply_stage_confirmation:
|
|
104
|
+
- production
|
|
103
105
|
task_confirmation_active: false
|
|
104
106
|
task_confirmations:
|
|
105
107
|
- deploy:symlink:release
|
|
@@ -132,6 +134,10 @@ application_dependencies: []
|
|
|
132
134
|
* --syncronize_confirmation
|
|
133
135
|
* if option is present and has value TRUE, all workers will be synchronized to wait for same task from the ***task_confirmations** Array before they execute it
|
|
134
136
|
|
|
137
|
+
* --apply_stage_confirmation
|
|
138
|
+
* If option is present and has value an ARRAY of STRING, each string should be the name of a stage.
|
|
139
|
+
The confirmations will only be applied if the workers are executing tasks to one of that stage.
|
|
140
|
+
|
|
135
141
|
* --task_confirmation_active
|
|
136
142
|
* if option is present and has value TRUE, will enable user confirmation dialogs before executing each task from option **--task_confirmations**
|
|
137
143
|
|
|
@@ -176,22 +182,19 @@ bundle exec multi_cap <development_stage> <task_name> BOX=<box_name>,<box_nam
|
|
|
176
182
|
```
|
|
177
183
|
|
|
178
184
|
If a branch is specified using "BRANCH=name" it will deploy same branch to all sandboxes
|
|
179
|
-
If a branch is not specified, will ask for each of the sandboxes the name of the branch to deploy
|
|
180
185
|
The branch environment variable is then passed to the capistrano task
|
|
181
186
|
|
|
182
187
|
Also the script will ask if there are any other environment variables that user might want to pass to each of the sandboxes separately.
|
|
183
188
|
|
|
184
|
-
### 1.2) Deploying the application to multiple stages ( Using the customized command "
|
|
189
|
+
### 1.2) Deploying the application to multiple stages ( Using the customized command "deploy_multi_stages")
|
|
185
190
|
|
|
186
191
|
|
|
187
192
|
```shell
|
|
188
193
|
|
|
189
|
-
bundle exec multi_cap
|
|
194
|
+
bundle exec multi_cap deploy_multi_stages STAGES=development, staging, production
|
|
190
195
|
```
|
|
191
196
|
|
|
192
|
-
If a branch is specified using "BRANCH=name" it will deploy same branch to all stages
|
|
193
|
-
If a branch is not specified, will ask for each of the stage the name of the branch to deploy
|
|
194
|
-
The branch environment variable is then passed to the capistrano process
|
|
197
|
+
If a branch is specified using "BRANCH=name" it will deploy same branch to all stages.The branch environment variable is then passed to the capistrano task
|
|
195
198
|
|
|
196
199
|
Also the script will ask if there are any other environment variables that user might want to pass to each of the stages separately.
|
|
197
200
|
|
|
@@ -239,6 +242,17 @@ bundle exec multi_cap foo2:development deploy
|
|
|
239
242
|
Will ask user if he wants to deploy the apps "foo" and "bar" , since they appear in the dependencies list for the application "foo2"
|
|
240
243
|
|
|
241
244
|
|
|
245
|
+
### 1.2) Deploying multiple application to multiple stages ( Using the customized command "deploy_multi_stages")
|
|
246
|
+
|
|
247
|
+
|
|
248
|
+
```shell
|
|
249
|
+
|
|
250
|
+
bundle exec multi_cap deploy_multi_stages STAGES=development, staging, production
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
If a branch is specified using **BRANCH=<name>** it will deploy same branch to all stages.The branch environment variable is then passed to the capistrano task
|
|
254
|
+
If you want different branches , capistrano will ask for additional ENV options for each stage, and can be specified then for each stage
|
|
255
|
+
|
|
242
256
|
Testing
|
|
243
257
|
--------
|
|
244
258
|
|
|
@@ -14,7 +14,6 @@ module CapistranoMulticonfigParallel
|
|
|
14
14
|
|
|
15
15
|
CUSTOM_COMMANDS = {
|
|
16
16
|
CapistranoMulticonfigParallel::MULTI_KEY => {
|
|
17
|
-
menu: 'show_menu',
|
|
18
17
|
stages: 'deploy_multi_stages'
|
|
19
18
|
},
|
|
20
19
|
CapistranoMulticonfigParallel::SINGLE_KEY => {
|
|
@@ -23,7 +22,7 @@ module CapistranoMulticonfigParallel
|
|
|
23
22
|
}
|
|
24
23
|
|
|
25
24
|
class << self
|
|
26
|
-
attr_accessor :show_task_progress, :execute_in_sequence, :logger, :original_args
|
|
25
|
+
attr_accessor :show_task_progress, :execute_in_sequence, :logger, :original_args, :interactive_menu
|
|
27
26
|
|
|
28
27
|
def root
|
|
29
28
|
File.expand_path(File.dirname(__dir__))
|
|
@@ -105,27 +105,28 @@ module CapistranoMulticonfigParallel
|
|
|
105
105
|
debug("all jobs have completed #{condition}") if self.class.debug_enabled?
|
|
106
106
|
@job_manager.condition.signal('completed') if condition
|
|
107
107
|
end
|
|
108
|
-
|
|
108
|
+
|
|
109
|
+
def apply_confirmations?
|
|
110
|
+
CapistranoMulticonfigParallel.configuration.task_confirmation_active.to_s.downcase == 'true' &&
|
|
111
|
+
CapistranoMulticonfigParallel.configuration.apply_stage_confirmation.include?(@job_manager.stage)
|
|
112
|
+
end
|
|
113
|
+
|
|
109
114
|
def syncronized_confirmation?
|
|
110
|
-
|
|
115
|
+
CapistranoMulticonfigParallel.configuration.syncronize_confirmation.to_s.downcase == 'true' &&
|
|
116
|
+
!@job_manager.executes_deploy_stages?
|
|
111
117
|
end
|
|
112
118
|
|
|
113
119
|
def setup_worker_conditions(worker)
|
|
120
|
+
return unless apply_confirmations?
|
|
114
121
|
hash_conditions = {}
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
hash_conditions[task] = { condition: Celluloid::Condition.new, status: 'unconfirmed' }
|
|
118
|
-
end
|
|
122
|
+
CapistranoMulticonfigParallel.configuration.task_confirmations.each do |task|
|
|
123
|
+
hash_conditions[task] = { condition: Celluloid::Condition.new, status: 'unconfirmed' }
|
|
119
124
|
end
|
|
120
125
|
@job_to_condition[worker.job_id] = hash_conditions
|
|
121
126
|
end
|
|
122
127
|
|
|
123
|
-
def need_confirmations?
|
|
124
|
-
CapistranoMulticonfigParallel.configuration.task_confirmation_active.to_s.downcase == 'true'
|
|
125
|
-
end
|
|
126
|
-
|
|
127
128
|
def mark_completed_remaining_tasks(worker)
|
|
128
|
-
return unless
|
|
129
|
+
return unless apply_confirmations?
|
|
129
130
|
CapistranoMulticonfigParallel.configuration.task_confirmations.each_with_index do |task, _index|
|
|
130
131
|
fake_result = proc { |sum| sum }
|
|
131
132
|
task_confirmation = @job_to_condition[worker.job_id][task]
|
|
@@ -137,7 +138,7 @@ module CapistranoMulticonfigParallel
|
|
|
137
138
|
end
|
|
138
139
|
|
|
139
140
|
def wait_task_confirmations_worker(worker)
|
|
140
|
-
return if !
|
|
141
|
+
return if !apply_confirmations? || syncronized_confirmation?
|
|
141
142
|
CapistranoMulticonfigParallel.configuration.task_confirmations.each_with_index do |task, _index|
|
|
142
143
|
result = wait_condition_for_task(worker.job_id, task)
|
|
143
144
|
confirm_task_approval(result, task, worker) if result.present?
|
|
@@ -149,7 +150,7 @@ module CapistranoMulticonfigParallel
|
|
|
149
150
|
end
|
|
150
151
|
|
|
151
152
|
def wait_task_confirmations
|
|
152
|
-
return
|
|
153
|
+
return if !apply_confirmations? || !syncronized_confirmation?
|
|
153
154
|
CapistranoMulticonfigParallel.configuration.task_confirmations.each_with_index do |task, _index|
|
|
154
155
|
results = []
|
|
155
156
|
@jobs.pmap do |job_id, _job|
|
|
@@ -38,7 +38,7 @@ module CapistranoMulticonfigParallel
|
|
|
38
38
|
@machine = CapistranoMulticonfigParallel::StateMachine.new(job, Actor.current)
|
|
39
39
|
manager.register_worker_for_job(job, Actor.current)
|
|
40
40
|
end
|
|
41
|
-
|
|
41
|
+
|
|
42
42
|
def debug_enabled?
|
|
43
43
|
@manager.class.debug_enabled?
|
|
44
44
|
end
|
|
@@ -102,7 +102,7 @@ module CapistranoMulticonfigParallel
|
|
|
102
102
|
setup_task_arguments
|
|
103
103
|
debug("worker #{@job_id} executes: #{generate_command}") if debug_enabled?
|
|
104
104
|
@child_process.async.work(generate_command, actor: Actor.current, silent: true)
|
|
105
|
-
@manager.wait_task_confirmations_worker(Actor.current)
|
|
105
|
+
@manager.wait_task_confirmations_worker(Actor.current)
|
|
106
106
|
end
|
|
107
107
|
|
|
108
108
|
def check_child_proces
|
|
@@ -135,7 +135,7 @@ module CapistranoMulticonfigParallel
|
|
|
135
135
|
end
|
|
136
136
|
|
|
137
137
|
def task_approval(message)
|
|
138
|
-
if CapistranoMulticonfigParallel.configuration.task_confirmations.include?(message['task']) && message['action'] == 'invoke'
|
|
138
|
+
if @manager.apply_confirmations? && CapistranoMulticonfigParallel.configuration.task_confirmations.include?(message['task']) && message['action'] == 'invoke'
|
|
139
139
|
task_confirmation = @manager.job_to_condition[@job_id][message['task']]
|
|
140
140
|
task_confirmation[:status] = 'confirmed'
|
|
141
141
|
task_confirmation[:condition].signal(message['task'])
|
|
@@ -98,6 +98,13 @@ module CapistranoMulticonfigParallel
|
|
|
98
98
|
\t from the ***task_confirmations** Array before they execute it ",
|
|
99
99
|
default: default_config[:syncronize_confirmation]
|
|
100
100
|
},
|
|
101
|
+
{
|
|
102
|
+
name: 'apply_stage_confirmation',
|
|
103
|
+
type: Array,
|
|
104
|
+
description: "if option is present and has value TRUE, all workers will be synchronized to wait for same task
|
|
105
|
+
\t from the ***task_confirmations** Array before they execute it ",
|
|
106
|
+
default: default_config[:apply_stage_confirmation]
|
|
107
|
+
},
|
|
101
108
|
{
|
|
102
109
|
name: 'track_dependencies',
|
|
103
110
|
type: :boolean,
|
|
@@ -159,10 +166,10 @@ module CapistranoMulticonfigParallel
|
|
|
159
166
|
end
|
|
160
167
|
|
|
161
168
|
def check_configuration(c)
|
|
162
|
-
%w(multi_debug multi_progress multi_secvential task_confirmation_active track_dependencies websocket_server.enable_debug).each do |prop|
|
|
169
|
+
%w(multi_debug multi_progress multi_secvential task_confirmation_active track_dependencies websocket_server.enable_debug syncronize_confirmation).each do |prop|
|
|
163
170
|
c.send("#{prop}=", c[prop.to_sym]) if check_boolean(c, prop.to_sym)
|
|
164
171
|
end
|
|
165
|
-
%w(task_confirmations development_stages).each do |prop|
|
|
172
|
+
%w(task_confirmations development_stages apply_stage_confirmation).each do |prop|
|
|
166
173
|
c.send("#{prop}=", c[prop.to_sym]) if verify_array_of_strings(c, prop.to_sym)
|
|
167
174
|
end
|
|
168
175
|
c.application_dependencies = c[:application_dependencies] if c[:track_dependencies].to_s.downcase == 'true' && verify_application_dependencies(c[:application_dependencies])
|
|
@@ -42,17 +42,19 @@ module CapistranoMulticonfigParallel
|
|
|
42
42
|
end
|
|
43
43
|
|
|
44
44
|
def start(&block)
|
|
45
|
-
|
|
45
|
+
CapistranoMulticonfigParallel.configuration_valid?
|
|
46
|
+
@default_stage = CapistranoMulticonfigParallel.configuration.development_stages.present? ? CapistranoMulticonfigParallel.configuration.development_stages.first : 'development'
|
|
46
47
|
check_before_starting
|
|
47
48
|
@application = custom_command? ? nil : @top_level_tasks.first.split(':').reverse[1]
|
|
48
49
|
@stage = custom_command? ? nil : @top_level_tasks.first.split(':').reverse[0]
|
|
50
|
+
@stage = @stage.present? ? @stage : @default_stage
|
|
49
51
|
@name, @args = @cap_app.parse_task_string(@top_level_tasks.second)
|
|
50
52
|
@argv = @cap_app.handle_options.delete_if { |arg| arg == @stage || arg == @name || arg == @top_level_tasks.first }
|
|
51
53
|
@argv = multi_fetch_argv(@argv)
|
|
52
54
|
block.call if block_given?
|
|
53
55
|
run
|
|
54
56
|
end
|
|
55
|
-
|
|
57
|
+
|
|
56
58
|
def check_before_starting
|
|
57
59
|
@condition = Celluloid::Condition.new
|
|
58
60
|
@manager = CapistranoMulticonfigParallel::CelluloidManager.new(Actor.current)
|
|
@@ -89,13 +91,13 @@ module CapistranoMulticonfigParallel
|
|
|
89
91
|
app = options['app'].is_a?(Hash) ? options['app'] : { 'app' => options['app'] }
|
|
90
92
|
branch = @branch_backup.present? ? @branch_backup : @argv['BRANCH'].to_s
|
|
91
93
|
call_task_deploy_app({
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
94
|
+
branch: branch,
|
|
95
|
+
app: app,
|
|
96
|
+
action: options['action']
|
|
97
|
+
}.reverse_merge(options))
|
|
96
98
|
end
|
|
97
99
|
|
|
98
|
-
|
|
100
|
+
private
|
|
99
101
|
|
|
100
102
|
def call_task_deploy_app(options = {})
|
|
101
103
|
options = options.stringify_keys
|
|
@@ -154,8 +156,6 @@ module CapistranoMulticonfigParallel
|
|
|
154
156
|
end
|
|
155
157
|
|
|
156
158
|
def prepare_options(options)
|
|
157
|
-
@default_stage = CapistranoMulticonfigParallel.configuration.development_stages.present? ? CapistranoMulticonfigParallel.configuration.development_stages.first : 'development'
|
|
158
|
-
@stage = @stage.present? ? @stage : @default_stage
|
|
159
159
|
options = options.stringify_keys
|
|
160
160
|
options['app'] = options.fetch('app', @application.to_s.clone)
|
|
161
161
|
options['action'] = options.fetch('action', @name.to_s.clone)
|
|
@@ -39,9 +39,7 @@ module CapistranoMulticonfigParallel
|
|
|
39
39
|
CapistranoMulticonfigParallel.interactive_menu = true
|
|
40
40
|
options[:action] = @argv['ACTION'].present? ? @argv['ACTION'].present? : 'deploy'
|
|
41
41
|
action_name = @name
|
|
42
|
-
if
|
|
43
|
-
menu_deploy_interactive(options)
|
|
44
|
-
elsif action_name == custom_commands[:stages]
|
|
42
|
+
if action_name == custom_commands[:stages]
|
|
45
43
|
multi_stage_deploy(options)
|
|
46
44
|
else
|
|
47
45
|
raise "Custom command #{@name} not available for multi apps"
|
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.5.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-07-
|
|
11
|
+
date: 2015-07-02 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: celluloid-pmap
|