capistrano-fanfare 0.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/.gitignore +19 -0
- data/.travis.yml +9 -0
- data/Gemfile +13 -0
- data/LICENSE +22 -0
- data/README.md +29 -0
- data/Rakefile +12 -0
- data/capistrano-fanfare.gemspec +24 -0
- data/lib/capistrano/fanfare/bundler.rb +84 -0
- data/lib/capistrano/fanfare/defaults.rb +66 -0
- data/lib/capistrano/fanfare/foreman/strategy/base.rb +54 -0
- data/lib/capistrano/fanfare/foreman/strategy/runit.rb +63 -0
- data/lib/capistrano/fanfare/foreman/strategy.rb +21 -0
- data/lib/capistrano/fanfare/foreman.rb +155 -0
- data/lib/capistrano/fanfare/git_style.rb +87 -0
- data/lib/capistrano/fanfare/multistage.rb +36 -0
- data/lib/capistrano/fanfare/version.rb +5 -0
- data/lib/capistrano/fanfare.rb +22 -0
- data/lib/capistrano/recipes/deploy/strategy/git_style.rb +22 -0
- data/spec/bundler_spec.rb +162 -0
- data/spec/defaults_spec.rb +177 -0
- data/spec/fixtures/Procfile +2 -0
- data/spec/fixtures/fanfare/bark.rb +14 -0
- data/spec/fixtures/fanfare/meow.rb +14 -0
- data/spec/foreman/strategy/runit_spec.rb +83 -0
- data/spec/foreman_spec.rb +234 -0
- data/spec/git_style_spec.rb +168 -0
- data/spec/git_style_strategy_spec.rb +42 -0
- data/spec/loading_spec.rb +26 -0
- data/spec/multistage_spec.rb +57 -0
- metadata +148 -0
@@ -0,0 +1,14 @@
|
|
1
|
+
module Capistrano::Fanfare::Bark
|
2
|
+
def self.load_into(configuration)
|
3
|
+
configuration.load do
|
4
|
+
task :bark do
|
5
|
+
set :message, 'ruff ruff'
|
6
|
+
message
|
7
|
+
end
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
if Capistrano::Configuration.instance
|
13
|
+
Capistrano::Fanfare::Bark.load_into(Capistrano::Configuration.instance)
|
14
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module Capistrano::Fanfare::Meow
|
2
|
+
def self.load_into(configuration)
|
3
|
+
configuration.load do
|
4
|
+
task :meow do
|
5
|
+
'purr purr'
|
6
|
+
end
|
7
|
+
end
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
if Capistrano::Configuration.instance
|
12
|
+
Capistrano::Fanfare::Meow.load_into(Capistrano::Configuration.instance)
|
13
|
+
end
|
14
|
+
|
@@ -0,0 +1,83 @@
|
|
1
|
+
require 'minitest/autorun'
|
2
|
+
require 'minitest/capistrano'
|
3
|
+
require 'capistrano/fanfare'
|
4
|
+
require 'capistrano/fanfare/foreman/strategy/runit'
|
5
|
+
|
6
|
+
describe Capistrano::Fanfare::Foreman::Strategy::Runit do
|
7
|
+
before do
|
8
|
+
@config = Capistrano::Configuration.new
|
9
|
+
@config.extend(MiniTest::Capistrano::ConfigurationExtension)
|
10
|
+
end
|
11
|
+
|
12
|
+
let(:strategy) { Capistrano::Fanfare::Foreman::Strategy::Runit.new(@config) }
|
13
|
+
|
14
|
+
it "#export generates runit services from the Procfile" do
|
15
|
+
@config.set :current_release, "/srv/fooapp/releases/thisone"
|
16
|
+
@config.set :foreman_cmd, "bin/foreman"
|
17
|
+
@config.set :shared_path, "/srv/fooapp/shared"
|
18
|
+
@config.set :runit_sv_path, "/srv/fooapp/shared/sv"
|
19
|
+
@config.set :runit_app_name, "fooapp_production"
|
20
|
+
@config.set :user, "deploy"
|
21
|
+
strategy.export
|
22
|
+
|
23
|
+
@config.must_have_run [
|
24
|
+
"cd /srv/fooapp/releases/thisone &&",
|
25
|
+
"if [ -f Procfile ] ; then",
|
26
|
+
"mkdir -p /srv/fooapp/shared/sv &&",
|
27
|
+
"bin/foreman export runit /srv/fooapp/shared/sv",
|
28
|
+
"--app=fooapp_production --log=/srv/fooapp/shared/log",
|
29
|
+
"--user=deploy &&",
|
30
|
+
"find /srv/fooapp/shared/sv -type f -name run",
|
31
|
+
"-exec chmod 755 {} \\; ; else",
|
32
|
+
"echo '>>>> A Procfile must exist in this project.' && exit 10 ; fi"
|
33
|
+
].join(' ')
|
34
|
+
end
|
35
|
+
|
36
|
+
it "#register symlinks services in :runit_sv_path to :runit_service_path" do
|
37
|
+
@config.set :runit_sv_path, "/apps/foo/shared/sv"
|
38
|
+
@config.set :runit_service_path, "/home/foouser/service"
|
39
|
+
strategy.register
|
40
|
+
|
41
|
+
@config.must_have_run "ln -snf /apps/foo/shared/sv/* /home/foouser/service/"
|
42
|
+
end
|
43
|
+
|
44
|
+
describe "#start" do
|
45
|
+
it "starts all services without arguments" do
|
46
|
+
@config.set :runit_service_path, "/home/foouser/service"
|
47
|
+
@config.set :runit_app_name, "wuzzle_production"
|
48
|
+
strategy.start
|
49
|
+
|
50
|
+
@config.must_have_run "sv start /home/foouser/service/wuzzle_production-*"
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
describe "#stop" do
|
55
|
+
it "stops all services without arguments" do
|
56
|
+
@config.set :runit_service_path, "/home/foouser/service"
|
57
|
+
@config.set :runit_app_name, "wuzzle_production"
|
58
|
+
strategy.stop
|
59
|
+
|
60
|
+
@config.must_have_run "sv stop /home/foouser/service/wuzzle_production-*"
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
describe "#restart" do
|
65
|
+
it "restarts all services without arguments" do
|
66
|
+
@config.set :runit_service_path, "/home/foouser/service"
|
67
|
+
@config.set :runit_app_name, "wuzzle_production"
|
68
|
+
strategy.restart
|
69
|
+
|
70
|
+
@config.must_have_run "sv restart /home/foouser/service/wuzzle_production-*"
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
describe "#ps" do
|
75
|
+
it "returns all service process statuses" do
|
76
|
+
@config.set :runit_service_path, "/home/foouser/service"
|
77
|
+
@config.set :runit_app_name, "wuzzle_production"
|
78
|
+
strategy.ps
|
79
|
+
|
80
|
+
@config.must_have_run "sv status /home/foouser/service/wuzzle_production-*"
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
@@ -0,0 +1,234 @@
|
|
1
|
+
require 'minitest/autorun'
|
2
|
+
require 'minitest/capistrano'
|
3
|
+
require 'capistrano/fanfare'
|
4
|
+
require 'capistrano/fanfare/foreman'
|
5
|
+
|
6
|
+
describe Capistrano::Fanfare::Foreman do
|
7
|
+
before do
|
8
|
+
@config = Capistrano::Configuration.new
|
9
|
+
@config.load "deploy"
|
10
|
+
Capistrano::Fanfare::Foreman.load_into(@config)
|
11
|
+
@config.extend(MiniTest::Capistrano::ConfigurationExtension)
|
12
|
+
end
|
13
|
+
|
14
|
+
describe "for variables" do
|
15
|
+
it "sets :local_procfile to 'Procfile'" do
|
16
|
+
@config.fetch(:local_procfile).must_equal "Procfile"
|
17
|
+
end
|
18
|
+
|
19
|
+
it "sets :user_home to the capistrano user's home directory" do
|
20
|
+
@config.captures_responses["echo $HOME"] = "/u/home/fooguy\n"
|
21
|
+
|
22
|
+
@config.fetch(:user_home).must_equal "/u/home/fooguy"
|
23
|
+
end
|
24
|
+
|
25
|
+
it "sets :foreman_cmd to 'foreman'" do
|
26
|
+
@config.fetch(:foreman_cmd).must_equal "foreman"
|
27
|
+
end
|
28
|
+
|
29
|
+
it "sets :foreman_export_via to :runit" do
|
30
|
+
@config.fetch(:foreman_export_via).must_equal :runit
|
31
|
+
end
|
32
|
+
|
33
|
+
it "sets :foreman_strategy to an Runit strategy" do
|
34
|
+
@config.fetch(:foreman_strategy).class.
|
35
|
+
must_equal Capistrano::Fanfare::Foreman::Strategy::Runit
|
36
|
+
end
|
37
|
+
|
38
|
+
it "sets :runit_service_path to :user_home/service" do
|
39
|
+
@config.set :user_home, "/home/app"
|
40
|
+
|
41
|
+
@config.fetch(:runit_service_path).must_equal "/home/app/service"
|
42
|
+
end
|
43
|
+
|
44
|
+
it "sets :runit_app_name to a combination of :application and :deploy_env" do
|
45
|
+
@config.set :application, "barness"
|
46
|
+
@config.set :deploy_env, "production"
|
47
|
+
|
48
|
+
@config.fetch(:runit_app_name).must_equal "barness_production"
|
49
|
+
end
|
50
|
+
|
51
|
+
it "sets :runit_sv_path to shared_path/sv" do
|
52
|
+
@config.set :shared_path, "/srv/wakka/shared"
|
53
|
+
|
54
|
+
@config.fetch(:runit_sv_path).must_equal "/srv/wakka/shared/sv"
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
describe "for namespace :foreman" do
|
59
|
+
let(:strategy) { MiniTest::Mock.new }
|
60
|
+
|
61
|
+
before do
|
62
|
+
@config.set :foreman_strategy, strategy
|
63
|
+
end
|
64
|
+
|
65
|
+
describe "task :cp_env" do
|
66
|
+
it "copies env file from shared_path into current_release as .env" do
|
67
|
+
@config.set :shared_path, "/tmp/app/shared"
|
68
|
+
@config.set :current_release, "/tmp/app/releases/blah"
|
69
|
+
@config.find_and_execute_task("foreman:cp_env")
|
70
|
+
|
71
|
+
@config.must_have_run "cp /tmp/app/shared/env /tmp/app/releases/blah/.env"
|
72
|
+
end
|
73
|
+
|
74
|
+
it "gets called after deploy:updated_code task" do
|
75
|
+
@config.must_have_callback_after "deploy:update_code", "foreman:cp_env"
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
describe "task :run_cmd" do
|
80
|
+
before do
|
81
|
+
ENV['_FOREMAN_COMMAND'] = ENV['COMMAND']
|
82
|
+
ENV['COMMAND'] = "rake db:migrate"
|
83
|
+
end
|
84
|
+
|
85
|
+
after do
|
86
|
+
ENV['COMMAND'] = ENV.delete('_FOREMAN_COMMAND')
|
87
|
+
end
|
88
|
+
|
89
|
+
it "runs a command in a foreman environment context" do
|
90
|
+
@config.set :current_path, "/apps/fuyou/current"
|
91
|
+
@config.set :foreman_cmd, "bin/foreman"
|
92
|
+
@config.find_and_execute_task("foreman:run_cmd")
|
93
|
+
|
94
|
+
@config.must_have_run [
|
95
|
+
"cd /apps/fuyou/current &&",
|
96
|
+
"bin/foreman run 'rake db:migrate'"
|
97
|
+
].join(' ')
|
98
|
+
end
|
99
|
+
|
100
|
+
it "raises an exception when ENV['COMMAND'] is not found" do
|
101
|
+
ENV.delete('COMMAND')
|
102
|
+
proc { @config.find_and_execute_task("foreman:run_cmd") }.
|
103
|
+
must_raise RuntimeError
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
describe "task :export" do
|
108
|
+
it "delegates to forman_strategy.export" do
|
109
|
+
strategy.expect :export, true
|
110
|
+
@config.find_and_execute_task("foreman:export")
|
111
|
+
|
112
|
+
strategy.verify
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
describe "task :register" do
|
117
|
+
it "delegates to forman_strategy.register" do
|
118
|
+
strategy.expect :register, true
|
119
|
+
@config.find_and_execute_task("foreman:register")
|
120
|
+
|
121
|
+
strategy.verify
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
describe "task :start" do
|
126
|
+
it "delegates to forman_strategy.start" do
|
127
|
+
strategy.expect :start, true
|
128
|
+
@config.find_and_execute_task("foreman:start")
|
129
|
+
|
130
|
+
strategy.verify
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
describe "task :stop" do
|
135
|
+
it "delegates to forman_strategy.stop" do
|
136
|
+
strategy.expect :stop, true
|
137
|
+
@config.find_and_execute_task("foreman:stop")
|
138
|
+
|
139
|
+
strategy.verify
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
describe "task :restart" do
|
144
|
+
it "delegates to forman_strategy.restart" do
|
145
|
+
strategy.expect :restart, true
|
146
|
+
@config.find_and_execute_task("foreman:restart")
|
147
|
+
|
148
|
+
strategy.verify
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
describe "task :ps" do
|
153
|
+
it "delegates to forman_strategy.ps" do
|
154
|
+
strategy.expect :ps, true
|
155
|
+
@config.find_and_execute_task("foreman:ps")
|
156
|
+
|
157
|
+
strategy.verify
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
161
|
+
describe "dynamic tasks" do
|
162
|
+
before do
|
163
|
+
ENV['PROCFILE'] =
|
164
|
+
File.expand_path(File.join(File.dirname(__FILE__), %w{fixtures Procfile}))
|
165
|
+
@config = Capistrano::Configuration.new
|
166
|
+
@config.load "deploy"
|
167
|
+
Capistrano::Fanfare::Foreman.load_into(@config)
|
168
|
+
@config.extend(MiniTest::Capistrano::ConfigurationExtension)
|
169
|
+
@config.set :foreman_strategy, strategy
|
170
|
+
end
|
171
|
+
|
172
|
+
after do
|
173
|
+
ENV.delete('PROCFILE')
|
174
|
+
end
|
175
|
+
|
176
|
+
describe "for namespace :start" do
|
177
|
+
it "creates a task for each Procfile entry (on client side copy)" do
|
178
|
+
@config.must_have_task "foreman:start:web"
|
179
|
+
@config.must_have_task "foreman:start:job"
|
180
|
+
end
|
181
|
+
|
182
|
+
it "task :web delegates to foreman_strategy.start" do
|
183
|
+
strategy.expect :start, true, ["web"]
|
184
|
+
@config.find_and_execute_task("foreman:start:web")
|
185
|
+
|
186
|
+
strategy.verify
|
187
|
+
end
|
188
|
+
end
|
189
|
+
|
190
|
+
describe "for namespace :stop" do
|
191
|
+
it "creates a task for each Procfile entry (on client side copy)" do
|
192
|
+
@config.must_have_task "foreman:stop:web"
|
193
|
+
@config.must_have_task "foreman:stop:job"
|
194
|
+
end
|
195
|
+
|
196
|
+
it "task :web delegates to foreman_strategy.stop" do
|
197
|
+
strategy.expect :stop, true, ["web"]
|
198
|
+
@config.find_and_execute_task("foreman:stop:web")
|
199
|
+
|
200
|
+
strategy.verify
|
201
|
+
end
|
202
|
+
end
|
203
|
+
|
204
|
+
describe "for namespace :restart" do
|
205
|
+
it "creates a task for each Procfile entry (on client side copy)" do
|
206
|
+
@config.must_have_task "foreman:restart:web"
|
207
|
+
@config.must_have_task "foreman:restart:job"
|
208
|
+
end
|
209
|
+
|
210
|
+
it "task :web delegates to foreman_strategy.restart" do
|
211
|
+
strategy.expect :restart, true, ["web"]
|
212
|
+
@config.find_and_execute_task("foreman:restart:web")
|
213
|
+
|
214
|
+
strategy.verify
|
215
|
+
end
|
216
|
+
end
|
217
|
+
end
|
218
|
+
end
|
219
|
+
|
220
|
+
describe "task :frun" do
|
221
|
+
it "delegates to foreman:run_cmd task" do
|
222
|
+
@config.load do
|
223
|
+
def methods_called ; @methods_called ||= [] ; end
|
224
|
+
|
225
|
+
namespace :foreman do
|
226
|
+
task(:run_cmd) { methods_called << "foreman:run_cmd" }
|
227
|
+
end
|
228
|
+
end
|
229
|
+
@config.find_and_execute_task("frun")
|
230
|
+
|
231
|
+
@config.methods_called.must_equal ["foreman:run_cmd"]
|
232
|
+
end
|
233
|
+
end
|
234
|
+
end
|
@@ -0,0 +1,168 @@
|
|
1
|
+
require 'minitest/autorun'
|
2
|
+
require 'minitest/capistrano'
|
3
|
+
require 'capistrano/fanfare'
|
4
|
+
require 'capistrano/fanfare/git_style'
|
5
|
+
require 'timecop'
|
6
|
+
|
7
|
+
describe Capistrano::Fanfare::GitStyle do
|
8
|
+
before do
|
9
|
+
@config = Capistrano::Configuration.new
|
10
|
+
@config.load "deploy"
|
11
|
+
Capistrano::Fanfare::GitStyle.load_into(@config)
|
12
|
+
@config.extend(MiniTest::Capistrano::ConfigurationExtension)
|
13
|
+
|
14
|
+
@config.set :application, "fooapp"
|
15
|
+
@config.set :repository, "git@example.com:fooapp.git"
|
16
|
+
end
|
17
|
+
|
18
|
+
describe "for variables" do
|
19
|
+
it "sets :scm to :git" do
|
20
|
+
@config.fetch(:scm).must_equal :git
|
21
|
+
end
|
22
|
+
|
23
|
+
it "sets :deploy_via to :git_style" do
|
24
|
+
@config.fetch(:deploy_via).must_equal :git_style
|
25
|
+
end
|
26
|
+
|
27
|
+
it "sets :release_name to a timestamp and git commit id" do
|
28
|
+
@config.set :real_revision, "git123"
|
29
|
+
|
30
|
+
Timecop.freeze(Time.utc(2012, 1, 1, 2, 3, 4)) do
|
31
|
+
@config.fetch(:release_name).must_equal "20120101020304-git123"
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
it "sets :release_path to :current_path" do
|
36
|
+
@config.fetch(:release_path).must_equal @config.fetch(:current_path)
|
37
|
+
end
|
38
|
+
|
39
|
+
it "sets :current_release to :current_path" do
|
40
|
+
@config.fetch(:current_release).must_equal @config.fetch(:current_path)
|
41
|
+
end
|
42
|
+
|
43
|
+
it "sets :latest_release to :current_path" do
|
44
|
+
@config.fetch(:latest_release).must_equal @config.fetch(:current_path)
|
45
|
+
end
|
46
|
+
|
47
|
+
it "sets :current_revision to current git revision on server" do
|
48
|
+
@config.set :current_path, "/a/apps/barapp/current"
|
49
|
+
capture_cmd = "cd /a/apps/barapp/current && git rev-parse HEAD"
|
50
|
+
@config.captures_responses[capture_cmd] = "gitZZZ"
|
51
|
+
|
52
|
+
@config.fetch(:current_revision).must_equal "gitZZZ"
|
53
|
+
end
|
54
|
+
|
55
|
+
it "sets :latest_revision to current git revision on the server" do
|
56
|
+
@config.set :releases_path, "/a/apps/zurb/releases"
|
57
|
+
@config.set :releases, ["first-one", "20120101020304-gitFAB"]
|
58
|
+
capture_cmd = "basename /a/apps/zurb/releases/20120101020304-gitFAB | cut -d - -f 2"
|
59
|
+
@config.captures_responses[capture_cmd] = "gitFAB"
|
60
|
+
|
61
|
+
@config.fetch(:latest_revision).must_equal "gitFAB"
|
62
|
+
end
|
63
|
+
|
64
|
+
it "sets :previous_revision to git revision of last deployment" do
|
65
|
+
@config.set :previous_release, "/a/apps/zurb/releases/20060212125959-gitCC"
|
66
|
+
capture_cmd = "basename /a/apps/zurb/releases/20060212125959-gitCC | cut -d - -f 2"
|
67
|
+
@config.captures_responses[capture_cmd] = "gitCC"
|
68
|
+
|
69
|
+
@config.fetch(:previous_revision).must_equal "gitCC"
|
70
|
+
end
|
71
|
+
|
72
|
+
it "sets :previous_revision to nil if :previous_release is not set" do
|
73
|
+
@config.set :previous_release, nil
|
74
|
+
|
75
|
+
@config.captures.must_be_empty
|
76
|
+
@config.fetch(:previous_revision).must_be_nil
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
describe "for namespace :deploy" do
|
81
|
+
describe "task :update_code" do
|
82
|
+
before do
|
83
|
+
@config.load do
|
84
|
+
def methods_called ; @methods_called ||= [] ; end
|
85
|
+
|
86
|
+
namespace :deploy do
|
87
|
+
task(:finalize_update) { methods_called << "deploy:finalize_update" }
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
# stub out strategy.deploy!
|
92
|
+
strategy = @config.strategy
|
93
|
+
def strategy.deploy! ; methods_called << "strategy.deploy!" ; end
|
94
|
+
|
95
|
+
# stub out on_rollback
|
96
|
+
def @config.on_rollback ; methods_called << "on_rollback" ; end
|
97
|
+
end
|
98
|
+
|
99
|
+
it "calls same tasks as delivered gem code" do
|
100
|
+
@config.find_and_execute_task("deploy:update_code")
|
101
|
+
|
102
|
+
@config.methods_called.must_equal(["strategy.deploy!", "deploy:finalize_update"])
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
it "task :create_symlink must not run anything (no-op)" do
|
107
|
+
@config.find_and_execute_task("deploy:create_symlink")
|
108
|
+
|
109
|
+
@config.wont_have_run_anything
|
110
|
+
end
|
111
|
+
|
112
|
+
describe "in namespace :rollback" do
|
113
|
+
before do
|
114
|
+
@config.load do
|
115
|
+
def methods_called ; @methods_called ||= [] ; end
|
116
|
+
|
117
|
+
namespace :deploy do
|
118
|
+
task(:update_code) { methods_called << "deploy:update_code" }
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
def runs_msg(cmd)
|
124
|
+
runs_list = @config.runs.keys.sort.
|
125
|
+
map { |c|c.sub(/^/, '\'').sub(/$/, '\'')}.join(', ')
|
126
|
+
"Expected run call of '#{cmd}' in run list of: [#{runs_list}]"
|
127
|
+
end
|
128
|
+
|
129
|
+
it "task :revision sets :branch to :previous_release" do
|
130
|
+
@config.set :branch, "ding"
|
131
|
+
@config.set :previous_revision, "gitPREV"
|
132
|
+
@config.set :previous_release, "/u/apps/rofl/releases/20080808082800-gitPREV"
|
133
|
+
@config.find_and_execute_task("deploy:rollback:revision")
|
134
|
+
|
135
|
+
@config.fetch(:branch).must_equal "gitPREV"
|
136
|
+
end
|
137
|
+
|
138
|
+
it "task :revision runs deploy:update_code" do
|
139
|
+
@config.set :previous_revision, "gitPREV"
|
140
|
+
@config.set :previous_release, "/u/apps/rofl/releases/20080808082800-gitPREV"
|
141
|
+
@config.find_and_execute_task("deploy:rollback:revision")
|
142
|
+
|
143
|
+
@config.methods_called.must_include "deploy:update_code"
|
144
|
+
end
|
145
|
+
|
146
|
+
it "task :revision raises an exception if no previous release exists" do
|
147
|
+
@config.set :previous_release, nil
|
148
|
+
|
149
|
+
proc { @config.find_and_execute_task("deploy:rollback:revision") }.
|
150
|
+
must_raise RuntimeError
|
151
|
+
@config.methods_called.wont_include "deploy:update_code"
|
152
|
+
end
|
153
|
+
|
154
|
+
it "task :cleanup removes :current_release directory conditionally" do
|
155
|
+
@config.set :current_path, "/u/apps/rofl/current"
|
156
|
+
@config.set :latest_revision, "gitAAA"
|
157
|
+
@config.set :current_release, "/u/apps/rofl/releases/20120101020304-gitAAA"
|
158
|
+
@config.find_and_execute_task("deploy:rollback:cleanup")
|
159
|
+
|
160
|
+
cmd = [
|
161
|
+
"if [ `(cd /u/apps/rofl/current && git rev-parse HEAD)` != `gitAAA` ]; " +
|
162
|
+
"then rm -rf /u/apps/rofl/releases/20120101020304-gitAAA; fi"
|
163
|
+
]
|
164
|
+
@config.must_have_run cmd.join, runs_msg(cmd.join)
|
165
|
+
end
|
166
|
+
end
|
167
|
+
end
|
168
|
+
end
|