push2heroku 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +2 -0
- data/README.md +58 -16
- data/lib/push2heroku.rb +1 -0
- data/lib/push2heroku/base.rb +41 -19
- data/lib/push2heroku/config_loader.rb +23 -7
- data/lib/push2heroku/git.rb +2 -2
- data/lib/push2heroku/railtie.rb +2 -1
- data/lib/push2heroku/util.rb +13 -0
- data/lib/push2heroku/version.rb +1 -1
- data/push2heroku.gemspec +1 -1
- metadata +27 -10
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -1,33 +1,75 @@
|
|
1
1
|
# Push2heroku
|
2
2
|
|
3
|
-
|
3
|
+
Makes it easy to push to heroku.
|
4
4
|
|
5
5
|
## Installation
|
6
6
|
|
7
|
-
Add this
|
7
|
+
Add this to Gemfile:
|
8
8
|
|
9
9
|
gem 'push2heroku'
|
10
10
|
|
11
|
-
|
11
|
+
## Usage
|
12
12
|
|
13
|
-
|
13
|
+
After installing the gem copy [this file](https://raw.github.com/gist/3098161/578dad8cd3933834712a8afdf33520221dbdb986/push2heroku.yml) to `config/push2heroku.yml` .
|
14
14
|
|
15
|
-
|
15
|
+
Change the contents of `config/push2heroku.yml` as per your needs after
|
16
|
+
reading rest of README.
|
16
17
|
|
17
|
-
|
18
|
+
## What problem it solves
|
18
19
|
|
19
|
-
|
20
|
+
Here at BigBinary we create a separate branch for each feature we work
|
21
|
+
on. Let's say that I am working on `authentication with facebook`.
|
22
|
+
When I am done with the feature then I send pull request to my team
|
23
|
+
members to review. However in order to review the work all the team
|
24
|
+
members need to pull down the branch and fire up `rails server` and then
|
25
|
+
review.
|
26
|
+
|
27
|
+
We like to see things working. So we developed `push2heroku` to push a
|
28
|
+
feature branch to heroku instantly with one command. Executing
|
29
|
+
`push2heroku` prints a url and we put that url in the pull request so
|
30
|
+
that team members can actually test the feature.
|
31
|
+
|
32
|
+
## Here is how it works
|
33
|
+
|
34
|
+
`push2heroku` reads the `push2heroku.yml` and executes those commands.
|
35
|
+
It's that simple.
|
36
|
+
|
37
|
+
Lets say that I am working in a branch called
|
38
|
+
`76-facebook-authentication`. When I execute `push2heroku` then the
|
39
|
+
application name under which it will be deployed to heroku will be
|
40
|
+
`nimbleshop-76-facebook-neeraj`.
|
41
|
+
|
42
|
+
`nimbleshop` is the name of the project.
|
43
|
+
`76-facebook` is the first 10 letters of the branch name.
|
44
|
+
`neeraj` is the first 5 letters of my github user name.
|
45
|
+
|
46
|
+
So in this case the url of the application will be
|
47
|
+
`http://nimbleshop-76-facebook-neeraj.herokuapp.com` .
|
48
|
+
|
49
|
+
In the `push2heroku.yml` file the keys `production` and `staging`
|
50
|
+
are branch names. And these branches are special branches. For these
|
51
|
+
branches the url generated will be just the application name and the
|
52
|
+
branch name. For example if I execute `rake push2heroku` from `staging`
|
53
|
+
branch then the heroku url will be
|
54
|
+
`http://nimbleshop-staging.herokuapp.com`.
|
55
|
+
|
56
|
+
However if I delete `staging` key from `push2heroku.yml` then `staging`
|
57
|
+
is no longer a special branch and the heroku url would be
|
58
|
+
`http://nimbleshop-staging-neeraj.herokuapp.com` .
|
59
|
+
|
60
|
+
## Resetting the database
|
20
61
|
|
21
|
-
|
62
|
+
When the application is deployed for the very first time then you want
|
63
|
+
the database to reset and some sort of setup to be run. However on
|
64
|
+
subsequest deployment you do not need to run those setup tasks.
|
22
65
|
|
23
|
-
`
|
66
|
+
To incorporate that on first deployment `push2heroku` will execute
|
67
|
+
commands mentioned under key `hard`. Here `hard` stands for hard push.
|
68
|
+
Subsequent pushes will be `soft` push.
|
24
69
|
|
25
|
-
|
70
|
+
If you want to force `hard` push anytime then execute `rake push2heroku
|
71
|
+
HARD=true`.
|
26
72
|
|
27
|
-
##
|
73
|
+
## License
|
28
74
|
|
29
|
-
|
30
|
-
2. Create your feature branch (`git checkout -b my-new-feature`)
|
31
|
-
3. Commit your changes (`git commit -am 'Added some feature'`)
|
32
|
-
4. Push to the branch (`git push origin my-new-feature`)
|
33
|
-
5. Create new Pull Request
|
75
|
+
`push2heroku` is released under MIT License.
|
data/lib/push2heroku.rb
CHANGED
data/lib/push2heroku/base.rb
CHANGED
@@ -1,24 +1,31 @@
|
|
1
1
|
module Push2heroku
|
2
2
|
class Base
|
3
3
|
|
4
|
-
attr_accessor :branch_name, :commands, :current_user, :
|
4
|
+
attr_accessor :branch_name, :commands, :current_user, :heroku_app_name, :settings, :named_branches
|
5
|
+
attr_reader :hard, :project_name
|
6
|
+
|
7
|
+
def initialize(hard)
|
8
|
+
@project_name = File.basename(Dir.getwd)
|
9
|
+
@hard = hard.blank? ? false : true
|
5
10
|
|
6
|
-
def initialize
|
7
11
|
git = Git.new
|
8
12
|
@branch_name = git.current_branch
|
9
13
|
@current_user = git.current_user
|
10
|
-
@settings = ConfigLoader.new('push2heroku.yml').load(branch_name)
|
11
|
-
@commands = []
|
12
|
-
@subdomain = "#{url_prefix}-#{url_suffix}"
|
13
|
-
end
|
14
14
|
|
15
|
-
|
16
|
-
|
15
|
+
@named_branches = ConfigLoader.new('push2heroku.yml').named_branches
|
16
|
+
|
17
|
+
@heroku_app_name = "#{url_prefix}-#{url_suffix}".downcase.chomp('-')[0..29] #heroku only allows upto 30 characters in name
|
18
|
+
|
19
|
+
ENV['BRANCH_NAME'] = branch_name
|
20
|
+
ENV['HEROKU_APP_NAME'] = heroku_app_name
|
21
|
+
@settings = ConfigLoader.new('push2heroku.yml').settings(branch_name)
|
22
|
+
|
23
|
+
@commands = []
|
17
24
|
end
|
18
25
|
|
19
26
|
def push
|
20
27
|
build_commands
|
21
|
-
|
28
|
+
feedback_to_user
|
22
29
|
commands.each do |cmd|
|
23
30
|
begin
|
24
31
|
sh cmd
|
@@ -31,31 +38,46 @@ module Push2heroku
|
|
31
38
|
private
|
32
39
|
|
33
40
|
def url_suffix
|
34
|
-
return branch_name if
|
41
|
+
return branch_name if named_branches.include?(branch_name)
|
35
42
|
|
36
43
|
[branch_name[0..10], current_user[0..5]].join('-').gsub(/[^0-9a-zA-Z]+/,'-').downcase
|
37
44
|
end
|
38
45
|
|
39
46
|
def url_prefix
|
40
|
-
|
47
|
+
project_name.gsub(/[^0-9a-zA-Z]+/,'-').downcase
|
41
48
|
end
|
42
49
|
|
43
50
|
def build_commands
|
44
|
-
commands <<
|
45
|
-
commands << "git push h#{branch_name} #{branch_name}:master -f "
|
46
|
-
|
51
|
+
commands << settings.pre_config_commands
|
47
52
|
build_config_commands
|
48
|
-
|
49
|
-
commands << "
|
50
|
-
commands
|
51
|
-
commands << "heroku open --app #{subdomain}"
|
53
|
+
commands << ( Util.hard_push?(self) ? settings.post_config_commands.hard : settings.post_config_commands.soft )
|
54
|
+
commands << "bundle exec heroku open --app #{heroku_app_name}"
|
55
|
+
commands.flatten!
|
52
56
|
end
|
53
57
|
|
54
58
|
def build_config_commands
|
59
|
+
return unless settings.config
|
60
|
+
cmd = []
|
55
61
|
settings.config.each do |key, value|
|
56
|
-
|
62
|
+
cmd << "#{key.upcase}=#{value}"
|
57
63
|
end
|
64
|
+
commands << "bundle exec heroku config:add #{cmd.join(' ')} --app #{heroku_app_name}"
|
58
65
|
end
|
59
66
|
|
67
|
+
def feedback_to_user
|
68
|
+
puts '='*50
|
69
|
+
puts 'The application will be deployed at:'
|
70
|
+
puts "http://#{heroku_app_name}.herokuapp.com"
|
71
|
+
puts '='*50
|
72
|
+
puts ''
|
73
|
+
puts '='*50
|
74
|
+
puts 'Following commands will be executed:'
|
75
|
+
commands.each do |cmd|
|
76
|
+
puts ''
|
77
|
+
puts cmd
|
78
|
+
end
|
79
|
+
puts '='*50
|
80
|
+
puts ''
|
81
|
+
end
|
60
82
|
end
|
61
83
|
end
|
@@ -1,21 +1,37 @@
|
|
1
1
|
module Push2heroku
|
2
2
|
class ConfigLoader
|
3
3
|
|
4
|
-
attr_reader :filename
|
4
|
+
attr_reader :filename, :hash
|
5
5
|
|
6
6
|
def initialize(filename)
|
7
7
|
@filename = filename
|
8
|
+
@hash = load_config
|
8
9
|
end
|
9
10
|
|
10
|
-
def
|
11
|
-
file = Rails.root.join('config', filename)
|
12
|
-
hash = YAML.load(ERB.new(File.read(file)).result)
|
13
|
-
|
11
|
+
def settings(branch_name)
|
14
12
|
common_hash = hash['common'] || {}
|
15
|
-
env_hash = hash[
|
16
|
-
|
13
|
+
env_hash = hash[branch_name.to_s] || {}
|
17
14
|
final_hash = common_hash.deep_merge(env_hash)
|
18
15
|
Hashr.new(final_hash)
|
19
16
|
end
|
17
|
+
|
18
|
+
def named_branches
|
19
|
+
hash.keys - ['common']
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def load_config
|
25
|
+
file = Rails.root.join('config', filename)
|
26
|
+
|
27
|
+
unless File.exists? file
|
28
|
+
puts "you do not have config/push2heroku.yml file. Please execute "
|
29
|
+
puts "rails generate push2heroku:install"
|
30
|
+
abort
|
31
|
+
end
|
32
|
+
YAML.load(ERB.new(File.read(file)).result)
|
33
|
+
end
|
34
|
+
|
35
|
+
|
20
36
|
end
|
21
37
|
end
|
data/lib/push2heroku/git.rb
CHANGED
@@ -5,12 +5,12 @@ module Push2heroku
|
|
5
5
|
if result.empty?
|
6
6
|
raise "It seems your app is not a git repo"
|
7
7
|
else
|
8
|
-
result.select { |b| b =~ /^\*/ }.first.split(" ").last.strip
|
8
|
+
result.select { |b| b =~ /^\*/ }.first.split(" ").last.strip
|
9
9
|
end
|
10
10
|
end
|
11
11
|
|
12
12
|
def current_user
|
13
|
-
`git config user.name`.chop
|
13
|
+
`git config user.name`.chop!
|
14
14
|
end
|
15
15
|
end
|
16
16
|
end
|
data/lib/push2heroku/railtie.rb
CHANGED
@@ -0,0 +1,13 @@
|
|
1
|
+
class Util
|
2
|
+
|
3
|
+
def self.hard_push?(base)
|
4
|
+
remote_branch_name = "h#{base.branch_name}"
|
5
|
+
base.hard || !remote_branch_exists?(remote_branch_name)
|
6
|
+
end
|
7
|
+
|
8
|
+
def self.remote_branch_exists?(remote_branch_name)
|
9
|
+
out = `cd #{Rails.root.expand_path} && git branch -r`
|
10
|
+
out.include?(remote_branch_name)
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
data/lib/push2heroku/version.rb
CHANGED
data/push2heroku.gemspec
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: push2heroku
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,30 +9,40 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-07-12 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: hashr
|
16
|
-
requirement:
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
|
-
- - =
|
19
|
+
- - '='
|
20
20
|
- !ruby/object:Gem::Version
|
21
21
|
version: 0.0.19
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements:
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - '='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 0.0.19
|
25
30
|
- !ruby/object:Gem::Dependency
|
26
31
|
name: heroku
|
27
|
-
requirement:
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
28
33
|
none: false
|
29
34
|
requirements:
|
30
|
-
- -
|
35
|
+
- - '='
|
31
36
|
- !ruby/object:Gem::Version
|
32
|
-
version:
|
37
|
+
version: 2.25.0
|
33
38
|
type: :runtime
|
34
39
|
prerelease: false
|
35
|
-
version_requirements:
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - '='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: 2.25.0
|
36
46
|
description: push2heroku
|
37
47
|
email:
|
38
48
|
- neerajdotname@gmail.com
|
@@ -50,6 +60,7 @@ files:
|
|
50
60
|
- lib/push2heroku/config_loader.rb
|
51
61
|
- lib/push2heroku/git.rb
|
52
62
|
- lib/push2heroku/railtie.rb
|
63
|
+
- lib/push2heroku/util.rb
|
53
64
|
- lib/push2heroku/version.rb
|
54
65
|
- push2heroku.gemspec
|
55
66
|
homepage: ''
|
@@ -64,15 +75,21 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
64
75
|
- - ! '>='
|
65
76
|
- !ruby/object:Gem::Version
|
66
77
|
version: '0'
|
78
|
+
segments:
|
79
|
+
- 0
|
80
|
+
hash: 2308710282152006324
|
67
81
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
68
82
|
none: false
|
69
83
|
requirements:
|
70
84
|
- - ! '>='
|
71
85
|
- !ruby/object:Gem::Version
|
72
86
|
version: '0'
|
87
|
+
segments:
|
88
|
+
- 0
|
89
|
+
hash: 2308710282152006324
|
73
90
|
requirements: []
|
74
91
|
rubyforge_project:
|
75
|
-
rubygems_version: 1.8.
|
92
|
+
rubygems_version: 1.8.24
|
76
93
|
signing_key:
|
77
94
|
specification_version: 3
|
78
95
|
summary: push2heroku
|