paratrooper 3.0.0.beta1 → 3.0.0.beta2

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 84bd6c187cb422b1e72b4dc30aa60012f46600b3
4
- data.tar.gz: 3d14dd42f2b029cf97418d1508a84b250e6750c4
3
+ metadata.gz: a1fb94737f8ced52c1df089c4c9cb3c835c13955
4
+ data.tar.gz: b5e02afaefe802bbf6b55a4142f6bd4f6a5bbcf7
5
5
  SHA512:
6
- metadata.gz: c29d2b06b09efe69089e18e791509d30affa865e0bc9a22dc1a8ed7db3fba3bd30142c54238fa31761f433b8039e793e99d0a1bed8566e65c8ff800e590250d5
7
- data.tar.gz: e05a117d41e9811b65621b54ca91501573b7a4503a645ec7fa618bfdeb2c37798c353ca4245b47fab73c1c2737a66bf5d3ada33238c3277d55f760bdc480bcac
6
+ metadata.gz: 9123dc496f3675b12eaa400be60bbfe9ada36bc591a842055e904fd2f84119a0296125e6e582e7e5a59e15b85c6e8218dba9d0cddeec5736231b2e9e8de02ca6
7
+ data.tar.gz: 7c68f45526ab6002f81a5a2378ba47a6fb5a80105e408b4215f97d316b2fdd80570f781d9fc6e68e85bcef2e213f00a69390fd8911d1ac073df737bcdbee924b
data/README.md CHANGED
@@ -11,13 +11,13 @@ Simplify your [Heroku][] deploy with quick and concise deployment rake tasks.
11
11
  Add this line to your application's Gemfile:
12
12
 
13
13
  ```shell
14
- gem 'paratrooper'
14
+ gem 'paratrooper'
15
15
  ```
16
16
 
17
17
  and then execute
18
18
 
19
19
  ```shell
20
- bundle
20
+ bundle
21
21
  ```
22
22
 
23
23
  or
@@ -25,7 +25,7 @@ or
25
25
  install it yourself with
26
26
 
27
27
  ```shell
28
- gem install paratrooper
28
+ gem install paratrooper
29
29
  ```
30
30
 
31
31
  ## Usage
@@ -33,19 +33,13 @@ install it yourself with
33
33
  Instantiate Paratrooper with the name of your heroku application.
34
34
 
35
35
  ```ruby
36
- Paratrooper::Deploy.new('amazing-app')
36
+ Paratrooper.deploy('amazing-app')
37
37
  ```
38
38
 
39
39
  You can also provide a tag:
40
40
 
41
41
  ```ruby
42
- Paratrooper::Deploy.new('amazing-app', tag: 'staging')
43
- ```
44
-
45
- or alternatively:
46
-
47
- ```ruby
48
- Paratrooper::Deploy.new('amazing-app') do |deploy|
42
+ Paratrooper.deploy('amazing-app') do |deploy|
49
43
  deploy.tag = 'staging'
50
44
  end
51
45
  ```
@@ -57,20 +51,22 @@ You can authenticate your Heroku account in a few ways:
57
51
  * Provide an API Key
58
52
 
59
53
  ```ruby
60
- Paratrooper::Deploy.new('app', api_key: 'API_KEY')
54
+ Paratrooper.deploy('app') do |deploy|
55
+ deploy.api_key = 'API_KEY'
56
+ end
61
57
  ```
62
58
 
63
59
  * Set an environment variable
64
60
 
65
61
  ```ruby
66
62
  ENV['HEROKU_API_KEY'] = 'API_KEY'
67
- Paratrooper::Deploy.new('app')
63
+ Paratrooper.deploy('app')
68
64
  ```
69
65
 
70
66
  * Local Netrc file
71
67
 
72
68
  ```ruby
73
- Paratrooper::Deploy.new('app')
69
+ Paratrooper.deploy('app')
74
70
  ```
75
71
 
76
72
  This method works via a local Netrc file handled via the [Heroku Toolbelt][] and is the default and preferred method for providing authentication keys.
@@ -80,13 +76,7 @@ This method works via a local Netrc file handled via the [Heroku Toolbelt][] and
80
76
  If you use multiple SSH keys for managing multiple accounts, for example in your `.ssh/config`, you can set the `deployment_host` option:
