hr_deploy 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bin/hr_deploy +50 -11
- data/lib/hr_deploy/deployer.rb +63 -44
- data/lib/hr_deploy/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: 93edb710600a30c90ce512be9dae066d6cfb64f5
|
4
|
+
data.tar.gz: 9129a7c55e56c7fed6c3a269763c22ccc6a01ceb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d84c22c58a26875b651ef921ae5ac61c25e9e4791be78f523d0abf7ceb77f6089ad9a48a834302540b3f4bce6b316a577362e8391fd66699910cf62c867df29e
|
7
|
+
data.tar.gz: 8447cc2204afa97ee798a40201a7ee2efecb13688f199f0fca99e9776a5f98fd010cc763598c5e2a3e5d24923c1f7b1d04fb45b1fcaa927df01a03d49f1a357c
|
data/bin/hr_deploy
CHANGED
@@ -29,10 +29,34 @@ def parse(opts)
|
|
29
29
|
elsif opts == ['generate']
|
30
30
|
{ command: :generate }
|
31
31
|
|
32
|
-
elsif opts.first == 'deploy'
|
33
|
-
#
|
34
|
-
|
35
|
-
|
32
|
+
elsif opts.first == 'deploy'
|
33
|
+
# Deploy command
|
34
|
+
# Possible combinations:
|
35
|
+
#
|
36
|
+
# (empty)
|
37
|
+
# (target)
|
38
|
+
# --no-confirm
|
39
|
+
# (target) --no-confirm
|
40
|
+
# --no-confirm target
|
41
|
+
|
42
|
+
deploy_options = opts[1, opts.length]
|
43
|
+
|
44
|
+
# 0 to 2 additional options to 'deploy' command
|
45
|
+
return nil unless deploy_options.length <= 2
|
46
|
+
|
47
|
+
confirm = true
|
48
|
+
confirm = false if deploy_options.delete('--no-confirm')
|
49
|
+
|
50
|
+
# After we have removed '--no-confirm', we either have one param (target) or nothing
|
51
|
+
return nil unless deploy_options.length <= 1
|
52
|
+
|
53
|
+
# 'nil' for no target (default target)
|
54
|
+
target = deploy_options.first
|
55
|
+
|
56
|
+
# Explicit target should not be a command argument
|
57
|
+
return nil if target && target.start_with?('--')
|
58
|
+
|
59
|
+
{ command: :deploy, target: target, confirm: confirm }
|
36
60
|
|
37
61
|
else
|
38
62
|
nil
|
@@ -48,8 +72,12 @@ def react(command)
|
|
48
72
|
|
49
73
|
elsif command[:command] == :generate || command[:command] == :deploy
|
50
74
|
if inside_app?
|
51
|
-
|
52
|
-
|
75
|
+
if command[:command] == :generate
|
76
|
+
generate
|
77
|
+
else
|
78
|
+
attempt_deploy(command[:target], command[:confirm])
|
79
|
+
end
|
80
|
+
|
53
81
|
else
|
54
82
|
puts 'You should be inside a Heroku app to run this command'
|
55
83
|
exit 1
|
@@ -74,7 +102,7 @@ def generate
|
|
74
102
|
end
|
75
103
|
end
|
76
104
|
|
77
|
-
def attempt_deploy(target_name)
|
105
|
+
def attempt_deploy(target_name, confirm)
|
78
106
|
|
79
107
|
# These tools are needed for all deploys
|
80
108
|
exit 1 unless tools_available?('heroku', 'git')
|
@@ -86,9 +114,11 @@ def attempt_deploy(target_name)
|
|
86
114
|
targets = raw_targets.map { |raw_target| HR_Deploy::Target.new(raw_target) }
|
87
115
|
|
88
116
|
if target_name
|
117
|
+
# Explicit target name given
|
118
|
+
|
89
119
|
target = targets.find { |target| target.name == target_name }
|
90
120
|
if target
|
91
|
-
deploy(target)
|
121
|
+
deploy(target, confirm)
|
92
122
|
else
|
93
123
|
puts "No such target: #{target_name}"
|
94
124
|
exit 1
|
@@ -106,7 +136,7 @@ def attempt_deploy(target_name)
|
|
106
136
|
exit 1
|
107
137
|
else
|
108
138
|
# Deploy default target
|
109
|
-
deploy(default_targets.first)
|
139
|
+
deploy(default_targets.first, confirm)
|
110
140
|
end
|
111
141
|
end
|
112
142
|
else
|
@@ -119,12 +149,12 @@ def attempt_deploy(target_name)
|
|
119
149
|
end
|
120
150
|
end
|
121
151
|
|
122
|
-
def deploy(target)
|
152
|
+
def deploy(target, confirm)
|
123
153
|
# Some targets need 'curl' to disable/enable New Relic pinger
|
124
154
|
exit 1 if target.requires_curl? && !tools_available?('curl')
|
125
155
|
|
126
156
|
# Actual deployment
|
127
|
-
deployer = HR_Deploy::Deployer.new(target)
|
157
|
+
deployer = HR_Deploy::Deployer.new(target, confirm)
|
128
158
|
deployer.deploy
|
129
159
|
end
|
130
160
|
|
@@ -175,10 +205,19 @@ generate Generate a config file which specifies targets to deploy to.
|
|
175
205
|
|
176
206
|
deploy [target] Deploy to [target]. If no [target] is specified, deploy
|
177
207
|
to default target specified in config.
|
208
|
+
This command supports the following options:
|
209
|
+
|
210
|
+
--no-confirm Skip confirmations while deploying.
|
211
|
+
This does not affect the initial
|
212
|
+
confirmation that triggers the deploy itself.
|
213
|
+
Default behavior is to confirm actions.
|
178
214
|
|
179
215
|
version Show gem version.
|
180
216
|
|
181
217
|
help Show help.
|
218
|
+
|
219
|
+
Verbose documentation is at:
|
220
|
+
https://github.com/enthrops/hr_deploy/blob/master/README.md
|
182
221
|
eos
|
183
222
|
|
184
223
|
puts help_string
|
data/lib/hr_deploy/deployer.rb
CHANGED
@@ -2,14 +2,18 @@ module HR_Deploy
|
|
2
2
|
|
3
3
|
class Deployer
|
4
4
|
|
5
|
+
DEBUG = false
|
6
|
+
|
5
7
|
attr_reader :target
|
6
8
|
attr_reader :pinging_interaction
|
7
9
|
attr_reader :perform_db_backup
|
10
|
+
attr_reader :confirm
|
8
11
|
|
9
|
-
def initialize(target)
|
12
|
+
def initialize(target, confirm)
|
10
13
|
@target = target
|
11
14
|
@pinging_interaction = target.requires_pinging_interaction?
|
12
15
|
@perform_db_backup = target.backup_db?
|
16
|
+
@confirm = confirm
|
13
17
|
end
|
14
18
|
|
15
19
|
def deploy
|
@@ -50,7 +54,7 @@ module HR_Deploy
|
|
50
54
|
puts 'Waiting 10 seconds for application to go live...'
|
51
55
|
sleep 10
|
52
56
|
puts 'Opening application...'
|
53
|
-
|
57
|
+
execute_system_command("heroku open --remote #{target.name}")
|
54
58
|
puts
|
55
59
|
|
56
60
|
puts "Deploy completed in #{(Time.now - start_time).round} seconds"
|
@@ -200,46 +204,61 @@ module HR_Deploy
|
|
200
204
|
end
|
201
205
|
|
202
206
|
def continue?(stage)
|
203
|
-
answered = false
|
204
207
|
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
208
|
+
if confirm
|
209
|
+
# User wants confirmations
|
210
|
+
|
211
|
+
answered = false
|
212
|
+
until answered
|
213
|
+
|
214
|
+
case stage
|
215
|
+
when :disabling_pinger
|
216
|
+
print 'Pinger disabled? (Yes / No) > '
|
217
|
+
when :enabling_maintenance
|
218
|
+
print 'Maintenance mode enabled? (Yes / No) > '
|
219
|
+
when :backing_up_db
|
220
|
+
print 'Database backed up? (Yes / No) > '
|
221
|
+
when :pushing_code
|
222
|
+
print 'Code pushed successfully? (Yes / No) > '
|
223
|
+
when :migrating_db
|
224
|
+
print 'Database migrated? (Yes / No) > '
|
225
|
+
when :restarting
|
226
|
+
print 'Restarted? (Yes / No) > '
|
227
|
+
when :enabling_pinger
|
228
|
+
print 'Pinger enabled? (Yes / No) > '
|
229
|
+
when :disabling_maintenance
|
230
|
+
print 'Maintenance mode disabled? (Yes / No) > '
|
231
|
+
else
|
232
|
+
raise 'Unknown stage'
|
233
|
+
end
|
227
234
|
|
228
|
-
|
235
|
+
answer = $stdin.gets.chomp
|
229
236
|
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
237
|
+
if answer == 'Yes' || answer == 'yes'
|
238
|
+
answered = true
|
239
|
+
puts
|
240
|
+
yield
|
241
|
+
elsif answer == 'No' || answer == 'no'
|
242
|
+
puts
|
243
|
+
abort_deploy(nil, stage)
|
244
|
+
else
|
245
|
+
puts 'Unknown answer'
|
246
|
+
puts
|
247
|
+
end
|
240
248
|
end
|
249
|
+
|
250
|
+
else
|
251
|
+
# User does not want confirmations, continue
|
252
|
+
yield
|
241
253
|
end
|
254
|
+
end
|
242
255
|
|
256
|
+
def execute_system_command(cmd)
|
257
|
+
if DEBUG
|
258
|
+
puts "Executing command: #{cmd}"
|
259
|
+
else
|
260
|
+
system(cmd)
|
261
|
+
end
|
243
262
|
end
|
244
263
|
|
245
264
|
def check_connectivity
|
@@ -319,49 +338,49 @@ module HR_Deploy
|
|
319
338
|
|
320
339
|
def disable_pinging
|
321
340
|
puts 'Disabling availability pinger...'
|
322
|
-
|
341
|
+
execute_system_command("curl #{target.disable_pinger_url}")
|
323
342
|
puts
|
324
343
|
end
|
325
344
|
|
326
345
|
def enable_maintenance
|
327
346
|
puts 'Enabling maintenance mode...'
|
328
|
-
|
347
|
+
execute_system_command("heroku maintenance:on --remote #{target.name}")
|
329
348
|
puts
|
330
349
|
end
|
331
350
|
|
332
351
|
def backup_db
|
333
352
|
puts 'Backing up database...'
|
334
|
-
|
353
|
+
execute_system_command("heroku pgbackups:capture --expire --remote #{target.name}")
|
335
354
|
puts
|
336
355
|
end
|
337
356
|
|
338
357
|
def push_code
|
339
358
|
puts 'Pushing code...'
|
340
|
-
|
359
|
+
execute_system_command("git push #{target.name} master")
|
341
360
|
puts
|
342
361
|
end
|
343
362
|
|
344
363
|
def migrate_db
|
345
364
|
puts 'Migrating database...'
|
346
|
-
|
365
|
+
execute_system_command("heroku run rake db:migrate --remote #{target.name}")
|
347
366
|
puts
|
348
367
|
end
|
349
368
|
|
350
369
|
def restart
|
351
370
|
puts 'Restarting...'
|
352
|
-
|
371
|
+
execute_system_command("heroku restart --remote #{target.name}")
|
353
372
|
puts
|
354
373
|
end
|
355
374
|
|
356
375
|
def enable_pinging
|
357
376
|
puts 'Enabling availability pinger...'
|
358
|
-
|
377
|
+
execute_system_command("curl #{target.enable_pinger_url}")
|
359
378
|
puts
|
360
379
|
end
|
361
380
|
|
362
381
|
def disable_maintenance
|
363
382
|
puts 'Disabling maintenance mode...'
|
364
|
-
|
383
|
+
execute_system_command("heroku maintenance:off --remote #{target.name}")
|
365
384
|
puts
|
366
385
|
end
|
367
386
|
end
|
data/lib/hr_deploy/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hr_deploy
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dmitry Gubitskiy
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-06-
|
11
|
+
date: 2013-06-26 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: Easily deploy your Rails apps to Heroku with one command, automatically
|
14
14
|
taking care of things such as checking current Heroku status, enabling maintenance
|