kumade 0.2.0 → 0.2.1
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +30 -12
- data/features/kumade_executable.feature +35 -11
- data/features/kumade_without_jammit.feature +40 -0
- data/features/step_definitions/bundler_steps.rb +33 -0
- data/features/step_definitions/git_steps.rb +18 -2
- data/features/step_definitions/kumade_steps.rb +9 -0
- data/features/support/env.rb +1 -1
- data/lib/kumade.rb +15 -0
- data/lib/kumade/deployer.rb +24 -7
- data/lib/kumade/railtie.rb +10 -0
- data/lib/kumade/runner.rb +5 -1
- data/lib/kumade/version.rb +1 -1
- data/lib/tasks/deploy.rake +8 -0
- data/spec/kumade/deployer_spec.rb +88 -10
- data/spec/kumade/runner_spec.rb +11 -0
- data/spec/kumade_spec.rb +20 -0
- metadata +86 -124
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Kumade [![Build Status](https://secure.travis-ci.org/thoughtbot/kumade.png)](http://travis-ci.org/thoughtbot/kumade)
|
1
|
+
# Kumade 熊手 [![Build Status](https://secure.travis-ci.org/thoughtbot/kumade.png)](http://travis-ci.org/thoughtbot/kumade)
|
2
2
|
Kumade is a set of basic Rake tasks for deploying to Heroku. It aims to
|
3
3
|
provide most of what you want. Unlike other Heroku deploy gems, it is
|
4
4
|
well-tested.
|
@@ -22,31 +22,35 @@ gem 'kumade'
|
|
22
22
|
```
|
23
23
|
|
24
24
|
## Usage
|
25
|
-
|
25
|
+
|
26
|
+
kumade will deploy to any Heroku remote in the repo.
|
26
27
|
For example, if you have a remote named "bamboo":
|
27
28
|
|
28
|
-
$ kumade
|
29
|
+
$ bundle exec kumade bamboo
|
29
30
|
|
30
31
|
which will autodetect the name of the Heroku app that the bamboo remote points
|
31
|
-
to
|
32
|
+
to and deploy to it.
|
32
33
|
|
33
|
-
To run in pretend mode, which
|
34
|
+
To run in pretend mode, which prints what would be done without actually doing
|
35
|
+
any of it:
|
34
36
|
|
35
|
-
$ kumade
|
37
|
+
$ bundle exec kumade bamboo -p
|
36
38
|
|
37
|
-
The default
|
39
|
+
The default is to deploy to staging:
|
38
40
|
|
39
|
-
$ kumade # equivalent to "kumade
|
41
|
+
$ bundle exec kumade # equivalent to "bundle exec kumade staging"
|
40
42
|
|
41
43
|
## Does it support the Cedar stack?
|
42
44
|
|
43
|
-
Yes.
|
45
|
+
Yes. To indicate that a particular app is using Cedar, run with the -c flag:
|
46
|
+
|
47
|
+
bundle exec kumade bamboo -c
|
44
48
|
|
45
49
|
## Sample Output
|
46
50
|
|
47
51
|
### Normal mode
|
48
52
|
|
49
|
-
$ kumade
|
53
|
+
$ kumade heroku-staging
|
50
54
|
==> Deploying to: heroku-staging
|
51
55
|
==> heroku-staging is a Heroku remote
|
52
56
|
==> Git repo is clean
|
@@ -104,7 +108,7 @@ Yes.
|
|
104
108
|
|
105
109
|
### Pretend mode
|
106
110
|
|
107
|
-
$ kumade
|
111
|
+
$ kumade heroku-staging -p
|
108
112
|
==> In Pretend Mode
|
109
113
|
==> Deploying to: heroku-staging
|
110
114
|
==> heroku-staging is a Heroku remote
|
@@ -118,7 +122,7 @@ Yes.
|
|
118
122
|
|
119
123
|
### Pretend Mode with a non-Heroku remote
|
120
124
|
|
121
|
-
$ kumade
|
125
|
+
$ kumade origin -p
|
122
126
|
==> In Pretend Mode
|
123
127
|
==> Deploying to: origin
|
124
128
|
==> ! Cannot deploy: "origin" remote does not point to Heroku
|
@@ -131,6 +135,20 @@ Tested against:
|
|
131
135
|
* MRI 1.9.2
|
132
136
|
* REE 1.8.7
|
133
137
|
|
138
|
+
## Misc Features
|
139
|
+
|
140
|
+
Want to run a task before bundling your assets on deploy? In your rails app's rake tasks, drop in:
|
141
|
+
|
142
|
+
``` ruby
|
143
|
+
namespace :deploy do
|
144
|
+
task :assets do
|
145
|
+
puts "This runs before assets are committed and pushed to the remote"
|
146
|
+
end
|
147
|
+
end
|
148
|
+
```
|
149
|
+
|
150
|
+
You can hook in any custom code you want to run there before deploying!
|
151
|
+
|
134
152
|
## What's with the name?
|
135
153
|
|
136
154
|
Kumade ([pronunciation here](http://translate.google.com/#ja|en|熊手)) means
|
@@ -1,4 +1,4 @@
|
|
1
|
-
@extra-timeout @creates-remote
|
1
|
+
@extra-timeout @creates-remote @disable-bundler
|
2
2
|
Feature: Kumade executable
|
3
3
|
As a user
|
4
4
|
I want to be able to use the kumade executable
|
@@ -7,16 +7,16 @@ Feature: Kumade executable
|
|
7
7
|
Background:
|
8
8
|
Given a directory named "executable"
|
9
9
|
And I cd to "executable"
|
10
|
-
|
11
|
-
And I
|
12
|
-
And I
|
13
|
-
|
10
|
+
And I set up the Gemfile with kumade
|
11
|
+
And I add "jammit" to the Gemfile
|
12
|
+
And I bundle
|
13
|
+
When I set up a git repo
|
14
14
|
And I create a Heroku remote for "pretend-staging-app" named "pretend-staging"
|
15
15
|
And I create a Heroku remote for "app-two" named "staging"
|
16
16
|
And I create a non-Heroku remote named "bad-remote"
|
17
17
|
|
18
18
|
Scenario: Pretend mode with a Heroku remote
|
19
|
-
When I run
|
19
|
+
When I run kumade with "pretend-staging -p"
|
20
20
|
Then the output should contain "In Pretend Mode"
|
21
21
|
And the output should contain:
|
22
22
|
"""
|
@@ -24,6 +24,7 @@ Feature: Kumade executable
|
|
24
24
|
==> Packaged assets with Jammit
|
25
25
|
run git push origin master
|
26
26
|
==> Pushed master -> origin
|
27
|
+
run git branch deploy
|
27
28
|
run git push -f pretend-staging deploy:master
|
28
29
|
==> Force pushed master -> pretend-staging
|
29
30
|
==> Migrated pretend-staging-app
|
@@ -33,30 +34,53 @@ Feature: Kumade executable
|
|
33
34
|
But the output should not contain "==> Packaged assets with More"
|
34
35
|
|
35
36
|
Scenario: Default environment is staging
|
36
|
-
When I run
|
37
|
+
When I run kumade with "-p"
|
37
38
|
Then the output should contain "==> Deployed to: staging"
|
38
39
|
|
39
40
|
Scenario: Can deploy to arbitrary environment
|
40
|
-
When I run
|
41
|
+
When I run kumade with "bamboo"
|
41
42
|
Then the output should contain "==> Deploying to: bamboo"
|
42
|
-
|
43
|
+
And the output should match /Cannot deploy: /
|
43
44
|
|
44
45
|
Scenario: Deploying to a non-Heroku remote fails
|
45
|
-
When I run
|
46
|
+
When I run kumade with "bad-remote"
|
46
47
|
Then the output should match /==> ! Cannot deploy: "bad-remote" remote does not point to Heroku/
|
47
48
|
|
48
49
|
Scenario: Deploy from another branch
|
49
50
|
When I run `git checkout -b new_branch`
|
50
|
-
|
51
|
+
And I run kumade with "pretend-staging -p"
|
51
52
|
Then the output should contain:
|
52
53
|
"""
|
53
54
|
==> Git repo is clean
|
54
55
|
==> Packaged assets with Jammit
|
55
56
|
run git push origin new_branch
|
56
57
|
==> Pushed new_branch -> origin
|
58
|
+
run git branch deploy
|
57
59
|
run git push -f pretend-staging deploy:master
|
58
60
|
==> Force pushed new_branch -> pretend-staging
|
59
61
|
==> Migrated pretend-staging-app
|
60
62
|
run git checkout new_branch && git branch -D deploy
|
61
63
|
==> Deployed to: pretend-staging
|
62
64
|
"""
|
65
|
+
|
66
|
+
Scenario: Git is clean if there are untracked files
|
67
|
+
Given I write to "new-file" with:
|
68
|
+
"""
|
69
|
+
clean
|
70
|
+
"""
|
71
|
+
When I run kumade with "pretend-staging"
|
72
|
+
Then the output from "bundle exec kumade pretend-staging" should not contain "==> ! Cannot deploy: repo is not clean"
|
73
|
+
|
74
|
+
Scenario: Git is not clean if a tracked file is modified
|
75
|
+
Given I write to "new-file" with:
|
76
|
+
"""
|
77
|
+
clean
|
78
|
+
"""
|
79
|
+
And I commit everything in the current repo
|
80
|
+
When I append to "new-file" with "dirty it up"
|
81
|
+
And I run kumade with "pretend-staging"
|
82
|
+
Then the output from "bundle exec kumade pretend-staging" should contain "==> ! Cannot deploy: repo is not clean"
|
83
|
+
|
84
|
+
Scenario: Jammit packager runs if Jammit is installed
|
85
|
+
When I run kumade with "pretend-staging"
|
86
|
+
Then the output from "bundle exec kumade pretend-staging" should contain "==> ! Error: Jammit::MissingConfiguration"
|
@@ -0,0 +1,40 @@
|
|
1
|
+
@extra-timeout @creates-remote @disable-bundler
|
2
|
+
Feature: Kumade without jammit
|
3
|
+
|
4
|
+
Background:
|
5
|
+
Given a directory named "executable"
|
6
|
+
And I cd to "executable"
|
7
|
+
And I set up the Gemfile with kumade
|
8
|
+
And I bundle
|
9
|
+
When I set up a git repo
|
10
|
+
And I create a Heroku remote for "pretend-staging-app" named "pretend-staging"
|
11
|
+
|
12
|
+
Scenario: Jammit packager does not run if Jammit is not installed
|
13
|
+
When I run kumade with "pretend-staging"
|
14
|
+
Then the output should not contain "==> ! Error: Jammit::MissingConfiguration"
|
15
|
+
|
16
|
+
Scenario: Run custom task if it exists
|
17
|
+
Given I write to "Rakefile" with:
|
18
|
+
"""
|
19
|
+
namespace :deploy do
|
20
|
+
task :assets do
|
21
|
+
puts 'Hi!'
|
22
|
+
end
|
23
|
+
end
|
24
|
+
"""
|
25
|
+
When I run kumade with "pretend-staging"
|
26
|
+
Then the output should contain "Running deploy:assets task"
|
27
|
+
And the output should contain "Hi!"
|
28
|
+
|
29
|
+
Scenario: Don't run rake task in pretend mode
|
30
|
+
Given I write to "Rakefile" with:
|
31
|
+
"""
|
32
|
+
namespace :deploy do
|
33
|
+
task :assets do
|
34
|
+
puts 'Hi!'
|
35
|
+
end
|
36
|
+
end
|
37
|
+
"""
|
38
|
+
When I run kumade with "pretend-staging -p"
|
39
|
+
Then the output should contain "Running deploy:assets task"
|
40
|
+
And the output should not contain "Hi!"
|
@@ -0,0 +1,33 @@
|
|
1
|
+
When /^I bundle$/ do
|
2
|
+
When %{I successfully run `bundle --gemfile=./Gemfile --local || bundle --gemfile=./Gemfile`}
|
3
|
+
end
|
4
|
+
|
5
|
+
When /^I rebundle$/ do
|
6
|
+
steps %{
|
7
|
+
When I bundle
|
8
|
+
And I commit everything in the current repo
|
9
|
+
}
|
10
|
+
end
|
11
|
+
|
12
|
+
Given /^an empty Gemfile$/ do
|
13
|
+
When %{I write to "Gemfile" with:}, ""
|
14
|
+
end
|
15
|
+
|
16
|
+
When /^I set up the Gemfile with kumade$/ do
|
17
|
+
steps %{
|
18
|
+
When I write to "Gemfile" with:
|
19
|
+
"""
|
20
|
+
gem 'kumade', :path => '../../..'
|
21
|
+
"""
|
22
|
+
}
|
23
|
+
end
|
24
|
+
|
25
|
+
When /^I add "([^"]+)" to the Gemfile$/ do |gem|
|
26
|
+
steps %{
|
27
|
+
When I append to "Gemfile" with:
|
28
|
+
"""
|
29
|
+
|
30
|
+
gem '#{gem}'
|
31
|
+
"""
|
32
|
+
}
|
33
|
+
end
|
@@ -1,9 +1,25 @@
|
|
1
1
|
When /^I create a Heroku remote for "([^"]*)" named "([^"]*)"$/ do |app_name, remote_name|
|
2
|
-
When %{I run `git remote add #{remote_name} git@heroku.com:#{app_name}.git`}
|
2
|
+
When %{I successfully run `git remote add #{remote_name} git@heroku.com:#{app_name}.git`}
|
3
3
|
end
|
4
4
|
|
5
5
|
When /^I create a non-Heroku remote named "([^"]*)"$/ do |remote_name|
|
6
|
-
When %{I run `git remote add #{remote_name} git@github.com:gabebw/kumade.git`}
|
6
|
+
When %{I successfully run `git remote add #{remote_name} git@github.com:gabebw/kumade.git`}
|
7
|
+
end
|
8
|
+
|
9
|
+
When /^I set up a git repo$/ do
|
10
|
+
steps %{
|
11
|
+
When I successfully run `git init`
|
12
|
+
And I successfully run `touch .gitkeep`
|
13
|
+
And I successfully run `git add .`
|
14
|
+
And I successfully run `git commit -am First`
|
15
|
+
}
|
16
|
+
end
|
17
|
+
|
18
|
+
When /^I commit everything in the current repo$/ do
|
19
|
+
steps %{
|
20
|
+
When I successfully run `git add .`
|
21
|
+
And I successfully run `git commit -am MY_MESSAGE`
|
22
|
+
}
|
7
23
|
end
|
8
24
|
|
9
25
|
After("@creates-remote") do
|
data/features/support/env.rb
CHANGED
data/lib/kumade.rb
CHANGED
@@ -1,6 +1,9 @@
|
|
1
|
+
require 'rake'
|
1
2
|
require 'thor'
|
3
|
+
|
2
4
|
require 'kumade/deployer'
|
3
5
|
require 'kumade/runner'
|
6
|
+
require 'kumade/railtie'
|
4
7
|
|
5
8
|
module Kumade
|
6
9
|
def self.app_for(environment)
|
@@ -11,4 +14,16 @@ module Kumade
|
|
11
14
|
nil
|
12
15
|
end
|
13
16
|
end
|
17
|
+
def self.environments
|
18
|
+
url_remotes = `git remote`.strip.split("\n").map{|remote| [remote, `git config --get remote.#{remote}.url`.strip] }.select{|remote| remote.last =~ /^git@heroku\.com:(.+)\.git$/}.map{|remote| remote.first}
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.on_cedar!(app)
|
22
|
+
@cedar_apps ||= []
|
23
|
+
@cedar_apps << app
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.cedar?(app)
|
27
|
+
@cedar_apps.include?(app)
|
28
|
+
end
|
14
29
|
end
|
data/lib/kumade/deployer.rb
CHANGED
@@ -3,11 +3,12 @@ module Kumade
|
|
3
3
|
DEPLOY_BRANCH = "deploy"
|
4
4
|
attr_reader :environment, :pretending
|
5
5
|
|
6
|
-
def initialize(environment = 'staging', pretending = false)
|
6
|
+
def initialize(environment = 'staging', pretending = false, cedar = false)
|
7
7
|
super()
|
8
8
|
@environment = environment
|
9
9
|
@pretending = pretending
|
10
10
|
@branch = current_branch
|
11
|
+
@cedar = cedar
|
11
12
|
end
|
12
13
|
|
13
14
|
def deploy
|
@@ -31,6 +32,9 @@ module Kumade
|
|
31
32
|
end
|
32
33
|
|
33
34
|
def sync_heroku
|
35
|
+
unless branch_exist?(DEPLOY_BRANCH)
|
36
|
+
run_or_error("git branch deploy", "Failed to create #{DEPLOY_BRANCH}")
|
37
|
+
end
|
34
38
|
run_or_error("git push -f #{environment} #{DEPLOY_BRANCH}:master",
|
35
39
|
"Failed to force push #{DEPLOY_BRANCH} -> #{environment}/master")
|
36
40
|
success("Force pushed #{@branch} -> #{environment}")
|
@@ -49,7 +53,7 @@ module Kumade
|
|
49
53
|
end
|
50
54
|
|
51
55
|
def heroku(command, app)
|
52
|
-
heroku_command = if
|
56
|
+
heroku_command = if @cedar
|
53
57
|
"bundle exec heroku run"
|
54
58
|
else
|
55
59
|
"bundle exec heroku"
|
@@ -58,11 +62,6 @@ module Kumade
|
|
58
62
|
"Failed to run #{command} on Heroku")
|
59
63
|
end
|
60
64
|
|
61
|
-
def on_cedar?(app)
|
62
|
-
selected_stack = run("heroku stack --app '#{app}'", :capture => true).split("\n").grep(/^\*/).first
|
63
|
-
selected_stack && selected_stack.include?('cedar')
|
64
|
-
end
|
65
|
-
|
66
65
|
def ensure_clean_git
|
67
66
|
if ! pretending && git_dirty?
|
68
67
|
error("Cannot deploy: repo is not clean.")
|
@@ -74,6 +73,7 @@ module Kumade
|
|
74
73
|
def package_assets
|
75
74
|
package_with_jammit if jammit_installed?
|
76
75
|
package_with_more if more_installed?
|
76
|
+
invoke_custom_task if custom_task?
|
77
77
|
end
|
78
78
|
|
79
79
|
def package_with_jammit
|
@@ -110,6 +110,11 @@ module Kumade
|
|
110
110
|
end
|
111
111
|
end
|
112
112
|
|
113
|
+
def invoke_custom_task
|
114
|
+
success "Running deploy:assets task"
|
115
|
+
Rake::Task["deploy:assets"].invoke unless pretending
|
116
|
+
end
|
117
|
+
|
113
118
|
def git_add_and_commit_all_assets_in(dir)
|
114
119
|
run_or_error ["git checkout -b #{DEPLOY_BRANCH}", "git add -f #{dir}", "git commit -m 'Compiled assets'"],
|
115
120
|
"Cannot deploy: couldn't commit assets"
|
@@ -147,6 +152,11 @@ module Kumade
|
|
147
152
|
end)
|
148
153
|
end
|
149
154
|
|
155
|
+
def custom_task?
|
156
|
+
load("Rakefile") if File.exist?("Rakefile")
|
157
|
+
Rake::Task.task_defined?("deploy:assets")
|
158
|
+
end
|
159
|
+
|
150
160
|
def git_dirty?
|
151
161
|
`git diff --exit-code`
|
152
162
|
!$?.success?
|
@@ -166,6 +176,13 @@ module Kumade
|
|
166
176
|
config[:capture] ? `#{command}` : system("#{command}")
|
167
177
|
end
|
168
178
|
|
179
|
+
def branch_exist?(branch)
|
180
|
+
branches = `git branch`
|
181
|
+
regex = Regexp.new('[\\n\\s\\*]+' + Regexp.escape(branch.to_s) + '\\n')
|
182
|
+
result = ((branches =~ regex) ? true : false)
|
183
|
+
return result
|
184
|
+
end
|
185
|
+
|
169
186
|
def error(message)
|
170
187
|
say("==> ! #{message}", :red)
|
171
188
|
exit 1
|
data/lib/kumade/runner.rb
CHANGED
@@ -19,7 +19,7 @@ module Kumade
|
|
19
19
|
@out.puts "==> In Pretend Mode"
|
20
20
|
end
|
21
21
|
@out.puts "==> Deploying to: #{environment}"
|
22
|
-
Deployer.new(environment, pretending
|
22
|
+
Deployer.new(environment, pretending?, @options[:cedar]).deploy
|
23
23
|
@out.puts "==> Deployed to: #{environment}"
|
24
24
|
end
|
25
25
|
|
@@ -32,6 +32,10 @@ module Kumade
|
|
32
32
|
options[:pretend] = p
|
33
33
|
end
|
34
34
|
|
35
|
+
opts.on("-c", "--cedar", "Use this if your app is on cedar") do |cedar|
|
36
|
+
options[:cedar] = cedar
|
37
|
+
end
|
38
|
+
|
35
39
|
opts.on_tail('-v', '--version', 'Show version') do
|
36
40
|
@out.puts "kumade #{Kumade::VERSION}"
|
37
41
|
exit
|
data/lib/kumade/version.rb
CHANGED
@@ -15,7 +15,7 @@ describe Kumade::Deployer, "#pre_deploy" do
|
|
15
15
|
subject.pre_deploy
|
16
16
|
end
|
17
17
|
|
18
|
-
it "
|
18
|
+
it "syncs to github" do
|
19
19
|
%w(
|
20
20
|
ensure_clean_git
|
21
21
|
package_assets
|
@@ -32,7 +32,6 @@ describe Kumade::Deployer, "#deploy" do
|
|
32
32
|
let(:remote_name){ 'staging' }
|
33
33
|
let(:app_name){ 'kumade-staging' }
|
34
34
|
|
35
|
-
|
36
35
|
before do
|
37
36
|
subject.stub(:say)
|
38
37
|
force_add_heroku_remote(remote_name, app_name)
|
@@ -101,12 +100,28 @@ describe Kumade::Deployer, "#sync_heroku" do
|
|
101
100
|
let(:environment) { 'my-env' }
|
102
101
|
subject { Kumade::Deployer.new(environment) }
|
103
102
|
before { subject.stub(:say) }
|
103
|
+
|
104
|
+
context "when deploy branch exists" do
|
105
|
+
it "should calls `git push -f`" do
|
106
|
+
subject.stub(:branch_exist?).with("deploy").and_return(true)
|
107
|
+
subject.should_receive(:run).
|
108
|
+
with("git push -f #{environment} deploy:master").
|
109
|
+
and_return(true)
|
110
|
+
subject.sync_heroku
|
111
|
+
end
|
112
|
+
end
|
104
113
|
|
105
|
-
|
106
|
-
|
107
|
-
with("
|
108
|
-
|
109
|
-
|
114
|
+
context "when deploy branch doesn't exists" do
|
115
|
+
it "should calls `git branch deploy` and `git push -f`" do
|
116
|
+
subject.stub(:branch_exist?).with("deploy").and_return(false)
|
117
|
+
subject.should_receive(:run).
|
118
|
+
with("git branch deploy").
|
119
|
+
and_return(true)
|
120
|
+
subject.should_receive(:run).
|
121
|
+
with("git push -f #{environment} deploy:master").
|
122
|
+
and_return(true)
|
123
|
+
subject.sync_heroku
|
124
|
+
end
|
110
125
|
end
|
111
126
|
|
112
127
|
context "when syncing to heroku fails" do
|
@@ -115,7 +130,7 @@ describe Kumade::Deployer, "#sync_heroku" do
|
|
115
130
|
end
|
116
131
|
|
117
132
|
it "prints an error" do
|
118
|
-
subject.should_receive(:error)
|
133
|
+
subject.should_receive(:error).twice
|
119
134
|
subject.sync_heroku
|
120
135
|
end
|
121
136
|
end
|
@@ -203,6 +218,34 @@ describe Kumade::Deployer, "#package_assets" do
|
|
203
218
|
subject.package_assets
|
204
219
|
end
|
205
220
|
end
|
221
|
+
|
222
|
+
context "with custom rake task installed" do
|
223
|
+
before do
|
224
|
+
subject.stub(:jammit_installed? => false,
|
225
|
+
:more_installed? => false,
|
226
|
+
:invoke_custom_task => nil,
|
227
|
+
:custom_task? => true)
|
228
|
+
end
|
229
|
+
|
230
|
+
it "invokes custom task" do
|
231
|
+
subject.should_receive(:invoke_custom_task)
|
232
|
+
subject.package_assets
|
233
|
+
end
|
234
|
+
end
|
235
|
+
|
236
|
+
context "with custom rake task not installed" do
|
237
|
+
before do
|
238
|
+
subject.stub(:jammit_installed? => false,
|
239
|
+
:more_installed? => false,
|
240
|
+
:invoke_custom_task => nil,
|
241
|
+
:custom_task? => false)
|
242
|
+
end
|
243
|
+
|
244
|
+
it "does not invoke custom task" do
|
245
|
+
subject.should_not_receive(:invoke_custom_task)
|
246
|
+
subject.package_assets
|
247
|
+
end
|
248
|
+
end
|
206
249
|
end
|
207
250
|
|
208
251
|
describe Kumade::Deployer, "#package_with_jammit" do
|
@@ -246,6 +289,20 @@ describe Kumade::Deployer, "#package_with_jammit" do
|
|
246
289
|
end
|
247
290
|
end
|
248
291
|
|
292
|
+
describe Kumade::Deployer, "#invoke_custom_task" do
|
293
|
+
before do
|
294
|
+
Rake::Task.stub(:[] => task)
|
295
|
+
end
|
296
|
+
|
297
|
+
let(:task) { stub('task', :invoke => nil) }
|
298
|
+
|
299
|
+
it "calls deploy task" do
|
300
|
+
Rake::Task.should_receive(:[]).with("deploy:assets")
|
301
|
+
task.should_receive(:invoke)
|
302
|
+
subject.invoke_custom_task
|
303
|
+
end
|
304
|
+
end
|
305
|
+
|
249
306
|
describe Kumade::Deployer, "#package_with_more" do
|
250
307
|
before do
|
251
308
|
subject.stub(:git_add_and_commit_all_assets_in => true,
|
@@ -388,6 +445,25 @@ describe Kumade::Deployer, "#more_installed?" do
|
|
388
445
|
end
|
389
446
|
end
|
390
447
|
|
448
|
+
describe Kumade::Deployer, "#custom_task?" do
|
449
|
+
before do
|
450
|
+
Rake::Task.clear
|
451
|
+
end
|
452
|
+
|
453
|
+
it "returns true if it task found" do
|
454
|
+
namespace :deploy do
|
455
|
+
task :assets do
|
456
|
+
|
457
|
+
end
|
458
|
+
end
|
459
|
+
Kumade::Deployer.new.custom_task?.should be_true
|
460
|
+
end
|
461
|
+
|
462
|
+
it "returns false if task not found" do
|
463
|
+
Kumade::Deployer.new.custom_task?.should be_false
|
464
|
+
end
|
465
|
+
end
|
466
|
+
|
391
467
|
describe Kumade::Deployer, "#heroku_migrate" do
|
392
468
|
let(:environment){ 'staging' }
|
393
469
|
let(:app_name){ 'sushi' }
|
@@ -477,7 +553,8 @@ describe Kumade::Deployer, "#heroku" do
|
|
477
553
|
let(:app_name){ 'sushi' }
|
478
554
|
|
479
555
|
context "when on Cedar" do
|
480
|
-
|
556
|
+
subject { Kumade::Deployer.new('staging', false, cedar = true) }
|
557
|
+
|
481
558
|
it "runs commands with `run`" do
|
482
559
|
subject.should_receive(:run_or_error).with("bundle exec heroku run rake --app #{app_name}", //)
|
483
560
|
subject.heroku("rake", app_name)
|
@@ -485,7 +562,8 @@ describe Kumade::Deployer, "#heroku" do
|
|
485
562
|
end
|
486
563
|
|
487
564
|
context "when not on Cedar" do
|
488
|
-
|
565
|
+
subject { Kumade::Deployer.new('staging', false, cedar = false) }
|
566
|
+
|
489
567
|
it "runs commands without `run`" do
|
490
568
|
subject.should_receive(:run_or_error).with("bundle exec heroku rake --app #{app_name}", //)
|
491
569
|
subject.heroku("rake", app_name)
|
data/spec/kumade/runner_spec.rb
CHANGED
@@ -25,4 +25,15 @@ describe Kumade::Runner do
|
|
25
25
|
|
26
26
|
subject.run([environment], out)
|
27
27
|
end
|
28
|
+
|
29
|
+
%w(-c --cedar).each do |cedar_arg|
|
30
|
+
it "uses cedar when run with #{cedar_arg}" do
|
31
|
+
deployer = double("deployer").as_null_object
|
32
|
+
Kumade::Deployer.should_receive(:new).
|
33
|
+
with(anything, anything, true).
|
34
|
+
and_return(deployer)
|
35
|
+
|
36
|
+
subject.run([environment, cedar_arg], out)
|
37
|
+
end
|
38
|
+
end
|
28
39
|
end
|
data/spec/kumade_spec.rb
CHANGED
@@ -27,3 +27,23 @@ describe Kumade, ".app_for" do
|
|
27
27
|
Kumade.app_for(not_a_heroku_env).should be_nil
|
28
28
|
end
|
29
29
|
end
|
30
|
+
|
31
|
+
describe Kumade, ".environments" do
|
32
|
+
let(:environment){ 'staging' }
|
33
|
+
let(:app_name){ 'staging_test' }
|
34
|
+
let(:not_a_heroku_env){ 'fake_heroku' }
|
35
|
+
let(:not_a_heroku_url){ 'git@github.com:gabebw/kumade.git' }
|
36
|
+
|
37
|
+
before do
|
38
|
+
force_add_heroku_remote(environment, app_name)
|
39
|
+
`git remote add #{not_a_heroku_env} #{not_a_heroku_url}`
|
40
|
+
end
|
41
|
+
after do
|
42
|
+
remove_remote(environment)
|
43
|
+
remove_remote(not_a_heroku_env)
|
44
|
+
end
|
45
|
+
|
46
|
+
it "should return all environments" do
|
47
|
+
Kumade.environments.should == ["staging"]
|
48
|
+
end
|
49
|
+
end
|
metadata
CHANGED
@@ -1,145 +1,103 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: kumade
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.2.1
|
5
5
|
prerelease:
|
6
|
-
segments:
|
7
|
-
- 0
|
8
|
-
- 2
|
9
|
-
- 0
|
10
|
-
version: 0.2.0
|
11
6
|
platform: ruby
|
12
|
-
authors:
|
7
|
+
authors:
|
13
8
|
- Gabe Berke-Williams
|
14
9
|
- thoughtbot
|
15
10
|
autorequire:
|
16
11
|
bindir: bin
|
17
12
|
cert_chain: []
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
dependencies:
|
22
|
-
- !ruby/object:Gem::Dependency
|
13
|
+
date: 2011-08-19 00:00:00.000000000Z
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
23
16
|
name: heroku
|
24
|
-
|
25
|
-
type: :runtime
|
26
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
17
|
+
requirement: &2152636140 !ruby/object:Gem::Requirement
|
27
18
|
none: false
|
28
|
-
requirements:
|
19
|
+
requirements:
|
29
20
|
- - ~>
|
30
|
-
- !ruby/object:Gem::Version
|
31
|
-
|
32
|
-
segments:
|
33
|
-
- 2
|
34
|
-
- 0
|
35
|
-
version: "2.0"
|
36
|
-
version_requirements: *id001
|
37
|
-
- !ruby/object:Gem::Dependency
|
38
|
-
name: thor
|
39
|
-
prerelease: false
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: '2.0'
|
40
23
|
type: :runtime
|
41
|
-
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: *2152636140
|
26
|
+
- !ruby/object:Gem::Dependency
|
27
|
+
name: thor
|
28
|
+
requirement: &2152635640 !ruby/object:Gem::Requirement
|
42
29
|
none: false
|
43
|
-
requirements:
|
30
|
+
requirements:
|
44
31
|
- - ~>
|
45
|
-
- !ruby/object:Gem::Version
|
46
|
-
|
47
|
-
|
48
|
-
- 0
|
49
|
-
- 14
|
50
|
-
version: "0.14"
|
51
|
-
version_requirements: *id002
|
52
|
-
- !ruby/object:Gem::Dependency
|
53
|
-
name: rake
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0.14'
|
34
|
+
type: :runtime
|
54
35
|
prerelease: false
|
55
|
-
|
56
|
-
|
36
|
+
version_requirements: *2152635640
|
37
|
+
- !ruby/object:Gem::Dependency
|
38
|
+
name: rake
|
39
|
+
requirement: &2152635180 !ruby/object:Gem::Requirement
|
57
40
|
none: false
|
58
|
-
requirements:
|
41
|
+
requirements:
|
59
42
|
- - ~>
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
hash: 49
|
62
|
-
segments:
|
63
|
-
- 0
|
64
|
-
- 8
|
65
|
-
- 7
|
43
|
+
- !ruby/object:Gem::Version
|
66
44
|
version: 0.8.7
|
67
|
-
version_requirements: *id003
|
68
|
-
- !ruby/object:Gem::Dependency
|
69
|
-
name: rspec
|
70
|
-
prerelease: false
|
71
45
|
type: :development
|
72
|
-
|
46
|
+
prerelease: false
|
47
|
+
version_requirements: *2152635180
|
48
|
+
- !ruby/object:Gem::Dependency
|
49
|
+
name: rspec
|
50
|
+
requirement: &2152634720 !ruby/object:Gem::Requirement
|
73
51
|
none: false
|
74
|
-
requirements:
|
52
|
+
requirements:
|
75
53
|
- - ~>
|
76
|
-
- !ruby/object:Gem::Version
|
77
|
-
hash: 23
|
78
|
-
segments:
|
79
|
-
- 2
|
80
|
-
- 6
|
81
|
-
- 0
|
54
|
+
- !ruby/object:Gem::Version
|
82
55
|
version: 2.6.0
|
83
|
-
version_requirements: *id004
|
84
|
-
- !ruby/object:Gem::Dependency
|
85
|
-
name: cucumber
|
86
|
-
prerelease: false
|
87
56
|
type: :development
|
88
|
-
|
57
|
+
prerelease: false
|
58
|
+
version_requirements: *2152634720
|
59
|
+
- !ruby/object:Gem::Dependency
|
60
|
+
name: cucumber
|
61
|
+
requirement: &2152634260 !ruby/object:Gem::Requirement
|
89
62
|
none: false
|
90
|
-
requirements:
|
63
|
+
requirements:
|
91
64
|
- - ~>
|
92
|
-
- !ruby/object:Gem::Version
|
93
|
-
hash: 19
|
94
|
-
segments:
|
95
|
-
- 1
|
96
|
-
- 0
|
97
|
-
- 2
|
65
|
+
- !ruby/object:Gem::Version
|
98
66
|
version: 1.0.2
|
99
|
-
version_requirements: *id005
|
100
|
-
- !ruby/object:Gem::Dependency
|
101
|
-
name: aruba
|
102
|
-
prerelease: false
|
103
67
|
type: :development
|
104
|
-
|
68
|
+
prerelease: false
|
69
|
+
version_requirements: *2152634260
|
70
|
+
- !ruby/object:Gem::Dependency
|
71
|
+
name: aruba
|
72
|
+
requirement: &2152633800 !ruby/object:Gem::Requirement
|
105
73
|
none: false
|
106
|
-
requirements:
|
74
|
+
requirements:
|
107
75
|
- - ~>
|
108
|
-
- !ruby/object:Gem::Version
|
109
|
-
hash: 9
|
110
|
-
segments:
|
111
|
-
- 0
|
112
|
-
- 4
|
113
|
-
- 3
|
76
|
+
- !ruby/object:Gem::Version
|
114
77
|
version: 0.4.3
|
115
|
-
version_requirements: *id006
|
116
|
-
- !ruby/object:Gem::Dependency
|
117
|
-
name: jammit
|
118
|
-
prerelease: false
|
119
78
|
type: :development
|
120
|
-
|
79
|
+
prerelease: false
|
80
|
+
version_requirements: *2152633800
|
81
|
+
- !ruby/object:Gem::Dependency
|
82
|
+
name: jammit
|
83
|
+
requirement: &2152633340 !ruby/object:Gem::Requirement
|
121
84
|
none: false
|
122
|
-
requirements:
|
85
|
+
requirements:
|
123
86
|
- - ~>
|
124
|
-
- !ruby/object:Gem::Version
|
125
|
-
hash: 1
|
126
|
-
segments:
|
127
|
-
- 0
|
128
|
-
- 6
|
129
|
-
- 3
|
87
|
+
- !ruby/object:Gem::Version
|
130
88
|
version: 0.6.3
|
131
|
-
|
89
|
+
type: :development
|
90
|
+
prerelease: false
|
91
|
+
version_requirements: *2152633340
|
132
92
|
description: Simple rake tasks for deploying to Heroku
|
133
|
-
email:
|
93
|
+
email:
|
134
94
|
- gabe@thoughtbot.com
|
135
95
|
- support@thoughtbot.com
|
136
|
-
executables:
|
96
|
+
executables:
|
137
97
|
- kumade
|
138
98
|
extensions: []
|
139
|
-
|
140
99
|
extra_rdoc_files: []
|
141
|
-
|
142
|
-
files:
|
100
|
+
files:
|
143
101
|
- .gitignore
|
144
102
|
- .travis.yml
|
145
103
|
- Gemfile
|
@@ -148,56 +106,60 @@ files:
|
|
148
106
|
- Rakefile
|
149
107
|
- bin/kumade
|
150
108
|
- features/kumade_executable.feature
|
109
|
+
- features/kumade_without_jammit.feature
|
110
|
+
- features/step_definitions/bundler_steps.rb
|
151
111
|
- features/step_definitions/dependency_steps.rb
|
152
112
|
- features/step_definitions/git_steps.rb
|
113
|
+
- features/step_definitions/kumade_steps.rb
|
153
114
|
- features/support/env.rb
|
154
115
|
- kumade.gemspec
|
155
116
|
- lib/kumade.rb
|
156
117
|
- lib/kumade/deployer.rb
|
118
|
+
- lib/kumade/railtie.rb
|
157
119
|
- lib/kumade/runner.rb
|
158
120
|
- lib/kumade/version.rb
|
121
|
+
- lib/tasks/deploy.rake
|
159
122
|
- spec/kumade/deployer_spec.rb
|
160
123
|
- spec/kumade/runner_spec.rb
|
161
124
|
- spec/kumade_spec.rb
|
162
125
|
- spec/spec_helper.rb
|
163
|
-
|
164
|
-
homepage: ""
|
126
|
+
homepage: ''
|
165
127
|
licenses: []
|
166
|
-
|
167
128
|
post_install_message:
|
168
129
|
rdoc_options: []
|
169
|
-
|
170
|
-
require_paths:
|
130
|
+
require_paths:
|
171
131
|
- lib
|
172
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
132
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
173
133
|
none: false
|
174
|
-
requirements:
|
175
|
-
- -
|
176
|
-
- !ruby/object:Gem::Version
|
177
|
-
|
178
|
-
segments:
|
134
|
+
requirements:
|
135
|
+
- - ! '>='
|
136
|
+
- !ruby/object:Gem::Version
|
137
|
+
version: '0'
|
138
|
+
segments:
|
179
139
|
- 0
|
180
|
-
|
181
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
140
|
+
hash: -616977314755429055
|
141
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
182
142
|
none: false
|
183
|
-
requirements:
|
184
|
-
- -
|
185
|
-
- !ruby/object:Gem::Version
|
186
|
-
|
187
|
-
segments:
|
143
|
+
requirements:
|
144
|
+
- - ! '>='
|
145
|
+
- !ruby/object:Gem::Version
|
146
|
+
version: '0'
|
147
|
+
segments:
|
188
148
|
- 0
|
189
|
-
|
149
|
+
hash: -616977314755429055
|
190
150
|
requirements: []
|
191
|
-
|
192
151
|
rubyforge_project:
|
193
|
-
rubygems_version: 1.6
|
152
|
+
rubygems_version: 1.8.6
|
194
153
|
signing_key:
|
195
154
|
specification_version: 3
|
196
155
|
summary: Simple rake tasks for deploying to Heroku
|
197
|
-
test_files:
|
156
|
+
test_files:
|
198
157
|
- features/kumade_executable.feature
|
158
|
+
- features/kumade_without_jammit.feature
|
159
|
+
- features/step_definitions/bundler_steps.rb
|
199
160
|
- features/step_definitions/dependency_steps.rb
|
200
161
|
- features/step_definitions/git_steps.rb
|
162
|
+
- features/step_definitions/kumade_steps.rb
|
201
163
|
- features/support/env.rb
|
202
164
|
- spec/kumade/deployer_spec.rb
|
203
165
|
- spec/kumade/runner_spec.rb
|