81
77
 
82
78
  ```ruby
83
- Paratrooper::Deploy.new('app', deployment_host: 'HOST')
84
- ```
85
-
86
- or alternatively:
87
-
88
- ```ruby
89
- Paratrooper::Deploy.new('amazing-app') do |deploy|
79
+ Paratrooper.deploy('amazing-app') do |deploy|
90
80
  deploy.deployment_host = 'HOST'
91
81
  end
92
82
  ```
@@ -94,70 +84,37 @@ end
94
84
  This also works if you're using the [heroku-accounts](https://github.com/ddollar/heroku-accounts) plugin:
95
85
 
96
86
  ```ruby
97
- Paratrooper::Deploy.new('app', deployment_host: 'heroku.ACCOUNT_NAME')
87
+ Paratrooper.deploy('app') do |deploy|
88
+ deploy.deployment_host: 'heroku.ACCOUNT_NAME'
89
+ end
98
90
  ```
99
91
 
100
92
  ## Tag Management
101
93
 
102
- By providing tag options for Paratrooper, your code can be tagged and deployed from various reference points.
103
-
104
- ### Staging example
105
- ```ruby
106
- Paratrooper::Deploy.new("staging-app", tag: 'staging')
107
- ```
108
- This will create/update a `staging` git tag at `HEAD`.
109
-
110
- ### Production example
111
- ```ruby
112
- Paratrooper::Deploy.new("amazing-production-app",
113
- tag: 'production',
114
- match_tag: 'staging'
115
- )
116
- ```
117
-
118
- or alternatively:
119
-
120
- ```ruby
121
- Paratrooper::Deploy.new('amazing-production-app') do |deploy|
122
- deploy.tag = 'production'
123
- deploy.match_tag = 'staging'
124
- end
125
- ```
126
- This will create/update a `production` git tag at `staging` and deploy the `production` tag.
94
+ Please note: Tag management has been removed from Paratrooper 3. It added unneccesary complexity around an individual's deployment process.
127
95
 
128
96
  ## Sensible Default Deployment
129
97
 
130
- You can use the object's methods any way you'd like, but we've provided a sensible default at `Paratrooper#deploy`.
98
+ You can use the object's methods any way you'd like, but we've provided a sensible default at `Paratrooper.deploy`.
131
99
 
132
100
  This will perform the following tasks:
133
101
 
134
- * Create or update a git tag (if provided)
135
102
  * Push changes to Heroku
136
103
  * Run database migrations if any have been added to db/migrate
137
- * Restart the application
138
- * Warm application instance
104
+ * Restart the application if migrations needed to be run
139
105
 
140
106
  ### Example Usage
141
107
 
142
108
  ```ruby
143
- require 'paratrooper'
144
-
145
109
  namespace :deploy do
146
110
  desc 'Deploy app in staging environment'
147
111
  task :staging do
148
- deployment = Paratrooper::Deploy.new("amazing-staging-app", tag: 'staging')
149
-
150
- deployment.deploy
112
+ Paratrooper.deploy("amazing-staging-app")
151
113
  end
152
114
 
153
115
  desc 'Deploy app in production environment'
154
116
  task :production do
155
- deployment = Paratrooper::Deploy.new("amazing-production-app") do |deploy|
156
- deploy.tag = 'production'
157
- deploy.match_tag = 'staging'
158
- end
159
-
160
- deployment.deploy
117
+ Paratrooper.deploy("amazing-production-app")
161
118
  end
162
119
  end
163
120
  ```
@@ -174,7 +131,6 @@ There are 'before' and 'after' hooks for each of the following:
174
131
 
175
132
  * setup
176
133
  * activate_maintenance_mode
177
- * update_repo_tag
178
134
  * push_repo
179
135
  * run_migrations
180
136
  * app_restart
@@ -193,20 +149,17 @@ to disable your application monitoring.
193
149
  namespace :deploy do
194
150
  desc 'Deploy app in production environment'
195
151
  task :production do
196
- deployment = Paratrooper::Deploy.new("amazing-production-app") do |deploy|
197
- deploy.tag = 'production'
198
- deploy.match_tag = 'staging'
152
+ Paratrooper.deploy("amazing-production-app") do |deploy|
199
153
  deploy.add_callback(:before_setup) do |output|
