heroku-rails 0.0.1 → 0.2.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.
- data/CHANGELOG +10 -0
- data/Gemfile.lock +1 -1
- data/README.md +80 -37
- data/TODO +5 -2
- data/heroku-rails.gemspec +3 -3
- data/lib/generators/heroku/callbacks_generator.rb +15 -0
- data/lib/generators/heroku/config_generator.rb +15 -0
- data/lib/generators/templates/heroku.rake +24 -0
- data/lib/generators/templates/heroku.yml +51 -0
- data/lib/heroku-rails.rb +3 -9
- data/lib/heroku/rails/heroku_config.rb +69 -0
- data/lib/heroku/rails/heroku_runner.rb +242 -0
- data/lib/heroku/rails/railtie.rb +9 -0
- data/lib/heroku/rails/tasks.rb +129 -173
- data/spec/fixtures/heroku-config.yml +48 -0
- data/spec/heroku/rails/heroku_config_spec.rb +131 -0
- data/spec/heroku/rails/heroku_runner_spec.rb +1 -0
- data/spec/spec_helper.rb +18 -0
- metadata +21 -9
- data/lib/heroku/rails/config.rb +0 -42
- data/lib/templates/heroku.example.yml +0 -5
data/CHANGELOG
CHANGED
@@ -1,4 +1,14 @@
|
|
1
1
|
Heroku Rails
|
2
|
+
|
3
|
+
v0.2.0
|
4
|
+
============================================
|
5
|
+
Added Heroku Settings tasks, and rails generators
|
6
|
+
|
7
|
+
Cleaned out lots of tasks that are now handled by editing config/heroku.yml and running `rake heroku:setup`
|
8
|
+
|
9
|
+
Namespaced tasks such as heroku:deploy, heroku:console, etc. The only top level task now is `rake all ...` which sets all the environments. Individual environment tasks (e.g. `rake production ...`) are still generated without a namespace.
|
10
|
+
|
11
|
+
|
2
12
|
v0.0.1
|
3
13
|
============================================
|
4
14
|
Initial fork and reorganization
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -35,76 +35,119 @@ Rake tasks are not automatically loaded from gems, so you’ll need to add the f
|
|
35
35
|
|
36
36
|
In config/heroku.yml you will need add the Heroku apps that you would like to attach to this project. You can generate this file and edit it by running:
|
37
37
|
|
38
|
-
|
38
|
+
rails generate heroku:config
|
39
39
|
|
40
|
-
|
41
|
-
you, and set the RACK_ENV.
|
40
|
+
Then edit config/heroku.yml with your project's heroku configurations. To persist the changes onto Heroku, just run:
|
42
41
|
|
43
|
-
rake all heroku:
|
42
|
+
rake all heroku:setup
|
43
|
+
|
44
|
+
This will create the heroku apps you have defined, and create the settings for each.
|
44
45
|
|
45
46
|
## Usage
|
46
47
|
|
47
48
|
After configuring your Heroku apps you can use rake tasks to control the
|
48
49
|
apps.
|
49
50
|
|
50
|
-
rake production deploy
|
51
|
+
rake production heroku:deploy
|
51
52
|
|
52
53
|
A rake task with the shorthand name of each app is now available and adds that
|
53
54
|
server to the list that subsequent commands will execute on. Because this list
|
54
55
|
is additive, you can easily select which servers to run a command on.
|
55
56
|
|
56
|
-
rake demo staging restart
|
57
|
+
rake demo staging heroku:restart
|
57
58
|
|
58
59
|
A special rake task 'all' is created that causes any further commands to
|
59
60
|
execute on all heroku apps.
|
60
61
|
|
61
|
-
Manipulate collaborators on all this project's apps (prompts for email
|
62
|
-
address):
|
63
|
-
|
64
|
-
rake all heroku:share
|
65
|
-
rake all heroku:unshare
|
66
|
-
|
67
62
|
Need to add remotes for each app?
|
68
63
|
|
69
64
|
rake all heroku:remotes
|
70
65
|
|
71
66
|
A full list of tasks provided:
|
72
67
|
|
73
|
-
rake all
|
74
|
-
rake
|
75
|
-
rake
|
76
|
-
rake
|
77
|
-
rake
|
78
|
-
rake
|
79
|
-
rake
|
80
|
-
rake
|
81
|
-
rake heroku:
|
82
|
-
|
83
|
-
rake heroku:
|
84
|
-
rake heroku:
|
85
|
-
rake heroku:
|
86
|
-
rake heroku:
|
87
|
-
rake heroku:
|
88
|
-
rake heroku:
|
89
|
-
|
90
|
-
rake
|
91
|
-
|
92
|
-
|
68
|
+
rake all # Select all Heroku apps for later command
|
69
|
+
rake heroku:deploy # Deploys, migrates and restarts latest code.
|
70
|
+
rake heroku:apps # Lists configured apps
|
71
|
+
rake heroku:info # Queries the heroku status info on each app
|
72
|
+
rake heroku:console # Opens a remote console
|
73
|
+
rake heroku:capture # Captures a bundle on Heroku
|
74
|
+
rake heroku:remotes # Add git remotes for all apps in this project
|
75
|
+
rake heroku:migrate # Migrates and restarts remote servers
|
76
|
+
rake heroku:restart # Restarts remote servers
|
77
|
+
|
78
|
+
rake heroku:setup # runs all heroku setup scripts
|
79
|
+
rake heroku:setup:addons # sets up the heroku addons
|
80
|
+
rake heroku:setup:collaborators # sets up the heroku collaborators
|
81
|
+
rake heroku:setup:config # sets up the heroku config env variables
|
82
|
+
rake heroku:setup:domains # sets up the heroku domains
|
83
|
+
rake heroku:setup:stacks # sets the correct stack for each heroku app
|
84
|
+
|
85
|
+
rake heroku:db:setup # Migrates and restarts remote servers
|
86
|
+
|
87
|
+
You can easily alias frequently used tasks within your application's Rakefile:
|
88
|
+
|
89
|
+
task :deploy => ["heroku:deploy"]
|
90
|
+
task :console => ["heroku:console"]
|
91
|
+
task :capture => ["heroku:capture"]
|
92
|
+
|
93
|
+
With this in place, you can be a bit more terse:
|
94
|
+
|
95
|
+
rake staging console
|
96
|
+
rake all deploy
|
97
|
+
|
98
|
+
### Deploy Hooks
|
99
|
+
|
100
|
+
You can easily hook into the deploy process by defining any of the following rake tasks:
|
101
|
+
|
102
|
+
You can generate these automatically within lib/tasks/heroku.rake by running:
|
103
|
+
|
104
|
+
rails generate heroku:callbacks
|
105
|
+
|
106
|
+
|
107
|
+
Then edit the rake tasks to provide custom logic for each of these steps
|
108
|
+
|
109
|
+
namespace :heroku do
|
110
|
+
|
111
|
+
# runs before all the deploys complete
|
112
|
+
task :before_deploy do
|
113
|
+
|
114
|
+
end
|
115
|
+
|
116
|
+
# runs before each push to a particular heroku deploy environment
|
117
|
+
task :before_each_deploy do
|
118
|
+
|
119
|
+
end
|
120
|
+
|
121
|
+
# runs after each push to a particular heroku deploy environment
|
122
|
+
task :after_each_deploy do
|
123
|
+
|
124
|
+
end
|
125
|
+
|
126
|
+
# runs after all the deploys complete
|
127
|
+
task :after_deploy do
|
128
|
+
|
129
|
+
end
|
130
|
+
|
131
|
+
end
|
132
|
+
|
133
|
+
|
134
|
+
|
93
135
|
|
94
136
|
## About Heroku Rails
|
95
137
|
|
96
138
|
### Links
|
97
139
|
|
98
|
-
Homepage:: http://github.com/railsjedi/heroku-rails
|
99
|
-
|
140
|
+
Homepage:: <http://github.com/railsjedi/heroku-rails>
|
141
|
+
|
142
|
+
Issue Tracker:: <http://github.com/railsjedi/heroku-rails/issues>
|
100
143
|
|
101
144
|
### License
|
102
145
|
|
103
|
-
License:: Copyright (c) 2010
|
146
|
+
License:: Copyright (c) 2010 Jacques Crocker <railsjedi@gmail.com> released under the MIT license.
|
104
147
|
|
105
148
|
## Forked from Heroku Sans
|
106
149
|
|
107
|
-
Heroku Rails is a fork and rewrite/reorganiziation of Heroku Sans, and a nice simple set of Rake tasks for managing Heroku environments. Check out that project here: http://github.com/fastestforward/heroku_san
|
150
|
+
Heroku Rails is a fork and rewrite/reorganiziation of Heroku Sans, and a nice simple set of Rake tasks for managing Heroku environments. Check out that project here: <http://github.com/fastestforward/heroku_san>
|
108
151
|
|
109
152
|
### Heroku Sans Contributors
|
110
153
|
|
@@ -114,4 +157,4 @@ Heroku Rails is a fork and rewrite/reorganiziation of Heroku Sans, and a nice si
|
|
114
157
|
|
115
158
|
### Heroku Sans License
|
116
159
|
|
117
|
-
License:: Copyright (c) 2009 Elijah Miller <
|
160
|
+
License:: Copyright (c) 2009 Elijah Miller <elijah.miller@gmail.com>, released under the MIT license.
|
data/TODO
CHANGED
@@ -1,2 +1,5 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
√ refactor config/helpers out of tasks.rb into own file(s)
|
2
|
+
√ add config setup tasks (DONE)
|
3
|
+
√ add proper rails3 generator support
|
4
|
+
√ add hooks to allow other precompilations before deploy
|
5
|
+
- add sass/coffeescript precompile + jammit-s3 support
|
data/heroku-rails.gemspec
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = "heroku-rails"
|
3
|
-
s.version = "0.0
|
3
|
+
s.version = "0.2.0"
|
4
4
|
|
5
5
|
s.authors = ["Elijah Miller", "Glenn Roberts", "Jacques Crocker"]
|
6
|
-
s.summary = "
|
7
|
-
s.description = "Manage multiple Heroku instances/apps for a single Rails app using Rake"
|
6
|
+
s.summary = "Deployment and configuration tools for Heroku/Rails"
|
7
|
+
s.description = "Manage multiple Heroku instances/apps for a single Rails app using Rake. It's the Capistrano for Heroku, without the suck."
|
8
8
|
|
9
9
|
s.email = "railsjedi@gmail.com"
|
10
10
|
s.homepage = "http://github.com/railsjedi/heroku-rails"
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Heroku
|
2
|
+
module Generators
|
3
|
+
class CallbacksGenerator < ::Rails::Generators::Base
|
4
|
+
desc "Generates the rake tasks (lib/tasks/heroku.rake) that let you override heroku deploy callbacks"
|
5
|
+
|
6
|
+
def self.source_root
|
7
|
+
@_heroku_gen_source_root ||= File.expand_path("../../templates", __FILE__)
|
8
|
+
end
|
9
|
+
|
10
|
+
def create_callbacks_rake_file
|
11
|
+
template 'heroku.rake', File.join('lib', 'tasks', "heroku.rake")
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Heroku
|
2
|
+
module Generators
|
3
|
+
class ConfigGenerator < ::Rails::Generators::Base
|
4
|
+
desc "Generates a Heroku Config file at config/heroku.yml"
|
5
|
+
|
6
|
+
def self.source_root
|
7
|
+
@_heroku_gen_source_root ||= File.expand_path("../../templates", __FILE__)
|
8
|
+
end
|
9
|
+
|
10
|
+
def create_config_file
|
11
|
+
template 'heroku.yml', File.join('config', "heroku.yml")
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# Heroku Deploy Callbacks
|
2
|
+
namespace :heroku do
|
3
|
+
|
4
|
+
# runs before all the deploys complete
|
5
|
+
task :before_deploy do
|
6
|
+
|
7
|
+
end
|
8
|
+
|
9
|
+
# runs before each push to a particular heroku deploy environment
|
10
|
+
task :before_each_deploy do
|
11
|
+
|
12
|
+
end
|
13
|
+
|
14
|
+
# runs after each push to a particular heroku deploy environment
|
15
|
+
task :after_each_deploy do
|
16
|
+
|
17
|
+
end
|
18
|
+
|
19
|
+
# runs after all the deploys complete
|
20
|
+
task :after_deploy do
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
apps:
|
2
|
+
# map the environments to your desired heroku app names
|
3
|
+
# for example,
|
4
|
+
# production: awesomeapp
|
5
|
+
# would create the RACK_ENV=production
|
6
|
+
# and deploy to http://awesomeapp.heroku.com
|
7
|
+
production: awesomeapp
|
8
|
+
staging: awesomeapp-staging
|
9
|
+
legacy: awesomeapp-legacy
|
10
|
+
|
11
|
+
stacks:
|
12
|
+
# choose the stacks you want to use for each app.
|
13
|
+
# the all: setting sets the default
|
14
|
+
all: bamboo-mri-1.9.2
|
15
|
+
|
16
|
+
# override on a per environment basis
|
17
|
+
legacy: bamboo-ree-1.8.7
|
18
|
+
|
19
|
+
config:
|
20
|
+
# choose the configuration settings for all environments
|
21
|
+
all:
|
22
|
+
BUNDLE_WITHOUT: "test development"
|
23
|
+
CONFIG_VAR1: "config1"
|
24
|
+
CONFIG_VAR2: "config2"
|
25
|
+
|
26
|
+
# you can also override configuration settings for each environment
|
27
|
+
production:
|
28
|
+
CONFIG_VAR1: "config1-production"
|
29
|
+
staging:
|
30
|
+
CONFIG_VAR1: "config1-staging"
|
31
|
+
|
32
|
+
collaborators:
|
33
|
+
all:
|
34
|
+
- "my-heroku-email@somedomain.com"
|
35
|
+
- "another-heroku-email@somedomain.com"
|
36
|
+
|
37
|
+
domains:
|
38
|
+
production:
|
39
|
+
- "awesomeapp.com"
|
40
|
+
- "www.awesomeapp.com"
|
41
|
+
|
42
|
+
addons:
|
43
|
+
all:
|
44
|
+
# add any other addons here
|
45
|
+
- custom_domains:basic
|
46
|
+
- newrelic:bronze
|
47
|
+
|
48
|
+
production:
|
49
|
+
# list production env specific addons here
|
50
|
+
- ssl:piggyback
|
51
|
+
- cron:hourly
|
data/lib/heroku-rails.rb
CHANGED
@@ -1,9 +1,3 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
rake_tasks do
|
5
|
-
load 'heroku/rails/tasks.rb'
|
6
|
-
end
|
7
|
-
end
|
8
|
-
end
|
9
|
-
end
|
1
|
+
require 'heroku/rails/heroku_config'
|
2
|
+
require 'heroku/rails/heroku_runner'
|
3
|
+
require 'heroku/rails/railtie' if defined?(::Rails::Railtie)
|
@@ -0,0 +1,69 @@
|
|
1
|
+
module Heroku
|
2
|
+
module Rails
|
3
|
+
class HerokuConfig
|
4
|
+
|
5
|
+
attr_accessor :settings
|
6
|
+
|
7
|
+
def initialize(config_filepath)
|
8
|
+
if File.exists?(config_filepath)
|
9
|
+
self.settings = YAML.load_file(config_filepath) || {}
|
10
|
+
else
|
11
|
+
self.settings = {}
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def apps
|
16
|
+
self.settings['apps']
|
17
|
+
end
|
18
|
+
|
19
|
+
def app_names
|
20
|
+
self.settings['apps'].values
|
21
|
+
end
|
22
|
+
|
23
|
+
def app_environments
|
24
|
+
self.settings['apps'].keys
|
25
|
+
end
|
26
|
+
|
27
|
+
# return the stack setting for a particular app environment
|
28
|
+
def stack(app_env)
|
29
|
+
stacks = self.settings['stacks'] || {}
|
30
|
+
stacks[app_env] || stacks['all']
|
31
|
+
end
|
32
|
+
|
33
|
+
# pull out the config setting hash for a particular app environment
|
34
|
+
def config(app_env)
|
35
|
+
config = self.settings['config'] || {}
|
36
|
+
all = config['all'] || {}
|
37
|
+
|
38
|
+
# overwrite all configs with the environment specific ones
|
39
|
+
all.merge(config[app_env] || {})
|
40
|
+
end
|
41
|
+
|
42
|
+
# return a list of domains for a particular app environment
|
43
|
+
def domains(app_env)
|
44
|
+
domains = self.settings['domains'] || {}
|
45
|
+
domains[app_env] || []
|
46
|
+
end
|
47
|
+
|
48
|
+
# return a list of collaborators for a particular app environment
|
49
|
+
def collaborators(app_env)
|
50
|
+
app_setting_list('collaborators', app_env)
|
51
|
+
end
|
52
|
+
|
53
|
+
# return a list of addons for a particular app environment
|
54
|
+
def addons(app_env)
|
55
|
+
app_setting_list('addons', app_env)
|
56
|
+
end
|
57
|
+
|
58
|
+
protected
|
59
|
+
|
60
|
+
def app_setting_list(setting_key, app)
|
61
|
+
setting = self.settings[setting_key] || {}
|
62
|
+
all = setting['all'] || []
|
63
|
+
|
64
|
+
# add in collaborators from app environment to the ones defined in all
|
65
|
+
(all + (setting[app] || [])).uniq
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,242 @@
|
|
1
|
+
require 'heroku/client'
|
2
|
+
|
3
|
+
module Heroku
|
4
|
+
module Rails
|
5
|
+
class HerokuRunner
|
6
|
+
def initialize(config)
|
7
|
+
@config = config
|
8
|
+
@environments = []
|
9
|
+
end
|
10
|
+
|
11
|
+
def authorize
|
12
|
+
return if @heroku
|
13
|
+
|
14
|
+
# setup heroku username and password so we can start up a heroku client
|
15
|
+
credentials_path = File.expand_path("~/.heroku/credentials")
|
16
|
+
|
17
|
+
# read in the username,password so we can build the client
|
18
|
+
if File.exists?(credentials_path)
|
19
|
+
auth = File.read(credentials_path)
|
20
|
+
username, password = auth.split("\n")
|
21
|
+
@heroku = Heroku::Client.new(username, password)
|
22
|
+
else
|
23
|
+
puts "Heroku not set up. Run `heroku list` in order to input your credentials and try again"
|
24
|
+
exit(1)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
# add a specific environment to the run list
|
29
|
+
def add_environment(env)
|
30
|
+
@environments << env
|
31
|
+
end
|
32
|
+
|
33
|
+
# use all environments
|
34
|
+
def all_environments
|
35
|
+
@environments = @config.app_environments
|
36
|
+
end
|
37
|
+
|
38
|
+
# setup apps (create if necessary)
|
39
|
+
def setup_apps
|
40
|
+
authorize unless @heroku
|
41
|
+
|
42
|
+
# get a list of all my current apps on Heroku (so we don't create dupes)
|
43
|
+
@my_apps = @heroku.list.map{|a| a.first}
|
44
|
+
|
45
|
+
each_heroku_app do |heroku_env, app_name, repo|
|
46
|
+
next if @my_apps.include?(app_name)
|
47
|
+
|
48
|
+
stack = @config.stack(heroku_env)
|
49
|
+
stack_option = " --stack #{stack}" if stack.to_s.size > 0
|
50
|
+
system_with_echo "heroku create #{app_name}#{stack_option} --remote #{app_name}"
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
# setup the stacks for each app (migrating if necessary)
|
55
|
+
def setup_stacks
|
56
|
+
authorize unless @heroku
|
57
|
+
each_heroku_app do |heroku_env, app_name, repo|
|
58
|
+
# get the intended stack setting
|
59
|
+
stack = @config.stack(heroku_env)
|
60
|
+
|
61
|
+
# get the remote info about the app from heroku
|
62
|
+
heroku_app_info = @heroku.info(app_name) || {}
|
63
|
+
|
64
|
+
# if the stacks don't match, then perform a migration
|
65
|
+
if stack != heroku_app_info[:stack]
|
66
|
+
puts "Migrating the app: #{app_name} to the stack: #{stack}"
|
67
|
+
system_with_echo "heroku stack:migrate #{stack} --app #{app_name}"
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
# setup the list of collaborators
|
73
|
+
def setup_collaborators
|
74
|
+
authorize unless @heroku
|
75
|
+
each_heroku_app do |heroku_env, app_name, repo|
|
76
|
+
# get the remote info about the app from heroku
|
77
|
+
heroku_app_info = @heroku.info(app_name) || {}
|
78
|
+
|
79
|
+
# get the intended list of collaborators to add
|
80
|
+
collaborator_emails = @config.collaborators(heroku_env)
|
81
|
+
|
82
|
+
# get existing collaborators
|
83
|
+
existing_emails = heroku_app_info[:collaborators].to_a.map{|c| c[:email]}
|
84
|
+
|
85
|
+
# get the list of collaborators to delete
|
86
|
+
existing_emails.each do |existing_email|
|
87
|
+
# check to see if we need to delete this person
|
88
|
+
unless collaborator_emails.include?(existing_email)
|
89
|
+
# delete that collaborator if they arent on the approved list
|
90
|
+
system_with_echo "heroku sharing:remove #{existing_email} --app #{app_name}"
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
# get the list of collaborators to add
|
95
|
+
collaborator_emails.each do |collaborator_email|
|
96
|
+
# check to see if we need to add this person
|
97
|
+
unless existing_emails.include?(collaborator_email)
|
98
|
+
# add the collaborator if they are not already on the server
|
99
|
+
system_with_echo "heroku sharing:add #{collaborator_email} --app #{app_name}"
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
# setup configuration
|
106
|
+
def setup_config
|
107
|
+
authorize unless @heroku
|
108
|
+
each_heroku_app do |heroku_env, app_name, repo|
|
109
|
+
# get the configuration that we are aiming towards
|
110
|
+
new_config = @config.config(heroku_env)
|
111
|
+
|
112
|
+
# default RACK_ENV to the heroku_env (unless its manually set to something else)
|
113
|
+
unless new_config["RACK_ENV"].to_s.length > 0
|
114
|
+
new_config["RACK_ENV"] = heroku_env
|
115
|
+
end
|
116
|
+
|
117
|
+
# get the existing config from heroku's servers
|
118
|
+
existing_config = @heroku.config_vars(app_name) || {}
|
119
|
+
|
120
|
+
# find the config variables to add
|
121
|
+
add_config = {}
|
122
|
+
new_config.each do |new_key, new_val|
|
123
|
+
add_config[new_key] = new_val unless existing_config[new_key] == new_val
|
124
|
+
end
|
125
|
+
|
126
|
+
# persist the changes onto heroku
|
127
|
+
unless add_config.empty?
|
128
|
+
# add the config
|
129
|
+
set_config = ""
|
130
|
+
add_config.each do |key, val|
|
131
|
+
set_config << "#{key}='#{val}' "
|
132
|
+
end
|
133
|
+
|
134
|
+
system_with_echo "heroku config:add #{set_config} --app #{app_name}"
|
135
|
+
end
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
# setup the addons for heroku
|
140
|
+
def setup_addons
|
141
|
+
authorize unless @heroku
|
142
|
+
each_heroku_app do |heroku_env, app_name, repo|
|
143
|
+
# get the addons that we are aiming towards
|
144
|
+
addons = @config.addons(heroku_env)
|
145
|
+
|
146
|
+
# get the addons that are already on the servers
|
147
|
+
existing_addons = (@heroku.installed_addons(app_name) || []).map{|a| a["name"]}
|
148
|
+
|
149
|
+
# add "custom_domains" if that addon doesnt already exist
|
150
|
+
# and we have domains configured for this app
|
151
|
+
addons << "custom_domains:basic" unless @config.domains(heroku_env).empty? or
|
152
|
+
addons.any?{|a| a =~ /custom_domains/} or
|
153
|
+
existing_addons.any?{|a| a =~ /custom_domains/}
|
154
|
+
|
155
|
+
# remove the addons that need to be removed
|
156
|
+
existing_addons.each do |existing_addon|
|
157
|
+
# check to see if we need to delete this addon
|
158
|
+
unless addons.include?(existing_addon)
|
159
|
+
# delete this addon if they arent on the approved list
|
160
|
+
system_with_echo "heroku addons:remove #{existing_addon} --app #{app_name}"
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
# add the addons that dont exist already
|
165
|
+
addons.each do |addon|
|
166
|
+
# check to see if we need to add this addon
|
167
|
+
unless existing_addons.include?(addon)
|
168
|
+
# add this addon if they are not already added
|
169
|
+
system_with_echo "heroku addons:add #{addon} --app #{app_name}"
|
170
|
+
end
|
171
|
+
end
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
175
|
+
# setup the domains for heroku
|
176
|
+
def setup_domains
|
177
|
+
authorize unless @heroku
|
178
|
+
each_heroku_app do |heroku_env, app_name, repo|
|
179
|
+
# get the domains that we are aiming towards
|
180
|
+
domains = @config.domains(heroku_env)
|
181
|
+
|
182
|
+
# get the domains that are already on the servers
|
183
|
+
existing_domains = (@heroku.list_domains(app_name) || []).map{|a| a[:domain]}
|
184
|
+
|
185
|
+
# remove the domains that need to be removed
|
186
|
+
existing_domains.each do |existing_domain|
|
187
|
+
# check to see if we need to delete this domain
|
188
|
+
unless domains.include?(existing_domain)
|
189
|
+
# delete this domain if they arent on the approved list
|
190
|
+
system_with_echo "heroku domains:remove #{existing_domain} --app #{app_name}"
|
191
|
+
end
|
192
|
+
end
|
193
|
+
|
194
|
+
# add the domains that dont exist already
|
195
|
+
domains.each do |domain|
|
196
|
+
# check to see if we need to add this domain
|
197
|
+
unless existing_domains.include?(domain)
|
198
|
+
# add this domain if they are not already added
|
199
|
+
system_with_echo "heroku domains:add #{domain} --app #{app_name}"
|
200
|
+
end
|
201
|
+
end
|
202
|
+
end
|
203
|
+
end
|
204
|
+
|
205
|
+
# cycles through each configured heroku app
|
206
|
+
# yields the environment name, the app name, and the repo url
|
207
|
+
def each_heroku_app
|
208
|
+
if @environments.blank? && @config.apps.size == 1
|
209
|
+
puts "Defaulting to #{env} app since only one app is defined"
|
210
|
+
@environments = [@config.app_environments.first]
|
211
|
+
end
|
212
|
+
|
213
|
+
if @environments.present?
|
214
|
+
@environments.each do |heroku_env|
|
215
|
+
app_name = @config.apps[heroku_env]
|
216
|
+
yield(heroku_env, app_name, "git@heroku.com:#{app_name}.git")
|
217
|
+
end
|
218
|
+
else
|
219
|
+
puts "You must first specify at least one Heroku app:
|
220
|
+
rake <app> [<app>] <command>
|
221
|
+
rake production restart
|
222
|
+
rake demo staging deploy"
|
223
|
+
|
224
|
+
puts "\nYou can use also command all Heroku apps for this project:
|
225
|
+
rake all heroku:share"
|
226
|
+
|
227
|
+
exit(1)
|
228
|
+
end
|
229
|
+
end
|
230
|
+
|
231
|
+
def system_with_echo(*args)
|
232
|
+
puts args.join(' ')
|
233
|
+
command(*args)
|
234
|
+
end
|
235
|
+
|
236
|
+
def command(*args)
|
237
|
+
system(*args)
|
238
|
+
end
|
239
|
+
|
240
|
+
end
|
241
|
+
end
|
242
|
+
end
|