kumade 0.2.2 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.travis.yml +1 -0
- data/README.md +15 -82
- data/features/kumade_executable.feature +4 -4
- data/kumade.gemspec +4 -3
- data/lib/kumade.rb +4 -20
- data/lib/kumade/base.rb +30 -0
- data/lib/kumade/deployer.rb +26 -82
- data/lib/kumade/deployment_error.rb +4 -0
- data/lib/kumade/git.rb +73 -0
- data/lib/kumade/runner.rb +25 -12
- data/lib/kumade/version.rb +1 -1
- data/lib/tasks/deploy.rake +1 -1
- data/spec/kumade/base_spec.rb +18 -0
- data/spec/kumade/deployer_spec.rb +68 -175
- data/spec/kumade/git_spec.rb +51 -0
- data/spec/kumade/runner_spec.rb +35 -8
- data/spec/spec_helper.rb +2 -2
- metadata +38 -28
- data/spec/kumade_spec.rb +0 -49
data/lib/kumade/runner.rb
CHANGED
@@ -6,21 +6,23 @@ module Kumade
|
|
6
6
|
attr_reader :environment
|
7
7
|
end
|
8
8
|
|
9
|
-
def self.run(args=ARGV, out
|
9
|
+
def self.run(args=ARGV, out=StringIO.new)
|
10
10
|
@out = out
|
11
11
|
@options = parse_arguments!(args)
|
12
12
|
@environment = args.shift || 'staging'
|
13
13
|
|
14
|
-
|
14
|
+
swapping_stdout_for(@out) do
|
15
|
+
deploy
|
16
|
+
end
|
15
17
|
end
|
16
18
|
|
17
19
|
def self.deploy
|
18
20
|
if pretending?
|
19
|
-
|
21
|
+
puts "==> In Pretend Mode"
|
20
22
|
end
|
21
|
-
|
22
|
-
Deployer.new(environment, pretending
|
23
|
-
|
23
|
+
puts "==> Deploying to: #{environment}"
|
24
|
+
Deployer.new(environment, pretending?).deploy
|
25
|
+
puts "==> Deployed to: #{environment}"
|
24
26
|
end
|
25
27
|
|
26
28
|
def self.parse_arguments!(args)
|
@@ -32,17 +34,13 @@ module Kumade
|
|
32
34
|
options[:pretend] = p
|
33
35
|
end
|
34
36
|
|
35
|
-
opts.on("-c", "--cedar", "Use this if your app is on cedar") do |cedar|
|
36
|
-
options[:cedar] = cedar
|
37
|
-
end
|
38
|
-
|
39
37
|
opts.on_tail('-v', '--version', 'Show version') do
|
40
|
-
|
38
|
+
puts "kumade #{Kumade::VERSION}"
|
41
39
|
exit
|
42
40
|
end
|
43
41
|
|
44
42
|
opts.on_tail('-h', '--help', 'Show this message') do
|
45
|
-
|
43
|
+
puts opts
|
46
44
|
exit
|
47
45
|
end
|
48
46
|
end.parse!(args)
|
@@ -50,6 +48,21 @@ module Kumade
|
|
50
48
|
options
|
51
49
|
end
|
52
50
|
|
51
|
+
def self.swapping_stdout_for(io)
|
52
|
+
begin
|
53
|
+
$real_stdout = $stdout
|
54
|
+
$stdout = io unless pretending?
|
55
|
+
yield
|
56
|
+
rescue Kumade::DeploymentError
|
57
|
+
unless pretending?
|
58
|
+
io.rewind
|
59
|
+
$real_stdout.print(io.read)
|
60
|
+
end
|
61
|
+
ensure
|
62
|
+
$stdout = $real_stdout
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
53
66
|
def self.pretending?
|
54
67
|
@options[:pretend]
|
55
68
|
end
|
data/lib/kumade/version.rb
CHANGED
data/lib/tasks/deploy.rake
CHANGED
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Kumade::Base, "#success" do
|
4
|
+
it "exists" do
|
5
|
+
subject.should respond_to(:success)
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
describe Kumade::Base, "#error" do
|
10
|
+
it "exists" do
|
11
|
+
subject.should respond_to(:error)
|
12
|
+
end
|
13
|
+
|
14
|
+
it "prints its message and raises its message" do
|
15
|
+
subject.should_receive(:say).with("==> ! I'm an error!", :red)
|
16
|
+
lambda{ subject.error("I'm an error!") }.should raise_error(Kumade::DeploymentError)
|
17
|
+
end
|
18
|
+
end
|
@@ -1,5 +1,7 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
+
include Rake::DSL if defined?(Rake::DSL)
|
4
|
+
|
3
5
|
describe Kumade::Deployer, "#pre_deploy" do
|
4
6
|
before { subject.stub(:say) }
|
5
7
|
|
@@ -29,12 +31,11 @@ describe Kumade::Deployer, "#pre_deploy" do
|
|
29
31
|
end
|
30
32
|
|
31
33
|
describe Kumade::Deployer, "#deploy" do
|
32
|
-
let(:remote_name){ 'staging' }
|
33
|
-
let(:app_name){ 'kumade-staging' }
|
34
|
+
let(:remote_name) { 'staging' }
|
34
35
|
|
35
36
|
before do
|
36
37
|
subject.stub(:say)
|
37
|
-
force_add_heroku_remote(remote_name
|
38
|
+
force_add_heroku_remote(remote_name)
|
38
39
|
end
|
39
40
|
|
40
41
|
it "calls the correct methods in order" do
|
@@ -61,121 +62,39 @@ describe Kumade::Deployer, "#deploy" do
|
|
61
62
|
end
|
62
63
|
|
63
64
|
describe Kumade::Deployer, "#sync_github" do
|
64
|
-
|
65
|
-
|
66
|
-
it "calls `git push`" do
|
67
|
-
subject.should_receive(:run).
|
68
|
-
with("git push origin master").
|
69
|
-
and_return(true)
|
70
|
-
subject.sync_github
|
71
|
-
end
|
72
|
-
|
73
|
-
context "when `git push` fails" do
|
74
|
-
before { subject.stub(:run => false) }
|
75
|
-
|
76
|
-
it "prints an error message" do
|
77
|
-
subject.should_receive(:error).with("Failed to push master -> origin")
|
78
|
-
|
79
|
-
subject.sync_github
|
80
|
-
end
|
81
|
-
end
|
65
|
+
let(:git_mock) { mock() }
|
82
66
|
|
83
|
-
|
84
|
-
before { subject.stub(:run => true) }
|
67
|
+
before { subject.stub(:git => git_mock) }
|
85
68
|
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
end
|
90
|
-
|
91
|
-
it "prints a success message" do
|
92
|
-
subject.should_receive(:success).with("Pushed master -> origin")
|
93
|
-
|
94
|
-
subject.sync_github
|
95
|
-
end
|
69
|
+
it "calls git.push" do
|
70
|
+
git_mock.should_receive(:push).with("master")
|
71
|
+
subject.sync_github
|
96
72
|
end
|
97
73
|
end
|
98
74
|
|
99
75
|
describe Kumade::Deployer, "#sync_heroku" do
|
100
76
|
let(:environment) { 'my-env' }
|
101
|
-
|
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
|
113
|
-
|
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
|
125
|
-
end
|
77
|
+
let(:git_mock) { mock() }
|
126
78
|
|
127
|
-
|
128
|
-
before do
|
129
|
-
subject.stub(:run => false)
|
130
|
-
end
|
131
|
-
|
132
|
-
it "prints an error" do
|
133
|
-
subject.should_receive(:error).twice
|
134
|
-
subject.sync_heroku
|
135
|
-
end
|
136
|
-
end
|
137
|
-
|
138
|
-
context "when syncing to heroku succeeds" do
|
139
|
-
before do
|
140
|
-
subject.stub(:run => true)
|
141
|
-
subject.stub(:say)
|
142
|
-
end
|
143
|
-
|
144
|
-
it "does not raise an error" do
|
145
|
-
subject.should_not_receive(:error)
|
146
|
-
subject.sync_heroku
|
147
|
-
end
|
79
|
+
subject { Kumade::Deployer.new(environment) }
|
148
80
|
|
149
|
-
|
150
|
-
subject.should_receive(:success).
|
151
|
-
with("Force pushed master -> #{environment}")
|
81
|
+
before { subject.stub(:git => git_mock) }
|
152
82
|
|
153
|
-
|
154
|
-
|
83
|
+
it "calls git.create and git.push" do
|
84
|
+
git_mock.should_receive(:create).with("deploy")
|
85
|
+
git_mock.should_receive(:push).with("deploy:master", environment, true)
|
86
|
+
subject.sync_heroku
|
155
87
|
end
|
156
88
|
end
|
157
89
|
|
158
90
|
describe Kumade::Deployer, "#ensure_clean_git" do
|
159
|
-
|
91
|
+
let(:git_mock) { mock() }
|
160
92
|
|
161
|
-
|
162
|
-
before { subject.stub(:git_dirty? => true) }
|
93
|
+
before { subject.stub(:git => git_mock) }
|
163
94
|
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
end
|
168
|
-
end
|
169
|
-
|
170
|
-
context "when git is clean" do
|
171
|
-
before { subject.stub(:git_dirty? => false) }
|
172
|
-
|
173
|
-
it "prints a success message" do
|
174
|
-
subject.should_not_receive(:error)
|
175
|
-
subject.should_receive(:success).with("Git repo is clean")
|
176
|
-
|
177
|
-
subject.ensure_clean_git
|
178
|
-
end
|
95
|
+
it "calls git.ensure_clean_git" do
|
96
|
+
git_mock.should_receive(:ensure_clean_git)
|
97
|
+
subject.ensure_clean_git
|
179
98
|
end
|
180
99
|
end
|
181
100
|
|
@@ -261,7 +180,7 @@ describe Kumade::Deployer, "#package_with_jammit" do
|
|
261
180
|
end
|
262
181
|
|
263
182
|
context "with updated assets" do
|
264
|
-
before { subject.stub(:
|
183
|
+
before { subject.stub(:git => mock(:dirty? => true)) }
|
265
184
|
|
266
185
|
it "prints the correct message" do
|
267
186
|
subject.should_receive(:success).with("Packaged assets with Jammit")
|
@@ -290,12 +209,13 @@ describe Kumade::Deployer, "#package_with_jammit" do
|
|
290
209
|
end
|
291
210
|
|
292
211
|
describe Kumade::Deployer, "#invoke_custom_task" do
|
212
|
+
let(:task) { stub('task', :invoke => nil) }
|
213
|
+
|
293
214
|
before do
|
215
|
+
subject.stub(:say)
|
294
216
|
Rake::Task.stub(:[] => task)
|
295
217
|
end
|
296
218
|
|
297
|
-
let(:task) { stub('task', :invoke => nil) }
|
298
|
-
|
299
219
|
it "calls deploy task" do
|
300
220
|
Rake::Task.should_receive(:[]).with("kumade:before_asset_compilation")
|
301
221
|
task.should_receive(:invoke)
|
@@ -318,14 +238,14 @@ describe Kumade::Deployer, "#package_with_more" do
|
|
318
238
|
context "with changed assets" do
|
319
239
|
it "prints a success message" do
|
320
240
|
subject.stub(:run).with("bundle exec rake more:generate")
|
321
|
-
subject.stub(:
|
241
|
+
subject.stub(:git => mock(:dirty? => true))
|
322
242
|
subject.should_receive(:success).with("Packaged assets with More")
|
323
243
|
|
324
244
|
subject.package_with_more
|
325
245
|
end
|
326
246
|
|
327
247
|
it "calls git_add_and_commit_all_assets_in if assets were added" do
|
328
|
-
subject.stub(:
|
248
|
+
subject.stub(:git => mock(:dirty? => true),
|
329
249
|
:more_assets_path => 'blerg')
|
330
250
|
subject.stub(:run).with("bundle exec rake more:generate")
|
331
251
|
subject.should_receive(:git_add_and_commit_all_assets_in).
|
@@ -339,7 +259,7 @@ describe Kumade::Deployer, "#package_with_more" do
|
|
339
259
|
context "with no changed assets" do
|
340
260
|
it "prints no message" do
|
341
261
|
subject.stub(:run).with("bundle exec rake more:generate")
|
342
|
-
subject.stub(:
|
262
|
+
subject.stub(:git => mock(:dirty? => false))
|
343
263
|
subject.should_not_receive(:say)
|
344
264
|
|
345
265
|
subject.package_with_more
|
@@ -347,7 +267,7 @@ describe Kumade::Deployer, "#package_with_more" do
|
|
347
267
|
|
348
268
|
it "does not call git_add_and_commit_all_more_assets" do
|
349
269
|
subject.stub(:run).with("bundle exec rake more:generate")
|
350
|
-
subject.stub(:
|
270
|
+
subject.stub(:git => mock(:dirty? => false))
|
351
271
|
subject.should_not_receive(:git_add_and_commit_all_assets_in)
|
352
272
|
|
353
273
|
subject.package_with_more
|
@@ -368,29 +288,13 @@ describe Kumade::Deployer, "#package_with_more" do
|
|
368
288
|
end
|
369
289
|
|
370
290
|
describe Kumade::Deployer, "#git_add_and_commit_all_assets_in" do
|
371
|
-
|
372
|
-
subject.stub(:run => true)
|
373
|
-
subject.stub(:say)
|
374
|
-
end
|
375
|
-
|
376
|
-
it "prints a success message" do
|
377
|
-
subject.should_receive(:success).with("Added and committed all assets")
|
378
|
-
|
379
|
-
subject.git_add_and_commit_all_assets_in('blerg')
|
380
|
-
end
|
381
|
-
|
382
|
-
it "runs the correct commands" do
|
383
|
-
subject.should_receive(:run).
|
384
|
-
with("git checkout -b deploy && git add -f blerg && git commit -m 'Compiled assets'")
|
385
|
-
|
386
|
-
subject.git_add_and_commit_all_assets_in('blerg')
|
387
|
-
end
|
291
|
+
let(:git_mock) { mock() }
|
388
292
|
|
389
|
-
|
390
|
-
subject.stub(:run => false)
|
391
|
-
subject.should_receive(:error).with("Cannot deploy: couldn't commit assets")
|
293
|
+
before { subject.stub(:git => git_mock) }
|
392
294
|
|
393
|
-
|
295
|
+
it "calls git.add_and_commit_all_in" do
|
296
|
+
git_mock.should_receive(:add_and_commit_all_in).with("dir", 'deploy', 'Compiled assets', "Added and committed all assets", "couldn't commit assets")
|
297
|
+
subject.git_add_and_commit_all_assets_in("dir")
|
394
298
|
end
|
395
299
|
end
|
396
300
|
|
@@ -465,32 +369,30 @@ describe Kumade::Deployer, "#custom_task?" do
|
|
465
369
|
end
|
466
370
|
|
467
371
|
describe Kumade::Deployer, "#heroku_migrate" do
|
468
|
-
let(:environment){ 'staging' }
|
469
|
-
let(:app_name){ 'sushi' }
|
372
|
+
let(:environment) { 'staging' }
|
470
373
|
|
471
374
|
before do
|
472
375
|
subject.stub(:say)
|
473
|
-
force_add_heroku_remote(environment
|
376
|
+
force_add_heroku_remote(environment)
|
474
377
|
end
|
475
378
|
|
476
379
|
it "runs db:migrate with the correct app" do
|
477
380
|
subject.stub(:run => true)
|
478
381
|
subject.should_receive(:heroku).
|
479
|
-
with("rake db:migrate"
|
480
|
-
subject.should_receive(:success).with("Migrated
|
382
|
+
with("rake db:migrate")
|
383
|
+
subject.should_receive(:success).with("Migrated staging")
|
481
384
|
|
482
385
|
subject.heroku_migrate
|
483
386
|
end
|
484
387
|
end
|
485
388
|
|
486
389
|
describe Kumade::Deployer, "#ensure_heroku_remote_exists" do
|
487
|
-
let(:environment){ 'staging' }
|
488
|
-
let(:bad_environment){ 'bad' }
|
489
|
-
let(:staging_app_name) { 'staging-sushi' }
|
390
|
+
let(:environment) { 'staging' }
|
391
|
+
let(:bad_environment) { 'bad' }
|
490
392
|
|
491
393
|
before do
|
492
394
|
subject.stub(:say)
|
493
|
-
force_add_heroku_remote(environment
|
395
|
+
force_add_heroku_remote(environment)
|
494
396
|
`git remote add #{bad_environment} blerg@example.com`
|
495
397
|
end
|
496
398
|
|
@@ -533,61 +435,52 @@ describe Kumade::Deployer, "#ensure_heroku_remote_exists" do
|
|
533
435
|
end
|
534
436
|
end
|
535
437
|
|
536
|
-
describe Kumade::Deployer, "#
|
537
|
-
|
538
|
-
|
539
|
-
|
540
|
-
|
541
|
-
it "returns true if the remote exists" do
|
542
|
-
subject.remote_exists?(remote_name).should be_true
|
438
|
+
describe Kumade::Deployer, "#cedar?" do
|
439
|
+
context "when on Cedar" do
|
440
|
+
subject { Kumade::Deployer.new('staging', false) }
|
441
|
+
before { subject.stub(:heroku).and_return(" bamboo\n* cedar\n") }
|
442
|
+
its(:cedar?) { should be_true }
|
543
443
|
end
|
544
444
|
|
545
|
-
|
546
|
-
|
547
|
-
|
548
|
-
|
445
|
+
context "when not on Cedar" do
|
446
|
+
subject { Kumade::Deployer.new('staging', false) }
|
447
|
+
before { subject.stub(:heroku).and_return("* bamboo\n cedar\n") }
|
448
|
+
its(:cedar?) { should be_false }
|
549
449
|
end
|
550
450
|
end
|
551
451
|
|
552
452
|
describe Kumade::Deployer, "#heroku" do
|
553
|
-
let(:app_name){ 'sushi' }
|
554
|
-
|
555
453
|
context "when on Cedar" do
|
556
|
-
subject { Kumade::Deployer.new('staging', false
|
557
|
-
|
454
|
+
subject { Kumade::Deployer.new('staging', false) }
|
455
|
+
before { subject.stub(:cedar?).and_return(true) }
|
558
456
|
it "runs commands with `run`" do
|
559
|
-
subject.should_receive(:run_or_error).with("bundle exec heroku run rake --
|
560
|
-
subject.heroku("rake"
|
457
|
+
subject.should_receive(:run_or_error).with("bundle exec heroku run rake --remote staging", //)
|
458
|
+
subject.heroku("rake")
|
561
459
|
end
|
562
460
|
end
|
563
461
|
|
564
462
|
context "when not on Cedar" do
|
565
|
-
subject { Kumade::Deployer.new('staging', false
|
566
|
-
|
463
|
+
subject { Kumade::Deployer.new('staging', false) }
|
464
|
+
before { subject.stub(:cedar?).and_return(false) }
|
567
465
|
it "runs commands without `run`" do
|
568
|
-
subject.should_receive(:run_or_error).with("bundle exec heroku rake --
|
569
|
-
subject.heroku("rake"
|
466
|
+
subject.should_receive(:run_or_error).with("bundle exec heroku rake --remote staging", //)
|
467
|
+
subject.heroku("rake")
|
570
468
|
end
|
571
469
|
end
|
572
470
|
end
|
573
471
|
|
574
|
-
describe Kumade::Deployer, "#success" do
|
575
|
-
it "exists" do
|
576
|
-
subject.should respond_to(:success)
|
577
|
-
end
|
578
|
-
end
|
579
|
-
|
580
|
-
describe Kumade::Deployer, "#error" do
|
581
|
-
it "exists" do
|
582
|
-
subject.should respond_to(:error)
|
583
|
-
end
|
584
|
-
end
|
585
|
-
|
586
472
|
describe Kumade::Deployer, "#post_deploy" do
|
587
|
-
|
473
|
+
let(:git_mock) { mock() }
|
474
|
+
|
475
|
+
before { subject.stub(:git => git_mock) }
|
588
476
|
|
589
|
-
it "
|
590
|
-
|
477
|
+
it "calls git.delete" do
|
478
|
+
git_mock.should_receive(:delete).with('deploy', 'master')
|
591
479
|
subject.post_deploy
|
592
480
|
end
|
481
|
+
|
482
|
+
it "prints its message and raises its message" do
|
483
|
+
subject.should_receive(:say).with("==> ! I'm an error!", :red)
|
484
|
+
lambda { subject.error("I'm an error!") }.should raise_error(Kumade::DeploymentError)
|
485
|
+
end
|
593
486
|
end
|