heroku-bartender 0.3.0 → 0.3.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/README.markdown +10 -2
- data/bin/heroku-bartender +12 -7
- data/lib/heroku/bartender.rb +1 -0
- data/lib/heroku/bartender/command.rb +20 -7
- data/lib/heroku/bartender/config.rb +48 -0
- data/lib/heroku/bartender/log.rb +4 -4
- data/lib/heroku/bartender/public/favicon.ico +0 -0
- data/lib/heroku/bartender/server.rb +76 -17
- data/lib/heroku/bartender/version.rb +1 -1
- data/lib/heroku/bartender/views/template.erb +16 -5
- metadata +4 -2
data/README.markdown
CHANGED
@@ -13,9 +13,17 @@ Server options:
|
|
13
13
|
-t, --target=TARGET The target is the git remote in which you want to deploy (default heroku)
|
14
14
|
--user=USER The user to login using HTTP Basic Auth
|
15
15
|
--password=PASSWORD The password to login using HTTP Basic Auth
|
16
|
-
|
16
|
+
-c, --commits=COUNT The maximum number of commits to display (default 100)
|
17
17
|
|
18
18
|
For now you must run `heroku-bartender` inside your repo dir
|
19
|
+
|
20
|
+
## Specifying a Pre-Deploy Command
|
21
|
+
|
22
|
+
You can specify a command to run before deployment.
|
23
|
+
|
24
|
+
git config --add remote.master.predeploy "rake test"
|
25
|
+
|
26
|
+
|
19
27
|
# Features
|
20
28
|
1. You can rollback your heroku app to a specific commit hash
|
21
29
|
2. You can secure your heroku-bartender server using HTTP Basic Auth
|
@@ -25,7 +33,7 @@ For now you must run `heroku-bartender` inside your repo dir
|
|
25
33
|
6. Shows colors/status for old deployed versions (only the versions that are deployed from the start)
|
26
34
|
|
27
35
|
# TODO
|
28
|
-
1. Keep
|
36
|
+
1. Keep the repo up-to-date
|
29
37
|
2. Handle branches/tags
|
30
38
|
3. DB Rollback
|
31
39
|
4. Styling view
|
data/bin/heroku-bartender
CHANGED
@@ -27,13 +27,13 @@ Choice.options do
|
|
27
27
|
end
|
28
28
|
|
29
29
|
option :user do
|
30
|
-
d =
|
30
|
+
d = nil
|
31
31
|
long '--user=USER'
|
32
32
|
desc "The user to login using HTTP Basic Auth"
|
33
33
|
default d
|
34
34
|
end
|
35
35
|
option :password do
|
36
|
-
d =
|
36
|
+
d = nil
|
37
37
|
long '--password=PASSWORD'
|
38
38
|
desc "The password to login using HTTP Basic Auth"
|
39
39
|
end
|
@@ -48,6 +48,15 @@ Choice.options do
|
|
48
48
|
desc "The target is the git remote in which you want to deploy (default #{d})"
|
49
49
|
default d
|
50
50
|
end
|
51
|
+
|
52
|
+
option :commits do
|
53
|
+
d = 100
|
54
|
+
short '-c'
|
55
|
+
long '--commits=COUNT'
|
56
|
+
desc "The maximum number of commits to show (default #{d})"
|
57
|
+
default d
|
58
|
+
end
|
59
|
+
|
51
60
|
option :help do
|
52
61
|
long '--help'
|
53
62
|
desc 'Show this message'
|
@@ -66,9 +75,5 @@ end
|
|
66
75
|
|
67
76
|
options = Choice.choices
|
68
77
|
|
78
|
+
Heroku::Bartender::Server.start(options)
|
69
79
|
|
70
|
-
Heroku::Bartender::Server.start(options[:host],
|
71
|
-
options[:port],
|
72
|
-
options[:target],
|
73
|
-
options[:user],
|
74
|
-
options[:password])
|
data/lib/heroku/bartender.rb
CHANGED
@@ -2,7 +2,7 @@ require 'grit'
|
|
2
2
|
module Heroku
|
3
3
|
module Bartender
|
4
4
|
class Command
|
5
|
-
|
5
|
+
|
6
6
|
def self.current_version(heroku_remote)
|
7
7
|
repo = Grit::Repo.new('.')
|
8
8
|
if repo.remote_list.include?(heroku_remote)
|
@@ -10,20 +10,33 @@ module Heroku
|
|
10
10
|
end
|
11
11
|
nil
|
12
12
|
end
|
13
|
+
|
13
14
|
def self.sha_exist?(sha)
|
14
15
|
if sha and not `git show #{sha}`.empty?
|
15
16
|
return true
|
16
17
|
end
|
17
18
|
false
|
18
19
|
end
|
19
|
-
|
20
|
-
def self.move_to release, heroku_remote
|
20
|
+
|
21
|
+
def self.move_to release, predeploy, heroku_remote
|
22
|
+
@@last_error = nil
|
23
|
+
if ! predeploy.nil?
|
24
|
+
rc = system(predeploy)
|
25
|
+
if rc.nil? || ! rc
|
26
|
+
raise "Error executing '#{predeploy}': #{$?}"
|
27
|
+
end
|
28
|
+
end
|
21
29
|
repo = Grit::Repo.new('.')
|
22
|
-
if repo.remote_list.include?(heroku_remote)
|
23
|
-
|
24
|
-
|
30
|
+
if ! repo.remote_list.include?(heroku_remote)
|
31
|
+
raise "No such remote `#{heroku_remote}`"
|
32
|
+
end
|
33
|
+
if ! sha_exist?(release)
|
34
|
+
raise "No such commit `#{release}"
|
35
|
+
end
|
36
|
+
rc = system("git push -f #{heroku_remote} #{release}:master")
|
37
|
+
if rc.nil? || ! rc
|
38
|
+
raise "Error in `git push -f #{heroku_remote} #{release}:master`: #{$?}"
|
25
39
|
end
|
26
|
-
false
|
27
40
|
end
|
28
41
|
end
|
29
42
|
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
# heavily inspired by https://github.com/defunkt/cijoe/blob/master/lib/cijoe/config.rb
|
2
|
+
module Heroku
|
3
|
+
module Bartender
|
4
|
+
class Config
|
5
|
+
|
6
|
+
def self.method_missing(command, *args)
|
7
|
+
new(command, *args)
|
8
|
+
end
|
9
|
+
|
10
|
+
def initialize(command, project_path = nil, parent = nil)
|
11
|
+
@command = command
|
12
|
+
@parent = parent
|
13
|
+
@project_path = project_path || File.join(File.dirname(__FILE__), '../../')
|
14
|
+
end
|
15
|
+
|
16
|
+
def method_missing(command, *args)
|
17
|
+
Config.new(command, @project_path, self)
|
18
|
+
end
|
19
|
+
|
20
|
+
def to_s
|
21
|
+
git_command = "cd #{@project_path} && git config #{config_string}"
|
22
|
+
result = `#{git_command} 2>&1`.chomp
|
23
|
+
process_status = $?
|
24
|
+
|
25
|
+
if successful_command?(process_status) || config_command_with_empty_value?(result,process_status)
|
26
|
+
return result
|
27
|
+
else
|
28
|
+
raise "Error calling git config, is a recent version of git installed? Command: #{git_command.inspect}, Error: #{result.inspect}, Status: #{process_status.inspect}"
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def config_string
|
33
|
+
@parent ? "#{@parent.config_string}.#{@command}" : @command
|
34
|
+
end
|
35
|
+
|
36
|
+
private
|
37
|
+
|
38
|
+
def successful_command?(process_status)
|
39
|
+
process_status.exitstatus.to_i == 0
|
40
|
+
end
|
41
|
+
|
42
|
+
def config_command_with_empty_value?(result, process_status)
|
43
|
+
process_status.exitstatus.to_i == 1 && result.empty?
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
data/lib/heroku/bartender/log.rb
CHANGED
@@ -2,11 +2,11 @@ require "grit"
|
|
2
2
|
module Heroku
|
3
3
|
module Bartender
|
4
4
|
class Log
|
5
|
-
def self.get_log
|
6
|
-
Grit::Repo.new('.').log
|
5
|
+
def self.get_log(options = {})
|
6
|
+
Grit::Repo.new('.').log('master', nil, options)
|
7
7
|
end
|
8
|
-
def self.generate_commits
|
9
|
-
get_log.map do |item|
|
8
|
+
def self.generate_commits(options = {})
|
9
|
+
get_log(options).map do |item|
|
10
10
|
Commit.new({ :sha => item.sha , :author => item.author.name,
|
11
11
|
:email => item.author.email, :message => item.message,
|
12
12
|
:date => item.date
|
Binary file
|
@@ -3,47 +3,96 @@ require 'erb'
|
|
3
3
|
module Heroku
|
4
4
|
module Bartender
|
5
5
|
class Server < Sinatra::Base
|
6
|
-
|
7
|
-
@@user
|
8
|
-
@@pass
|
6
|
+
|
9
7
|
@@deployed_versions = {}
|
10
8
|
@@status = nil
|
9
|
+
@@options = {}
|
10
|
+
|
11
11
|
dir = File.dirname(File.expand_path(__FILE__))
|
12
12
|
set :views, "#{dir}/views"
|
13
|
+
set :public, "#{dir}/public"
|
14
|
+
|
15
|
+
def self.commits
|
16
|
+
@@options[:commits]
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.user
|
20
|
+
@@options[:user]
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.password
|
24
|
+
@@options[:password]
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.target
|
28
|
+
@@options[:target] || 'heroku'
|
29
|
+
end
|
30
|
+
|
31
|
+
def self.host
|
32
|
+
@@options[:host]
|
33
|
+
end
|
34
|
+
|
35
|
+
def self.port
|
36
|
+
@@options[:port]
|
37
|
+
end
|
38
|
+
|
39
|
+
def self.config
|
40
|
+
Config.send("remote.#{Server.target}")
|
41
|
+
end
|
42
|
+
|
43
|
+
def self.predeploy
|
44
|
+
config.predeploy.to_s
|
45
|
+
end
|
46
|
+
|
47
|
+
def self.log_options
|
48
|
+
options = { }
|
49
|
+
options.merge({ :max_count => Server.commits }) if (Server.commits > 0)
|
50
|
+
options
|
51
|
+
end
|
52
|
+
|
13
53
|
get "/" do
|
14
|
-
erb(:template, {}, :commits => Log.generate_commits,
|
15
|
-
:current_version => Command.current_version(
|
54
|
+
erb(:template, {}, :commits => Log.generate_commits(Server.log_options),
|
55
|
+
:current_version => Command.current_version(Server.target),
|
16
56
|
:deployed_versions => @@deployed_versions,
|
17
57
|
:status => @@status
|
18
58
|
)
|
19
59
|
end
|
60
|
+
|
20
61
|
post "/" do
|
21
62
|
if params[:sha]
|
22
|
-
|
23
|
-
|
63
|
+
begin
|
64
|
+
Command.move_to params[:sha], predeploy, target
|
65
|
+
@@status = true
|
66
|
+
@@deployed_versions[params[:sha]] = [Time.now, @@status, nil]
|
67
|
+
rescue Exception => e
|
68
|
+
@@status = false
|
69
|
+
@@deployed_versions[params[:sha]] = [Time.now, @@status, e]
|
70
|
+
end
|
24
71
|
end
|
25
|
-
erb(:template, {}, :commits => Log.generate_commits,
|
26
|
-
:current_version => Command.current_version(
|
72
|
+
erb(:template, {}, :commits => Log.generate_commits(Server.log_options),
|
73
|
+
:current_version => Command.current_version(Server.target),
|
27
74
|
:deployed_versions => @@deployed_versions,
|
28
75
|
:status => @@status
|
29
76
|
)
|
30
77
|
end
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
78
|
+
|
79
|
+
def self.start(options = {})
|
80
|
+
@@options = options
|
81
|
+
authorize(user, password)
|
82
|
+
run!(:host => host, :port => port)
|
35
83
|
end
|
36
84
|
|
37
|
-
def self.authorize(user,
|
38
|
-
if user
|
39
|
-
use Rack::Auth::Basic, "Restricted Area" do |
|
40
|
-
[
|
85
|
+
def self.authorize(user, password)
|
86
|
+
if ! user.nil?
|
87
|
+
use Rack::Auth::Basic, "Restricted Area" do |u, p|
|
88
|
+
[u, p] == [user, password]
|
41
89
|
end
|
42
90
|
end
|
43
91
|
end
|
44
92
|
|
45
93
|
helpers do
|
46
94
|
include Rack::Utils
|
95
|
+
|
47
96
|
def current_class(current_version_sha, sha)
|
48
97
|
sha == current_version_sha ? 'current' : ''
|
49
98
|
end
|
@@ -60,6 +109,7 @@ module Heroku
|
|
60
109
|
end
|
61
110
|
''
|
62
111
|
end
|
112
|
+
|
63
113
|
def state(status)
|
64
114
|
if status == true
|
65
115
|
return 'OK'
|
@@ -68,6 +118,15 @@ module Heroku
|
|
68
118
|
end
|
69
119
|
'UNKNOWN'
|
70
120
|
end
|
121
|
+
|
122
|
+
def target
|
123
|
+
Server.target
|
124
|
+
end
|
125
|
+
|
126
|
+
def predeploy
|
127
|
+
Server.predeploy
|
128
|
+
end
|
129
|
+
|
71
130
|
end
|
72
131
|
end
|
73
132
|
end
|
@@ -22,11 +22,17 @@
|
|
22
22
|
</head>
|
23
23
|
<body>
|
24
24
|
<div class='title'>
|
25
|
-
<h1> Heroku Bartender
|
25
|
+
<h1> Heroku Bartender</h1>
|
26
26
|
</div>
|
27
|
-
<
|
27
|
+
<div>
|
28
|
+
<ul>
|
29
|
+
<li><a href="#<%= current_version %>">
|
28
30
|
Current version status: <%= state(status) %>
|
29
|
-
|
31
|
+
</a></li>
|
32
|
+
<li>Remote: <b><%= target %></b></li>
|
33
|
+
<li>Pre-deploy: <b><%= predeploy %></b></li>
|
34
|
+
</ul>
|
35
|
+
</div>
|
30
36
|
<div class="site">
|
31
37
|
<div id="home">
|
32
38
|
<ul class="posts">
|
@@ -46,10 +52,15 @@
|
|
46
52
|
<strong> Deployed date </strong>
|
47
53
|
<%= deployed_versions[commit.sha][0] %>
|
48
54
|
</p>
|
55
|
+
<div>
|
56
|
+
<small>
|
57
|
+
<%= deployed_versions[commit.sha][2] %>
|
58
|
+
</small>
|
59
|
+
</div>
|
49
60
|
<% end %>
|
50
61
|
<form method="POST">
|
51
62
|
<input type="hidden" value="<%= commit.sha %>" name="sha"/>
|
52
|
-
<input type="submit" value="
|
63
|
+
<input type="submit" value="Deploy"/>
|
53
64
|
</form>
|
54
65
|
|
55
66
|
</li>
|
@@ -64,7 +75,7 @@
|
|
64
75
|
Unknown: No deployed version, or problems contacting heroku
|
65
76
|
</div>
|
66
77
|
<div class="red">
|
67
|
-
Fail: The deploy
|
78
|
+
Fail: The deploy went wrong
|
68
79
|
</div>
|
69
80
|
</div>
|
70
81
|
</div>
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: heroku-bartender
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.3.
|
5
|
+
version: 0.3.1
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Sebastian Arcila-Valenzuela
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2011-
|
13
|
+
date: 2011-04-11 00:00:00 -05:00
|
14
14
|
default_executable:
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
@@ -71,7 +71,9 @@ files:
|
|
71
71
|
- LICENSE
|
72
72
|
- lib/heroku/bartender/command.rb
|
73
73
|
- lib/heroku/bartender/commit.rb
|
74
|
+
- lib/heroku/bartender/config.rb
|
74
75
|
- lib/heroku/bartender/log.rb
|
76
|
+
- lib/heroku/bartender/public/favicon.ico
|
75
77
|
- lib/heroku/bartender/server.rb
|
76
78
|
- lib/heroku/bartender/version.rb
|
77
79
|
- lib/heroku/bartender/views/template.erb
|