paratrooper 0.4.0 → 1.0.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/README.md CHANGED
@@ -1,8 +1,10 @@
1
- # Paratrooper
2
-
3
- Library for handling common tasks when deploying to [Heroku](http://heroku.com)
1
+ ## Paratrooper
4
2
 
3
+ [![Gem Version](https://badge.fury.io/rb/paratrooper.png)](http://badge.fury.io/rb/paratrooper)
5
4
  [![Build Status](https://travis-ci.org/mattpolito/paratrooper.png?branch=master)](https://travis-ci.org/mattpolito/paratrooper)
5
+ [![Code Climate](https://codeclimate.com/github/mattpolito/paratrooper.png)](https://codeclimate.com/github/mattpolito/paratrooper)
6
+
7
+ Make your complex deploy to [Heroku][] easy.
6
8
 
7
9
  ## Installation
8
10
 
@@ -20,8 +22,6 @@ Or install it yourself as:
20
22
 
21
23
  ## Usage
22
24
 
23
- >> Note: Before getting started, ensure that `ENV['HEROKU_API_KEY']` is set. If you do not know your api key, you can `cat ~/.netrc`. Your api key will be listed as password in that file. This is necessary until reading your crendentials out of the `.netrc` file is implemented.
24
-
25
25
  Instantiate Paratrooper with the name of your heroku application
26
26
 
27
27
  ```ruby
@@ -36,6 +36,30 @@ Paratrooper::Deploy.new('amazing-app', tag: 'staging')
36
36
 
37
37
  Then there are methods available to perform common tasks like creating git tags, running migrations, and warming your application instance.
38
38
 
39
+ ## Authentication
40
+
41
+ Authentication with your Heroku account can happen in a few different ways
42
+
43
+ * Providing API Key
44
+
45
+ ```ruby
46
+ Paratrooper::Deploy.new('app', api_key: 'API_KEY')
47
+ ```
48
+
49
+ * Via environment variable
50
+
51
+ ```ruby
52
+ ENV['HEROKU_API_KEY'] = 'API_KEY'
53
+ Paratrooper::Deploy.new('app')
54
+ ```
55
+
56
+ * Local file storage
57
+ This method works via a local Netrc file. Storage of this key is handled via the [Heroku Toolbelt][]. This is the default and preferred method of providing your authentication key.
58
+
59
+ ```ruby
60
+ Paratrooper::Deploy.new('app')
61
+ ```
62
+
39
63
  ## Sensible Default Deployment
40
64
 
41
65
  You can use the objects methods any way you'd like but we've provided a sensible default at `Paratrooper#deploy`
@@ -72,6 +96,11 @@ namespace :deploy do
72
96
  end
73
97
  ```
74
98
 
99
+ ## Nice to haves
100
+
101
+ * deploy to heroku from tags
102
+ * send [New Relic][] a notification to toggle heartbeat during deploy
103
+
75
104
  ## Contributing
76
105
 
77
106
  1. Fork it
@@ -79,3 +108,7 @@ end
79
108
  3. Commit your changes (`git commit -am 'Add some feature'`)
80
109
  4. Push to the branch (`git push origin my-new-feature`)
81
110
  5. Create new Pull Request
111
+
112
+ [Heroku]: http://heroku.com
113
+ [Heroku Toolbelt]: http://toolbelt.heroku.com
114
+ [New Relic]: http://newrelic.com
@@ -4,13 +4,15 @@ require 'paratrooper/system_caller'
4
4
 
5
5
  module Paratrooper
6
6
  class Deploy
7
- attr_reader :app_name, :formatter, :system_caller, :heroku, :tag_name
7
+ attr_reader :app_name, :formatter, :system_caller, :heroku, :tag_name,
8
+ :deploy_tag
8
9
 
9
10
  def initialize(app_name, options = {})
10
11
  @app_name = app_name
11
12
  @formatter = options[:formatter] || DefaultFormatter.new
12
13
  @heroku = options[:heroku] || HerokuWrapper.new(app_name, options)
13
14
  @tag_name = options[:tag]
15
+ @deploy_tag = options[:deploy_tag] || 'master'
14
16
  @system_caller = options[:system_caller] || SystemCaller.new
15
17
  end
16
18
 
@@ -27,14 +29,14 @@ module Paratrooper
27
29
  def update_repo_tag
28
30
  unless tag_name.nil? || tag_name.empty?
29
31
  notify_screen("Updating Repo Tag: #{tag_name}")
30
- system_call "git tag #{tag_name} -f"
32
+ system_call "git tag #{tag_name} #{deploy_tag} -f"
31
33
  system_call "git push origin #{tag_name}"
32
34
  end
33
35
  end
34
36
 
35
- def push_repo(branch = 'master')
36
- notify_screen("Pushing #{branch} to Heroku")
37
- system_call "git push -f #{git_remote} #{branch}"
37
+ def push_repo
38
+ notify_screen("Pushing #{deploy_tag} to Heroku")
39
+ system_call "git push -f #{git_remote} #{deploy_tag}:master"
38
40
  end
39
41
 
40
42
  def run_migrations
@@ -1,5 +1,7 @@
1
- class SystemCaller
2
- def execute(call)
3
- system(call)
1
+ module Paratrooper
2
+ class SystemCaller
3
+ def execute(call)
4
+ system(call)
5
+ end
4
6
  end
5
7
  end
@@ -1,3 +1,3 @@
1
1
  module Paratrooper
2
- VERSION = "0.4.0"
2
+ VERSION = "1.0.0"
3
3
  end
@@ -105,9 +105,22 @@ describe Paratrooper::Deploy do
105
105
  deployer.update_repo_tag
106
106
  end
107
107
 
108
- it 'creates a git tag' do
109
- system_caller.should_receive(:execute).with('git tag awesome -f')
110
- deployer.update_repo_tag
108
+ context "when deploy_tag is available" do
109
+ before do
110
+ options.merge!(deploy_tag: 'deploy_this')
111
+ end
112
+
113
+ it 'creates a git tag at deploy_tag reference point' do
114
+ system_caller.should_receive(:execute).with('git tag awesome deploy_this -f')
115
+ deployer.update_repo_tag
116
+ end
117
+ end
118
+
119
+ context "when no deploy_tag is available" do
120
+ it 'creates a git tag at HEAD' do
121
+ system_caller.should_receive(:execute).with('git tag awesome master -f')
122
+ deployer.update_repo_tag
123
+ end
111
124
  end
112
125
 
113
126
  it 'pushes git tag' do
@@ -138,7 +151,7 @@ describe Paratrooper::Deploy do
138
151
  end
139
152
 
140
153
  it 'pushes repo to heroku' do
141
- expected_call = 'git push -f git@heroku.com:app.git master'
154
+ expected_call = 'git push -f git@heroku.com:app.git master:master'
142
155
  system_caller.should_receive(:execute).with(expected_call)
143
156
  deployer.push_repo
144
157
  end
@@ -9,7 +9,8 @@ describe Paratrooper::HerokuWrapper do
9
9
  let(:options) { Hash.new }
10
10
  let(:default_options) do
11
11
  {
12
- heroku_api: heroku_api
12
+ heroku_api: heroku_api,
13
+ key_extractor: double(:key_extractor, get_credentials: 'API_KEY')
13
14
  }
14
15
  end
15
16
  let(:heroku_api) { double(:heroku_api) }
@@ -1,10 +1,15 @@
1
1
  require 'spec_helper'
2
+ require 'fileutils'
2
3
  require 'paratrooper/local_api_key_extractor'
3
4
 
4
5
  describe Paratrooper::LocalApiKeyExtractor do
5
6
  let(:netrc_klass) { double(:netrc_klass, default_path: fixture_file_path) }
6
7
  let(:fixture_file_path) { fixture_path('netrc') }
7
8
 
9
+ before do
10
+ File.chmod(0600, fixture_file_path)
11
+ end
12
+
8
13
  describe 'file association' do
9
14
  context 'when file path is provided' do
10
15
  let(:extractor) { described_class.new(file_path: fixture_file_path) }
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: 0.4.0
4
+ version: 1.0.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-02-05 00:00:00.000000000 Z
13
+ date: 2013-02-08 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: rake