kumade 0.2.2 → 0.3.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/.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
|