hr_deploy 0.0.2 → 0.0.6
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 +2 -227
- data/lib/hr_deploy/application.rb +64 -0
- data/lib/hr_deploy/color.rb +21 -0
- data/lib/hr_deploy/config_handler.rb +122 -27
- data/lib/hr_deploy/deployer.rb +256 -303
- data/lib/hr_deploy/helper.rb +57 -0
- data/lib/hr_deploy/parser.rb +102 -0
- data/lib/hr_deploy/target.rb +48 -40
- data/lib/hr_deploy/tasks/backup_db_task.rb +25 -0
- data/lib/hr_deploy/tasks/check_heroku_task.rb +64 -0
- data/lib/hr_deploy/tasks/check_network_task.rb +29 -0
- data/lib/hr_deploy/tasks/clean_new_assets_task.rb +25 -0
- data/lib/hr_deploy/tasks/clean_old_assets_task.rb +25 -0
- data/lib/hr_deploy/tasks/disable_maintenance_task.rb +25 -0
- data/lib/hr_deploy/tasks/disable_pinger_task.rb +29 -0
- data/lib/hr_deploy/tasks/enable_maintenance_task.rb +29 -0
- data/lib/hr_deploy/tasks/enable_pinger_task.rb +25 -0
- data/lib/hr_deploy/tasks/migrate_db_task.rb +45 -0
- data/lib/hr_deploy/tasks/precompile_assets_task.rb +25 -0
- data/lib/hr_deploy/tasks/push_code_task.rb +33 -0
- data/lib/hr_deploy/tasks/restart_task.rb +26 -0
- data/lib/hr_deploy/tasks/task.rb +81 -0
- data/lib/hr_deploy/version.rb +1 -1
- metadata +20 -2
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'hr_deploy/tasks/task'
|
2
|
+
|
3
|
+
module HR_Deploy
|
4
|
+
|
5
|
+
class DisablePingerTask < HR_Deploy::Task
|
6
|
+
|
7
|
+
def run
|
8
|
+
print_stage 'Disabling New Relic availability pinger...'
|
9
|
+
|
10
|
+
execute_system_command("curl #{target.new_relic_disable_pinger_url}")
|
11
|
+
|
12
|
+
if dry_run? || !confirm?
|
13
|
+
self.success = true
|
14
|
+
return
|
15
|
+
end
|
16
|
+
|
17
|
+
if confirm_successful?('New Relic availability pinger disabled?')
|
18
|
+
self.success = true
|
19
|
+
else
|
20
|
+
self.success = false
|
21
|
+
self.error = 'Could not disable New Relic availability pinger'
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def reversal_instruction
|
26
|
+
"Availability pinging is disabled\nTo enable: curl #{target.new_relic_enable_pinger_url}"
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'hr_deploy/tasks/task'
|
2
|
+
|
3
|
+
module HR_Deploy
|
4
|
+
|
5
|
+
class EnableMaintenanceTask < HR_Deploy::Task
|
6
|
+
|
7
|
+
def run
|
8
|
+
print_stage 'Enabling maintenance mode...'
|
9
|
+
|
10
|
+
execute_system_command("heroku maintenance:on --remote #{target.name}")
|
11
|
+
|
12
|
+
if dry_run? || !confirm?
|
13
|
+
self.success = true
|
14
|
+
return
|
15
|
+
end
|
16
|
+
|
17
|
+
if confirm_successful?('Maintenance mode enabled?')
|
18
|
+
self.success = true
|
19
|
+
else
|
20
|
+
self.success = false
|
21
|
+
self.error = 'Could not enable maintenance mode'
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def reversal_instruction
|
26
|
+
"Maintenance mode is enabled\nTo disable: heroku maintenance:off --remote #{target.name}"
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'hr_deploy/tasks/task'
|
2
|
+
|
3
|
+
module HR_Deploy
|
4
|
+
|
5
|
+
class EnablePingerTask < HR_Deploy::Task
|
6
|
+
|
7
|
+
def run
|
8
|
+
print_stage 'Enabling New Relic availability pinger...'
|
9
|
+
|
10
|
+
execute_system_command("curl #{target.new_relic_enable_pinger_url}")
|
11
|
+
|
12
|
+
if dry_run? || !confirm?
|
13
|
+
self.success = true
|
14
|
+
return
|
15
|
+
end
|
16
|
+
|
17
|
+
if confirm_successful?('New Relic availability pinger enabled?')
|
18
|
+
self.success = true
|
19
|
+
else
|
20
|
+
self.success = false
|
21
|
+
self.error = 'Could not enable New Relic availability pinger'
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'hr_deploy/tasks/task'
|
2
|
+
|
3
|
+
module HR_Deploy
|
4
|
+
|
5
|
+
class MigrateDBTask < HR_Deploy::Task
|
6
|
+
|
7
|
+
def run
|
8
|
+
print_stage 'Migrating database...'
|
9
|
+
|
10
|
+
execute_system_command("heroku run rake db:migrate --remote #{target.name}")
|
11
|
+
|
12
|
+
if dry_run? || !confirm?
|
13
|
+
self.success = true
|
14
|
+
return
|
15
|
+
end
|
16
|
+
|
17
|
+
if confirm_successful?('Database migrated?')
|
18
|
+
self.success = true
|
19
|
+
else
|
20
|
+
self.success = false
|
21
|
+
|
22
|
+
error = 'Could not migrate database'
|
23
|
+
if target.backup_db?
|
24
|
+
error += "\nTo list database backups: heroku pgbackups --remote #{target.name}\n" +
|
25
|
+
'To restore from backup if needed: ' +
|
26
|
+
"heroku pgbackups:restore [database name] [version] --remote #{target.name}"
|
27
|
+
end
|
28
|
+
|
29
|
+
self.error = error
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def reversal_instruction
|
34
|
+
if target.backup_db?
|
35
|
+
"Database was migrated\n" +
|
36
|
+
'To list database backups: ' +
|
37
|
+
"heroku pgbackups --remote #{target.name}\n" +
|
38
|
+
'To restore from backup if needed: ' +
|
39
|
+
"heroku pgbackups:restore [database name] [version] --remote #{target.name}"
|
40
|
+
else
|
41
|
+
nil
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'hr_deploy/tasks/task'
|
2
|
+
|
3
|
+
module HR_Deploy
|
4
|
+
|
5
|
+
class PrecompileAssetsTask < HR_Deploy::Task
|
6
|
+
|
7
|
+
def run
|
8
|
+
print_stage 'Precompiling and syncing new assets...'
|
9
|
+
|
10
|
+
execute_system_command('rake assets:precompile')
|
11
|
+
|
12
|
+
if dry_run? || !confirm?
|
13
|
+
self.success = true
|
14
|
+
return
|
15
|
+
end
|
16
|
+
|
17
|
+
if confirm_successful?('New assets precompiled and synced?')
|
18
|
+
self.success = true
|
19
|
+
else
|
20
|
+
self.success = false
|
21
|
+
self.error = 'Could not precompile and sync new assets'
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'hr_deploy/tasks/task'
|
2
|
+
|
3
|
+
module HR_Deploy
|
4
|
+
|
5
|
+
class PushCodeTask < HR_Deploy::Task
|
6
|
+
|
7
|
+
def run
|
8
|
+
print_stage 'Pushing new code...'
|
9
|
+
|
10
|
+
execute_system_command("git push #{target.name} master")
|
11
|
+
|
12
|
+
if dry_run? || !confirm?
|
13
|
+
self.success = true
|
14
|
+
return
|
15
|
+
end
|
16
|
+
|
17
|
+
if confirm_successful?('New code pushed?')
|
18
|
+
self.success = true
|
19
|
+
else
|
20
|
+
self.success = false
|
21
|
+
self.error = 'Could not push new code'
|
22
|
+
end
|
23
|
+
|
24
|
+
def reversal_instruction
|
25
|
+
"Code was pushed\n" +
|
26
|
+
'To list app releases: ' +
|
27
|
+
"heroku releases --remote #{target.name}\n" +
|
28
|
+
'To rollback if needed: ' +
|
29
|
+
"heroku rollback [version] --remote #{target.name}"
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'hr_deploy/tasks/task'
|
2
|
+
|
3
|
+
module HR_Deploy
|
4
|
+
|
5
|
+
class RestartTask < HR_Deploy::Task
|
6
|
+
|
7
|
+
def run
|
8
|
+
print_stage 'Restarting instance...'
|
9
|
+
|
10
|
+
execute_system_command("heroku restart --remote #{target.name}")
|
11
|
+
|
12
|
+
if dry_run? || !confirm?
|
13
|
+
self.success = true
|
14
|
+
return
|
15
|
+
end
|
16
|
+
|
17
|
+
if confirm_successful?('Instance restarted?')
|
18
|
+
self.success = true
|
19
|
+
else
|
20
|
+
self.success = false
|
21
|
+
self.error = "Could not restart instance\n" +
|
22
|
+
"To restart manually: heroku restart --remote #{target.name}"
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,81 @@
|
|
1
|
+
require 'hr_deploy/deployer'
|
2
|
+
require 'hr_deploy/color.rb'
|
3
|
+
|
4
|
+
module HR_Deploy
|
5
|
+
|
6
|
+
class Task
|
7
|
+
|
8
|
+
attr_reader :error
|
9
|
+
|
10
|
+
def initialize(args = {})
|
11
|
+
@target = args.fetch(:target, nil)
|
12
|
+
@confirm = args.fetch(:confirm, false)
|
13
|
+
@dry_run = args.fetch(:dry_run, false)
|
14
|
+
@success = nil
|
15
|
+
@error = nil
|
16
|
+
end
|
17
|
+
|
18
|
+
def successful?
|
19
|
+
raise "Task #{self.class} did not set a proper success status" if success.nil?
|
20
|
+
success
|
21
|
+
end
|
22
|
+
|
23
|
+
def reversal_instruction
|
24
|
+
nil
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
attr_reader :target
|
30
|
+
attr_writer :error
|
31
|
+
attr_accessor :success
|
32
|
+
|
33
|
+
def confirm?
|
34
|
+
!!@confirm
|
35
|
+
end
|
36
|
+
|
37
|
+
def dry_run?
|
38
|
+
!!@dry_run
|
39
|
+
end
|
40
|
+
|
41
|
+
# Subclasses are required to implement the 'run' method
|
42
|
+
def run
|
43
|
+
raise "Don't know how to execute task for class: #{self.class}"
|
44
|
+
end
|
45
|
+
|
46
|
+
def confirm_successful?(message)
|
47
|
+
loop do
|
48
|
+
puts
|
49
|
+
|
50
|
+
print "#{message} [Yes / No] > "
|
51
|
+
answer = $stdin.gets.chomp.downcase
|
52
|
+
|
53
|
+
if answer == 'yes'
|
54
|
+
return true
|
55
|
+
|
56
|
+
elsif answer == 'no'
|
57
|
+
return false
|
58
|
+
|
59
|
+
else
|
60
|
+
puts 'Unknown answer'
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def execute_system_command(cmd)
|
66
|
+
if dry_run?
|
67
|
+
puts "Executing command: #{cmd}"
|
68
|
+
else
|
69
|
+
system(cmd)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
def print_stage(msg)
|
74
|
+
puts msg.blue
|
75
|
+
end
|
76
|
+
|
77
|
+
def print_success(msg)
|
78
|
+
puts msg.green
|
79
|
+
end
|
80
|
+
end
|
81
|
+
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.6
|
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-30 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
|
@@ -19,9 +19,27 @@ executables:
|
|
19
19
|
extensions: []
|
20
20
|
extra_rdoc_files: []
|
21
21
|
files:
|
22
|
+
- lib/hr_deploy/application.rb
|
23
|
+
- lib/hr_deploy/parser.rb
|
22
24
|
- lib/hr_deploy/deployer.rb
|
23
25
|
- lib/hr_deploy/config_handler.rb
|
24
26
|
- lib/hr_deploy/target.rb
|
27
|
+
- lib/hr_deploy/helper.rb
|
28
|
+
- lib/hr_deploy/color.rb
|
29
|
+
- lib/hr_deploy/tasks/task.rb
|
30
|
+
- lib/hr_deploy/tasks/check_network_task.rb
|
31
|
+
- lib/hr_deploy/tasks/check_heroku_task.rb
|
32
|
+
- lib/hr_deploy/tasks/enable_pinger_task.rb
|
33
|
+
- lib/hr_deploy/tasks/disable_pinger_task.rb
|
34
|
+
- lib/hr_deploy/tasks/enable_maintenance_task.rb
|
35
|
+
- lib/hr_deploy/tasks/disable_maintenance_task.rb
|
36
|
+
- lib/hr_deploy/tasks/backup_db_task.rb
|
37
|
+
- lib/hr_deploy/tasks/clean_old_assets_task.rb
|
38
|
+
- lib/hr_deploy/tasks/clean_new_assets_task.rb
|
39
|
+
- lib/hr_deploy/tasks/precompile_assets_task.rb
|
40
|
+
- lib/hr_deploy/tasks/push_code_task.rb
|
41
|
+
- lib/hr_deploy/tasks/migrate_db_task.rb
|
42
|
+
- lib/hr_deploy/tasks/restart_task.rb
|
25
43
|
- lib/hr_deploy/version.rb
|
26
44
|
- bin/hr_deploy
|
27
45
|
homepage: https://github.com/enthrops/hr_deploy
|