paratrooper 1.3.2 → 1.4.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.bundle/config +2 -0
- data/Gemfile.lock +4 -4
- data/lib/paratrooper/deploy.rb +16 -2
- data/lib/paratrooper/heroku_wrapper.rb +6 -0
- data/lib/paratrooper/pending_migration_check.rb +23 -0
- data/lib/paratrooper/system_caller.rb +13 -1
- data/lib/paratrooper/version.rb +1 -1
- data/spec/paratrooper/deploy_spec.rb +26 -7
- data/spec/paratrooper/heroku_wrapper_spec.rb +25 -0
- data/spec/paratrooper/pending_migration_check_spec.rb +45 -0
- metadata +6 -2
data/.bundle/config
ADDED
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
paratrooper (1.
|
4
|
+
paratrooper (1.4.0)
|
5
5
|
heroku-api (~> 0.3)
|
6
6
|
netrc (~> 0.7)
|
7
7
|
rendezvous (~> 0.0.1)
|
@@ -11,9 +11,9 @@ GEM
|
|
11
11
|
specs:
|
12
12
|
coderay (1.0.8)
|
13
13
|
diff-lcs (1.1.3)
|
14
|
-
excon (0.
|
15
|
-
heroku-api (0.3.
|
16
|
-
excon (~> 0.
|
14
|
+
excon (0.21.0)
|
15
|
+
heroku-api (0.3.10)
|
16
|
+
excon (~> 0.21.0)
|
17
17
|
method_source (0.8.1)
|
18
18
|
netrc (0.7.7)
|
19
19
|
pry (0.9.10)
|
data/lib/paratrooper/deploy.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'paratrooper/heroku_wrapper'
|
2
2
|
require 'paratrooper/system_caller'
|
3
3
|
require 'paratrooper/notifiers/screen_notifier'
|
4
|
+
require 'paratrooper/pending_migration_check'
|
4
5
|
|
5
6
|
module Paratrooper
|
6
7
|
|
@@ -8,7 +9,7 @@ module Paratrooper
|
|
8
9
|
#
|
9
10
|
class Deploy
|
10
11
|
attr_reader :app_name, :notifiers, :system_caller, :heroku, :tag_name,
|
11
|
-
:match_tag, :protocol, :deployment_host
|
12
|
+
:match_tag, :protocol, :deployment_host, :migration_check, :debug
|
12
13
|
|
13
14
|
# Public: Initializes a Deploy
|
14
15
|
#
|
@@ -28,15 +29,19 @@ module Paratrooper
|
|
28
29
|
# application (optional, default: 'http').
|
29
30
|
# :deployment_host - String host name to be used in git URL
|
30
31
|
# (optional, default: 'heroku.com').
|
32
|
+
# :migration_check - Object responsible for checking pending
|
33
|
+
# migrations (optional).
|
31
34
|
def initialize(app_name, options = {})
|
32
35
|
@app_name = app_name
|
33
36
|
@notifiers = options[:notifiers] || [Notifiers::ScreenNotifier.new]
|
34
37
|
@heroku = options[:heroku] || HerokuWrapper.new(app_name, options)
|
35
38
|
@tag_name = options[:tag]
|
36
39
|
@match_tag = options[:match_tag_to] || 'master'
|
37
|
-
@system_caller = options[:system_caller] || SystemCaller.new
|
40
|
+
@system_caller = options[:system_caller] || SystemCaller.new(debug)
|
38
41
|
@protocol = options[:protocol] || 'http'
|
39
42
|
@deployment_host = options[:deployment_host] || 'heroku.com'
|
43
|
+
@debug = options[:debug] || false
|
44
|
+
self.migration_check = options[:migration_check]
|
40
45
|
end
|
41
46
|
|
42
47
|
def setup
|
@@ -88,6 +93,7 @@ module Paratrooper
|
|
88
93
|
# Public: Runs rails database migrations on your application.
|
89
94
|
#
|
90
95
|
def run_migrations
|
96
|
+
return unless pending_migrations?
|
91
97
|
notify(:run_migrations)
|
92
98
|
heroku.run_migrations
|
93
99
|
end
|
@@ -155,6 +161,14 @@ module Paratrooper
|
|
155
161
|
git_remote(deployment_host, app_name)
|
156
162
|
end
|
157
163
|
|
164
|
+
def pending_migrations?
|
165
|
+
migration_check.migrations_waiting?
|
166
|
+
end
|
167
|
+
|
168
|
+
def migration_check=(obj)
|
169
|
+
@migration_check = obj || PendingMigrationCheck.new(match_tag, heroku, system_caller)
|
170
|
+
end
|
171
|
+
|
158
172
|
# Internal: Calls commands meant to go to system
|
159
173
|
#
|
160
174
|
# call - String version of system command
|
@@ -35,6 +35,12 @@ module Paratrooper
|
|
35
35
|
rendezvous.start(:url => data['rendezvous_url'])
|
36
36
|
end
|
37
37
|
|
38
|
+
def last_deploy_commit
|
39
|
+
data = heroku_api.get_releases(app_name).body
|
40
|
+
return nil if data.empty?
|
41
|
+
data.last['commit']
|
42
|
+
end
|
43
|
+
|
38
44
|
private
|
39
45
|
def app_domain_name
|
40
46
|
if custom_domain_response
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'paratrooper/system_caller'
|
2
|
+
|
3
|
+
module Paratrooper
|
4
|
+
class PendingMigrationCheck
|
5
|
+
attr_accessor :diff, :heroku, :match_tag_name, :system_caller
|
6
|
+
|
7
|
+
def initialize(match_tag_name, heroku_wrapper, system_caller)
|
8
|
+
self.heroku = heroku_wrapper
|
9
|
+
self.match_tag_name = match_tag_name
|
10
|
+
self.system_caller = system_caller
|
11
|
+
end
|
12
|
+
|
13
|
+
def migrations_waiting?
|
14
|
+
call = %Q[git diff --shortstat #{last_deployed_commit} #{match_tag_name} -- db/migrate]
|
15
|
+
self.diff = system_caller.execute(call)
|
16
|
+
!diff.strip.empty?
|
17
|
+
end
|
18
|
+
|
19
|
+
def last_deployed_commit
|
20
|
+
heroku.last_deploy_commit
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -1,7 +1,19 @@
|
|
1
1
|
module Paratrooper
|
2
2
|
class SystemCaller
|
3
|
+
attr_accessor :debug
|
4
|
+
|
5
|
+
def initialize(debug = false)
|
6
|
+
self.debug = debug
|
7
|
+
end
|
8
|
+
|
3
9
|
def execute(call)
|
4
|
-
|
10
|
+
debug_message_for(call)
|
11
|
+
`#{call}`
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
def debug_message_for(call)
|
16
|
+
p "DEBUG: #{call}" if debug
|
5
17
|
end
|
6
18
|
end
|
7
19
|
end
|
data/lib/paratrooper/version.rb
CHANGED
@@ -10,7 +10,8 @@ describe Paratrooper::Deploy do
|
|
10
10
|
{
|
11
11
|
heroku: heroku,
|
12
12
|
notifiers: [],
|
13
|
-
system_caller: system_caller
|
13
|
+
system_caller: system_caller,
|
14
|
+
migration_check: migration_check
|
14
15
|
}
|
15
16
|
end
|
16
17
|
let(:options) { Hash.new }
|
@@ -24,6 +25,7 @@ describe Paratrooper::Deploy do
|
|
24
25
|
)
|
25
26
|
end
|
26
27
|
let(:system_caller) { double(:system_caller) }
|
28
|
+
let(:migration_check) { double(:migration_check) }
|
27
29
|
let(:domain_response) do
|
28
30
|
double(:domain_response, body: [{'domain' => 'application_url'}])
|
29
31
|
end
|
@@ -175,14 +177,31 @@ describe Paratrooper::Deploy do
|
|
175
177
|
system_caller.stub(:execute)
|
176
178
|
end
|
177
179
|
|
178
|
-
|
179
|
-
|
180
|
-
|
180
|
+
context "when new migrations are waiting to be run" do
|
181
|
+
before do
|
182
|
+
migration_check.stub(:migrations_waiting?).and_return(true)
|
183
|
+
end
|
184
|
+
|
185
|
+
it 'sends notification' do
|
186
|
+
deployer.should_receive(:notify).with(:run_migrations).once
|
187
|
+
deployer.run_migrations
|
188
|
+
end
|
189
|
+
|
190
|
+
it 'pushes repo to heroku' do
|
191
|
+
heroku.should_receive(:run_migrations)
|
192
|
+
deployer.run_migrations
|
193
|
+
end
|
181
194
|
end
|
182
195
|
|
183
|
-
|
184
|
-
|
185
|
-
|
196
|
+
context "when no migrations are available to be run" do
|
197
|
+
before do
|
198
|
+
migration_check.stub(:migrations_waiting?).and_return(false)
|
199
|
+
end
|
200
|
+
|
201
|
+
specify "heroku is not notified to run migrations" do
|
202
|
+
heroku.should_not_receive(:run_migrations)
|
203
|
+
deployer.run_migrations
|
204
|
+
end
|
186
205
|
end
|
187
206
|
end
|
188
207
|
|
@@ -107,4 +107,29 @@ describe Paratrooper::HerokuWrapper do
|
|
107
107
|
end
|
108
108
|
end
|
109
109
|
end
|
110
|
+
|
111
|
+
describe "#last_deploy_commit" do
|
112
|
+
context "when deploy data is returned" do
|
113
|
+
let(:response) do
|
114
|
+
double(:response, body: [{ 'commit' => 'SHA' }])
|
115
|
+
end
|
116
|
+
it "returns string of last deployed commit" do
|
117
|
+
heroku_api.should_receive(:get_releases).with(app_name)
|
118
|
+
.and_return(response)
|
119
|
+
expect(wrapper.last_deploy_commit).to eq('SHA')
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
context "when no deploys have happened yet" do
|
124
|
+
let(:response) do
|
125
|
+
double(:response, body: [])
|
126
|
+
end
|
127
|
+
|
128
|
+
it "returns nil" do
|
129
|
+
heroku_api.should_receive(:get_releases).with(app_name)
|
130
|
+
.and_return(response)
|
131
|
+
expect(wrapper.last_deploy_commit).to eq(nil)
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
110
135
|
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'paratrooper/pending_migration_check'
|
3
|
+
|
4
|
+
describe Paratrooper::PendingMigrationCheck do
|
5
|
+
let(:migration_check) do
|
6
|
+
described_class.new(match_tag_name, heroku_wrapper, system_caller)
|
7
|
+
end
|
8
|
+
let(:system_caller) { double(:system_caller) }
|
9
|
+
let(:heroku_wrapper) do
|
10
|
+
double(:heroku_wrapper, last_deploy_commit: last_deployed_commit)
|
11
|
+
end
|
12
|
+
let(:last_deployed_commit) { nil }
|
13
|
+
|
14
|
+
describe "#migrations_waiting?" do
|
15
|
+
let(:match_tag_name) { "MATCH" }
|
16
|
+
let(:last_deployed_commit) { "LAST_DEPLOYED_COMMIT" }
|
17
|
+
|
18
|
+
it "calls out to heroku for latest deploy's commit" do
|
19
|
+
system_caller.stub(:execute).and_return("")
|
20
|
+
heroku_wrapper.should_receive(:last_deploy_commit)
|
21
|
+
migration_check.migrations_waiting?
|
22
|
+
end
|
23
|
+
|
24
|
+
context "and migrations are in diff" do
|
25
|
+
it "returns true" do
|
26
|
+
expected_call = %Q[git diff --shortstat LAST_DEPLOYED_COMMIT MATCH -- db/migrate]
|
27
|
+
system_caller.should_receive(:execute).with(expected_call)
|
28
|
+
.and_return("DIFF")
|
29
|
+
expect(migration_check.migrations_waiting?).to be_true
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
context "and migrations are not in diff" do
|
34
|
+
let(:match_tag_name) { 'master' }
|
35
|
+
let(:last_deployed_commit) { "LAST_DEPLOYED_COMMIT" }
|
36
|
+
|
37
|
+
it "returns false" do
|
38
|
+
expected_call = %Q[git diff --shortstat LAST_DEPLOYED_COMMIT master -- db/migrate]
|
39
|
+
system_caller.should_receive(:execute).with(expected_call)
|
40
|
+
.and_return("")
|
41
|
+
expect(migration_check.migrations_waiting?).to be_false
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: paratrooper
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.4.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2013-
|
13
|
+
date: 2013-05-21 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: rake
|
@@ -116,6 +116,7 @@ executables: []
|
|
116
116
|
extensions: []
|
117
117
|
extra_rdoc_files: []
|
118
118
|
files:
|
119
|
+
- .bundle/config
|
119
120
|
- .gitignore
|
120
121
|
- .ruby-version
|
121
122
|
- Gemfile
|
@@ -129,6 +130,7 @@ files:
|
|
129
130
|
- lib/paratrooper/local_api_key_extractor.rb
|
130
131
|
- lib/paratrooper/notifier.rb
|
131
132
|
- lib/paratrooper/notifiers/screen_notifier.rb
|
133
|
+
- lib/paratrooper/pending_migration_check.rb
|
132
134
|
- lib/paratrooper/system_caller.rb
|
133
135
|
- lib/paratrooper/version.rb
|
134
136
|
- paratrooper.gemspec
|
@@ -138,6 +140,7 @@ files:
|
|
138
140
|
- spec/paratrooper/local_api_key_extractor_spec.rb
|
139
141
|
- spec/paratrooper/notifier_spec.rb
|
140
142
|
- spec/paratrooper/notifiers/screen_notifier_spec.rb
|
143
|
+
- spec/paratrooper/pending_migration_check_spec.rb
|
141
144
|
- spec/spec_helper.rb
|
142
145
|
homepage: http://github.com/mattpolito/paratrooper
|
143
146
|
licenses: []
|
@@ -170,4 +173,5 @@ test_files:
|
|
170
173
|
- spec/paratrooper/local_api_key_extractor_spec.rb
|
171
174
|
- spec/paratrooper/notifier_spec.rb
|
172
175
|
- spec/paratrooper/notifiers/screen_notifier_spec.rb
|
176
|
+
- spec/paratrooper/pending_migration_check_spec.rb
|
173
177
|
- spec/spec_helper.rb
|