200
154
  output.display("Totally going to turn off newrelic")
201
155
  system %Q[curl https://rpm.newrelic.com/accounts/ACCOUNT_ID/applications/APPLICATION_ID/ping_targets/disable -X POST -H "X-Api-Key: API_KEY"]
202
156
  end
157
+
203
158
  deploy.add_callback(:after_teardown) do |output|
204
159
  system %Q[curl https://rpm.newrelic.com/accounts/ACCOUNT_ID/applications/APPLICATION_ID/ping_targets/enable -X POST -H "X-Api-Key: API_KEY"]
205
160
  output.display("Aaaannnd we're back")
206
161
  end
207
162
  end
208
-
209
- deployment.deploy
210
163
  end
211
164
  end
212
165
  ```
@@ -219,15 +172,13 @@ Or maybe you just want to run a rake task on your application. Since this task m
219
172
  namespace :deploy do
220
173
  desc 'Deploy app in production environment'
221
174
  task :production do
222
- deployment = Paratrooper::Deploy.new("amazing-production-app") do |deploy|
175
+ Paratrooper.deploy("amazing-production-app") do |deploy|
223
176
  deploy.maintenance = true
224
177
  deploy.add_callback(:after_teardown) do |output|
225
178
  output.display("Running some task that needs to run")
226
179
  deploy.add_remote_task("rake some:task:to:run")
227
180
  end
228
181
  end
229
-
230
- deployment.deploy
231
182
  end
232
183
  end
233
184
  ```
@@ -10,12 +10,13 @@ module Paratrooper
10
10
  class Configuration
11
11
  include Callbacks
12
12
 
13
- attr_accessor :branch_name, :app_name, :api_key
13
+ attr_accessor :branch_name, :tag_name, :match_tag_name, :app_name, :api_key
14
14
  attr_writer :protocol, :heroku, :migration_check,
15
15
  :system_caller, :deployment_host, :http_client, :screen_notifier,
16
16
  :source_control
17
17
 
18
18
  alias :branch= :branch_name=
19
+ alias :tag= :tag_name=
19
20
 
20
21
  def attributes=(attrs)
21
22
  attrs.each do |method, value|
@@ -3,11 +3,9 @@ require 'paratrooper/configuration'
3
3
  require 'paratrooper/error'
4
4
 
5
5
  module Paratrooper
6
-
7
- # Public: Entry point into the library.
8
- #
9
6
  class Deploy
10
7
  extend Forwardable
8
+
11
9
  delegate [:system_caller, :migration_check, :notifiers,
12
10
  :deloyment_host, :heroku, :source_control, :screen_notifier
13
11
  ] => :config
@@ -76,6 +74,15 @@ module Paratrooper
76
74
  end
77
75
  end
78
76
 
77
+ def update_repo_tag
78
+ if source_control.taggable?
79
+ callback(:update_repo_tag) do
80
+ notify(:update_repo_tag)
81
+ source_control.update_repo_tag
82
+ end
83
+ end
84
+ end
85
+
79
86
  # Public: Activates Heroku maintenance mode.
80
87
  #
81
88
  def activate_maintenance_mode
@@ -140,6 +147,7 @@ module Paratrooper
140
147
  # Alias: #deploy
141
148
  def default_deploy
142
149
  setup
150
+ update_repo_tag
143
151
  push_repo
144
152
  maintenance_mode do
145
153
  run_migrations
@@ -179,7 +187,7 @@ module Paratrooper
179
187
  def default_payload
180
188
  {
181
189
  app_name: config.app_name,
182
- deployment_remote: source_control.remote,
190
+ deployment_remote: deployment_remote,
183
191
  force_push: config.force_push,
184
192
  reference_point: source_control.reference_point,
185
193
  }
@@ -38,9 +38,42 @@ module Paratrooper
38
38
  "-f " if config.force_push
39
39
  end
40
40
 
41
- # Internal: Calls commands meant to go to system
41
+ def tag_name
42
+ config.tag_name
43
+ end
44
+
45
+ def taggable?
46
+ !untaggable?
47
+ end
48
+
49
+ def untaggable?
50
+ tag_name.nil? || tag_name.empty?
51
+ end
52
+
53
+ def match_tag_name
54
+ config.match_tag_name
55
+ end
56
+
57
+ def scm_tag_reference
58
+ "refs/tags/#{tag_name}" if tag_name
59
+ end
60
+
61
+ def scm_match_reference
62
+ if match_tag_name
63
+ "refs/tags/#{match_tag_name}"
64
+ else
65
+ "HEAD"
66
+ end
67
+ end
68
+
69
+ def update_repo_tag
70
+ system_call("git tag #{tag_name} #{match_tag_name} -f")
71
+ system_call("git push -f origin #{scm_tag_reference}")
72
+ end
73
+
74
+ # Internal: Calls commands meant to go to system.
42
75
  #
43
- # cmd - String version of system command
76
+ # cmd - String version of system command.
44
77
  #
45
78
  def system_call(cmd, exit_code = false)
46
79
  system_caller.execute(cmd, exit_code)
@@ -1,3 +1,3 @@
1
1
  module Paratrooper
2
- VERSION = "3.0.0.beta1".freeze
2
+ VERSION = "3.0.0.beta2".freeze
3
3
  end
@@ -125,6 +125,27 @@ describe Paratrooper::SourceControl do
125
125
  end
126
126
  end
127
127
 
128
+ describe "update_repo_tag" do
129
+ let(:system_caller) { double(:system_caller) }
130
+
131
+ before do
132
+ allow(system_caller).to receive(:execute)
133
+ end
134
+
135
+ it "issues command to create/update & push tag based on tag name" do
136
+ config = instance_double(Paratrooper::Configuration,
137
+ system_caller: system_caller,
138
+ tag_name: 'TAG',
139
+ match_tag_name: 'MATCH_TAG'
140
+ )
141
+ source_control = described_class.new(config)
142
+ source_control.update_repo_tag
143
+
144
+ expected_cmd = ["git tag TAG MATCH_TAG -f", false]
145
+ expect(system_caller).to have_received(:execute).with(*expected_cmd)
146
+ end
147
+ end
148
+
128
149
  describe "push_to_deploy" do
129
150
  let(:system_caller) { double(:system_caller) }
130
151
 
@@ -230,4 +251,40 @@ describe Paratrooper::SourceControl do
230
251
  end
231
252
  end
232
253
  end
254
+
255
+ describe "#scm_tag_reference" do
256
+ context "when tag_name is available" do
257
+ it "returns fully qualified tag name" do
258
+ config = instance_double(Paratrooper::Configuration, tag_name: "TAG")
259
+ source_control = described_class.new(config)
260
+ expect(source_control.scm_tag_reference).to eq("refs/tags/TAG")
261
+ end
262
+ end
263
+
264
+ context "when tag_name is unavailable" do
265
+ it "returns nil" do
266
+ config = instance_double(Paratrooper::Configuration, tag_name: nil)
267
+ source_control = described_class.new(config)
268
+ expect(source_control.scm_tag_reference).to be_nil
269
+ end
270
+ end
271
+ end
272
+
273
+ describe "#scm_match_reference" do
274
+ context "when match_tag_name is available" do
275
+ it "returns fully qualified tag name" do
276
+ config = instance_double(Paratrooper::Configuration, match_tag_name: "MATCH_TAG")
277
+ source_control = described_class.new(config)
278
+ expect(source_control.scm_match_reference).to eq("refs/tags/MATCH_TAG")
279
+ end
280
+ end
281
+
282
+ context "when match_tag_name is unavailable" do
283
+ it "returns HEAD" do
284
+ config = instance_double(Paratrooper::Configuration, match_tag_name: nil)
285
+ source_control = described_class.new(config)
286
+ expect(source_control.scm_match_reference).to eq("HEAD")
287
+ end
288
+ end
289
+ end
233
290
  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: 3.0.0.beta1
4
+ version: 3.0.0.beta2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matt Polito
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-12-29 00:00:00.000000000 Z
12
+ date: 2015-05-10 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rake
@@ -171,7 +171,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
171
171
  version: 1.3.1
172
172
  requirements: []
173
173
  rubyforge_project:
174
- rubygems_version: 2.2.2
174
+ rubygems_version: 2.4.5
175
175
  signing_key:
176
176
  specification_version: 4
177
177
  summary: Library to create task for deployment to Heroku