heroku_san 3.0.0 → 3.0.1
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.md +4 -0
- data/examples/deploy_strategies.md +56 -0
- data/features/step_definitions/remote_steps.rb +5 -3
- data/lib/heroku_san/deploy/base.rb +4 -3
- data/lib/heroku_san/deploy/noop.rb +11 -0
- data/lib/heroku_san/deploy/rails.rb +5 -4
- data/lib/heroku_san/deploy/sinatra.rb +2 -2
- data/lib/heroku_san/project.rb +4 -3
- data/lib/heroku_san/stage.rb +2 -2
- data/lib/heroku_san/tasks.rb +6 -6
- data/lib/heroku_san/version.rb +1 -1
- data/spec/heroku_san/deploy/base_spec.rb +6 -6
- data/spec/heroku_san/deploy/rails_spec.rb +4 -4
- metadata +5 -3
data/CHANGELOG.md
CHANGED
@@ -0,0 +1,56 @@
|
|
1
|
+
# Deploy Strategies
|
2
|
+
|
3
|
+
If you look at the network graphs of `heroku_san` on github, you'll see a number of branches where the only change is the deletion of the following line from the `deploy` task:
|
4
|
+
|
5
|
+
- stage.migrate
|
6
|
+
|
7
|
+
If more than a few people are will to take the effort to fork a gem just so they can delete 1 line, something smells. The reason is that these forkers were using something other than Rails+ActiveRecord+SQL in their project. Some were using Sinatra, others were using Rails, but with CouchDB.
|
8
|
+
|
9
|
+
The _raison d'être_ for the `heroku_san` gem is to make Heroku deploys dirt simple. So, if people are making whole forks to customize the deploy task, we should make it less painful.
|
10
|
+
|
11
|
+
## Enter strategies
|
12
|
+
|
13
|
+
[Strategies](need_ref) are an object oriented programming pattern for creating pluggable execution control. There's is now a new class of objects that inherit from `HerokuSan::Deploy::Base`. These objects now control how deploys are executed for you. The Rails strategy, `HerokuSan::Deploy::Base` does exactly what HerokuSan has always done:
|
14
|
+
|
15
|
+
* push to git@heroku.com
|
16
|
+
* call rake db:migrate
|
17
|
+
* restart
|
18
|
+
|
19
|
+
On the other hand, the Sinatra strategy, `HerokuSan::Deploy::Sinatra` does nothing more than the base strategy:
|
20
|
+
|
21
|
+
* push to git@heroku.com
|
22
|
+
|
23
|
+
You can create your own strategies and then configure HerokuSan to use it instead of its default:
|
24
|
+
|
25
|
+
## Rails 3 projects
|
26
|
+
|
27
|
+
Amend your `Rakefile`:
|
28
|
+
|
29
|
+
require 'heroku_san'
|
30
|
+
|
31
|
+
class MyStrategy < HerokuSan::Deploy::Base
|
32
|
+
def deploy
|
33
|
+
super
|
34
|
+
# call my own code to do something unique
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
HerokuSan.project = HerokuSan::Project.new(Rails.root.join("config","heroku.yml"), :deploy => MyStrategy)
|
39
|
+
|
40
|
+
## Sinatra (and other Rack based apps)
|
41
|
+
|
42
|
+
Amend your `Rakefile`
|
43
|
+
|
44
|
+
require 'heroku_san'
|
45
|
+
|
46
|
+
class MyStrategy < HerokuSan::Deploy::Base
|
47
|
+
def deploy
|
48
|
+
super
|
49
|
+
# call my own code to do something unique
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
config_file = File.join(File.expand_path(File.dirname(__FILE__)), 'config', 'heroku.yml')
|
54
|
+
HerokuSan.project = HerokuSan::Project.new(config_file, :deploy => MyStrategy)
|
55
|
+
|
56
|
+
load "heroku_san/tasks.rb"
|
@@ -52,7 +52,6 @@ When /^I add heroku_san to the Gemfile$/ do
|
|
52
52
|
gem 'heroku_san', :path => '../../../.'
|
53
53
|
end
|
54
54
|
EOT
|
55
|
-
|
56
55
|
end
|
57
56
|
|
58
57
|
When /^I run bundle install$/ do
|
@@ -92,6 +91,7 @@ When /^I create my project on Heroku$/ do
|
|
92
91
|
---
|
93
92
|
test_app:
|
94
93
|
app: #{@app}
|
94
|
+
|
95
95
|
EOT
|
96
96
|
end
|
97
97
|
|
@@ -119,6 +119,7 @@ When /^I configure my project$/ do
|
|
119
119
|
app: #{@app}
|
120
120
|
config:
|
121
121
|
DROIDS: marvin
|
122
|
+
|
122
123
|
EOT
|
123
124
|
cmd = 'bundle exec rake test_app heroku:config'
|
124
125
|
run_simple cmd
|
@@ -187,6 +188,7 @@ When /^I install an addon$/ do
|
|
187
188
|
app: #{@app}
|
188
189
|
addons:
|
189
190
|
- deployhooks:campfire
|
191
|
+
|
190
192
|
END_CONFIG
|
191
193
|
|
192
194
|
run_simple 'bundle exec rake test_app heroku:addons'
|
@@ -212,7 +214,7 @@ end
|
|
212
214
|
def overwrite_simple_config_file
|
213
215
|
overwrite_file 'config/heroku.yml', <<EOT.strip_heredoc
|
214
216
|
---
|
215
|
-
test_app:
|
217
|
+
test_app:
|
218
|
+
|
216
219
|
EOT
|
217
|
-
|
218
220
|
end
|
@@ -1,13 +1,14 @@
|
|
1
1
|
module HerokuSan
|
2
2
|
module Deploy
|
3
3
|
class Base
|
4
|
-
def initialize(stage,
|
4
|
+
def initialize(stage, commit = nil, force = nil)
|
5
5
|
@stage = stage
|
6
|
-
@
|
6
|
+
@commit = commit
|
7
|
+
@force = force
|
7
8
|
end
|
8
9
|
|
9
10
|
def deploy
|
10
|
-
@stage.push(@
|
11
|
+
@stage.push(@commit, @force)
|
11
12
|
end
|
12
13
|
end
|
13
14
|
end
|
@@ -2,11 +2,12 @@ require 'heroku_san/deploy/base'
|
|
2
2
|
|
3
3
|
module HerokuSan
|
4
4
|
module Deploy
|
5
|
-
class Rails <
|
5
|
+
class Rails < Base
|
6
6
|
def deploy
|
7
|
-
|
8
|
-
|
9
|
-
|
7
|
+
# TODO: Add announce/logger
|
8
|
+
super
|
9
|
+
@stage.rake('db:migrate')
|
10
|
+
@stage.restart
|
10
11
|
end
|
11
12
|
end
|
12
13
|
end
|
data/lib/heroku_san/project.rb
CHANGED
@@ -13,11 +13,13 @@ module HerokuSan
|
|
13
13
|
@app_settings = {}
|
14
14
|
config = parse(@config_file)
|
15
15
|
config.each do |stage, settings|
|
16
|
+
# TODO: Push this eval later (j.i.t.)
|
16
17
|
@app_settings[stage] = HerokuSan::Stage.new(stage, settings.merge(options.slice(:deploy)))
|
17
18
|
end
|
18
19
|
end
|
19
20
|
|
20
21
|
def create_config
|
22
|
+
# TODO: Convert true/false returns to success/exception
|
21
23
|
template = File.expand_path(File.join(File.dirname(__FILE__), '../templates', 'heroku.example.yml'))
|
22
24
|
if File.exists?(@config_file)
|
23
25
|
false
|
@@ -43,11 +45,10 @@ module HerokuSan
|
|
43
45
|
end
|
44
46
|
|
45
47
|
def apps
|
46
|
-
if
|
48
|
+
if @apps.present?
|
47
49
|
@apps
|
48
50
|
else
|
49
|
-
@apps =
|
50
|
-
when 1
|
51
|
+
@apps = if all.size == 1
|
51
52
|
$stdout.puts "Defaulting to #{all.first.inspect} since only one app is defined"
|
52
53
|
all
|
53
54
|
else
|
data/lib/heroku_san/stage.rb
CHANGED
data/lib/heroku_san/tasks.rb
CHANGED
@@ -170,7 +170,7 @@ namespace :heroku do
|
|
170
170
|
desc "Pushes the given commit (default: HEAD)"
|
171
171
|
task :push, :commit do |t, args|
|
172
172
|
each_heroku_app do |stage|
|
173
|
-
stage.push(args
|
173
|
+
stage.push(args.commit)
|
174
174
|
end
|
175
175
|
end
|
176
176
|
|
@@ -178,7 +178,7 @@ namespace :heroku do
|
|
178
178
|
desc "Force-pushes the given commit (default: HEAD)"
|
179
179
|
task :force, :commit do |t, args|
|
180
180
|
each_heroku_app do |stage|
|
181
|
-
stage.push(args
|
181
|
+
stage.push(args.commit, :force)
|
182
182
|
end
|
183
183
|
end
|
184
184
|
end
|
@@ -207,19 +207,19 @@ namespace :heroku do
|
|
207
207
|
end
|
208
208
|
end
|
209
209
|
|
210
|
-
desc "
|
210
|
+
desc "Deploys the app (default: HEAD)"
|
211
211
|
task :deploy, [:commit] => [:before_deploy] do |t, args|
|
212
212
|
each_heroku_app do |stage|
|
213
|
-
stage.deploy(args)
|
213
|
+
stage.deploy(args.commit)
|
214
214
|
end
|
215
215
|
Rake::Task[:after_deploy].execute
|
216
216
|
end
|
217
217
|
|
218
218
|
namespace :deploy do
|
219
|
-
desc "
|
219
|
+
desc "Deploys the app with push --force (default: HEAD)"
|
220
220
|
task :force, [:commit] => [:before_deploy] do |t, args|
|
221
221
|
each_heroku_app do |stage|
|
222
|
-
stage.deploy(args.
|
222
|
+
stage.deploy(args.commit, :force)
|
223
223
|
end
|
224
224
|
Rake::Task[:after_deploy].execute
|
225
225
|
end
|
data/lib/heroku_san/version.rb
CHANGED
@@ -6,26 +6,26 @@ module HerokuSan
|
|
6
6
|
let(:stage) { HerokuSan::Stage.new('test', {"app" => "awesomeapp", "deploy" => 'HerokuSan::Deploy::Base'}) }
|
7
7
|
|
8
8
|
it "calls push" do
|
9
|
-
subject = described_class.new(stage
|
9
|
+
subject = described_class.new(stage)
|
10
10
|
stage.should_receive(:push).with(nil, nil)
|
11
11
|
subject.deploy
|
12
12
|
end
|
13
13
|
|
14
14
|
it "calls push(sha)" do
|
15
|
-
subject = described_class.new(stage,
|
15
|
+
subject = described_class.new(stage, 'sha')
|
16
16
|
stage.should_receive(:push).with('sha', nil)
|
17
17
|
subject.deploy
|
18
18
|
end
|
19
19
|
|
20
20
|
it "calls push(nil, :force)" do
|
21
|
-
subject = described_class.new(stage,
|
22
|
-
stage.should_receive(:push).with(nil,
|
21
|
+
subject = described_class.new(stage, nil, :force)
|
22
|
+
stage.should_receive(:push).with(nil, :force)
|
23
23
|
subject.deploy
|
24
24
|
end
|
25
25
|
|
26
26
|
it "calls push(sha, :force)" do
|
27
|
-
subject = described_class.new(stage,
|
28
|
-
stage.should_receive(:push).with('sha',
|
27
|
+
subject = described_class.new(stage, 'sha', :force)
|
28
|
+
stage.should_receive(:push).with('sha', :force)
|
29
29
|
subject.deploy
|
30
30
|
end
|
31
31
|
end
|
@@ -5,11 +5,11 @@ module HerokuSan
|
|
5
5
|
describe Rails do
|
6
6
|
let(:stage) { HerokuSan::Stage.new('test', {"app" => "awesomeapp", "deploy" => 'HerokuSan::Deploy::Rails'}) }
|
7
7
|
|
8
|
-
it "calls migrate" do
|
8
|
+
it "calls push, rake db:migrate & restart" do
|
9
9
|
subject = described_class.new(stage, {})
|
10
|
-
stage.should_receive(:push) # "mock" super
|
11
|
-
stage.should_receive(:rake).with('db:migrate')
|
12
|
-
stage.should_receive(:restart)
|
10
|
+
stage.should_receive(:push) { "pushed" } # "mock" super
|
11
|
+
stage.should_receive(:rake).with('db:migrate') { "migrated" }
|
12
|
+
stage.should_receive(:restart) { "restarted" }
|
13
13
|
subject.deploy
|
14
14
|
end
|
15
15
|
end
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 3
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
version: 3.0.
|
8
|
+
- 1
|
9
|
+
version: 3.0.1
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Elijah Miller
|
@@ -17,7 +17,7 @@ autorequire:
|
|
17
17
|
bindir: bin
|
18
18
|
cert_chain: []
|
19
19
|
|
20
|
-
date: 2012-05-
|
20
|
+
date: 2012-05-16 00:00:00 -07:00
|
21
21
|
default_executable:
|
22
22
|
dependencies:
|
23
23
|
- !ruby/object:Gem::Dependency
|
@@ -159,6 +159,7 @@ files:
|
|
159
159
|
- autotest/discover.rb
|
160
160
|
- cucumber.yml
|
161
161
|
- examples/auto_tagger.rake
|
162
|
+
- examples/deploy_strategies.md
|
162
163
|
- examples/push_revision.rake
|
163
164
|
- features/config.feature
|
164
165
|
- features/extended-config.feature
|
@@ -170,6 +171,7 @@ files:
|
|
170
171
|
- lib/git.rb
|
171
172
|
- lib/heroku_san.rb
|
172
173
|
- lib/heroku_san/deploy/base.rb
|
174
|
+
- lib/heroku_san/deploy/noop.rb
|
173
175
|
- lib/heroku_san/deploy/rails.rb
|
174
176
|
- lib/heroku_san/deploy/sinatra.rb
|
175
177
|
- lib/heroku_san/project.rb
|