heroku-platform-helper 0.1.0 → 0.2.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.
- checksums.yaml +4 -4
- data/README.md +7 -0
- data/bin/console +1 -1
- data/heroku-platform-helper.gemspec +3 -1
- data/lib/heroku_helper/app.rb +73 -26
- data/lib/heroku_helper/version.rb +1 -1
- metadata +33 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 83e32fac0eb8a96b0ad8acbcf4b9581df7db222e
|
4
|
+
data.tar.gz: ab01b84a9ace7218870af8f766cf75bc2c98f34a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 869ae7db97425435211e818df97de7ce7576bc5a55dd8cb3c8d0fc035234c200dcd0ffe711308fa453c32de39935402447a0a51232e34f7b916facb8c29fcbf9
|
7
|
+
data.tar.gz: e24bb9446d8842e4a49c3029d7ef60f399796212ac1a69d24810f7c2a8e004e175c2d9c855166a91c86e4b370bd9bd5622449c883b0c2ec95b30019855bb2279
|
data/README.md
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
# HerokuHelper
|
2
2
|
|
3
3
|
[](https://badge.fury.io/rb/heroku-platform-helper)
|
4
|
+
[](https://codeclimate.com/github/perobertson/heroku-platform-helper)
|
5
|
+
[](https://codeclimate.com/github/perobertson/heroku-platform-helper/coverage)
|
4
6
|
|
5
7
|
Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/heroku_helper`. To experiment with that code, run `bin/console` for an interactive prompt.
|
6
8
|
|
@@ -24,6 +26,11 @@ Or install it yourself as:
|
|
24
26
|
|
25
27
|
## Usage
|
26
28
|
|
29
|
+
Log output can be customized by setting the logger:
|
30
|
+
```ruby
|
31
|
+
HerokuHelper.logger = Logger.new(STDOUT)
|
32
|
+
```
|
33
|
+
|
27
34
|
TODO: Write usage instructions here
|
28
35
|
|
29
36
|
## Development
|
data/bin/console
CHANGED
@@ -21,8 +21,10 @@ Gem::Specification.new do |spec|
|
|
21
21
|
spec.add_development_dependency 'bundler', '~> 1.10'
|
22
22
|
spec.add_development_dependency 'rake', '~> 10.0'
|
23
23
|
spec.add_development_dependency 'rspec'
|
24
|
+
spec.add_development_dependency 'codeclimate-test-reporter'
|
25
|
+
spec.add_development_dependency 'byebug'
|
24
26
|
|
25
27
|
spec.add_dependency 'platform-api', '~> 0.3'
|
26
28
|
spec.add_dependency 'rendezvous', '~> 0.1'
|
27
|
-
spec.add_dependency '
|
29
|
+
spec.add_dependency 'git', '>= 1.2.6'
|
28
30
|
end
|
data/lib/heroku_helper/app.rb
CHANGED
@@ -1,9 +1,36 @@
|
|
1
|
+
require 'logger'
|
2
|
+
require 'git'
|
1
3
|
require 'platform-api'
|
2
4
|
require 'rendezvous'
|
3
|
-
require 'colorize'
|
4
5
|
|
5
6
|
module HerokuHelper
|
7
|
+
class << self
|
8
|
+
attr_writer :logger
|
9
|
+
|
10
|
+
def logger
|
11
|
+
@logger ||= Logger.new(STDOUT).tap do |log|
|
12
|
+
log.progname = self.name
|
13
|
+
case ENV['LOG_LEVEL']
|
14
|
+
when 'unknown'
|
15
|
+
log.level = Logger::UNKNOWN
|
16
|
+
when 'fatal'
|
17
|
+
log.level = Logger::FATAL
|
18
|
+
when 'error'
|
19
|
+
log.level = Logger::ERROR
|
20
|
+
when 'warn'
|
21
|
+
log.level = Logger::WARN
|
22
|
+
when 'info'
|
23
|
+
log.level = Logger::INFO
|
24
|
+
else
|
25
|
+
log.level = Logger::DEBUG
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
6
31
|
class App
|
32
|
+
attr_reader :app_name
|
33
|
+
|
7
34
|
def initialize(api_key, app_name)
|
8
35
|
@api_key = api_key
|
9
36
|
@app_name = app_name
|
@@ -14,35 +41,50 @@ module HerokuHelper
|
|
14
41
|
heroku = PlatformAPI.connect_oauth @api_key
|
15
42
|
|
16
43
|
git_url = heroku.app.info(@app_name)['git_url']
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
fail "Could not add #{remote} remote #{git_url}"
|
44
|
+
if git_url
|
45
|
+
HerokuHelper.logger.info "Heroku repo: #{git_url}"
|
46
|
+
else
|
47
|
+
HerokuHelper.logger.error 'Cannot determine git url'
|
48
|
+
return false
|
23
49
|
end
|
24
|
-
|
25
|
-
|
50
|
+
|
51
|
+
# Set up git to deploy
|
52
|
+
begin
|
53
|
+
git = Git.open('.', log: HerokuHelper.logger)
|
54
|
+
git.config('url.ssh://git@heroku.com/.insteadOf', 'https://git.heroku.com/')
|
55
|
+
|
56
|
+
remotes = git.remotes.map &:name
|
57
|
+
if remotes.include? remote
|
58
|
+
HerokuHelper.logger.info "Resetting remote: #{remote}"
|
59
|
+
git.remove_remote remote
|
60
|
+
end
|
61
|
+
|
62
|
+
git.add_remote remote, git_url, fetch: true, track: 'master'
|
63
|
+
rescue => e
|
64
|
+
HerokuHelper.logger.error "Could not set up git correctly. Error: #{e}"
|
65
|
+
return false
|
26
66
|
end
|
27
67
|
|
28
68
|
scale worker: 0, clock: 0
|
29
69
|
maintenance(true) if enable_maintenance
|
30
70
|
|
31
|
-
|
32
|
-
fail "Failed to push branch(#{branch}) to remote(#{remote})"
|
33
|
-
end
|
71
|
+
git.push remote, "#{branch}:master"
|
34
72
|
|
35
73
|
migrate
|
36
74
|
maintenance(false) if enable_maintenance
|
37
75
|
scale worker: worker, clock: clock
|
76
|
+
HerokuHelper.logger.info "Deployed #{@app_name}"
|
77
|
+
true
|
78
|
+
rescue => e
|
79
|
+
HerokuHelper.logger.error "FAILED TO DEPLOY! Your app is in a bad state and needs to be fixed manually. Error: #{e}"
|
38
80
|
end
|
39
81
|
|
40
82
|
def maintenance(enabled)
|
41
83
|
heroku = PlatformAPI.connect_oauth @api_key
|
42
84
|
if enabled
|
43
|
-
|
85
|
+
HerokuHelper.logger.info "Enabling maintenance for #{@app_name}"
|
44
86
|
else
|
45
|
-
|
87
|
+
HerokuHelper.logger.info "Disabling maintenance for #{@app_name}"
|
46
88
|
end
|
47
89
|
heroku.app.update(@app_name, maintenance: enabled)
|
48
90
|
end
|
@@ -56,11 +98,11 @@ module HerokuHelper
|
|
56
98
|
response = heroku.dyno.create(@app_name, payload)
|
57
99
|
|
58
100
|
begin
|
59
|
-
|
101
|
+
HerokuHelper.logger.info 'Running migrations'
|
60
102
|
# set an activity timeout so it doesn't block forever
|
61
103
|
Rendezvous.start(url: response['attach_url'], activity_timeout: 600)
|
62
104
|
rescue => e
|
63
|
-
|
105
|
+
HerokuHelper.logger.error("Error capturing output for dyno\n#{e.message}")
|
64
106
|
end
|
65
107
|
end
|
66
108
|
|
@@ -71,7 +113,9 @@ module HerokuHelper
|
|
71
113
|
updates: []
|
72
114
|
}
|
73
115
|
|
74
|
-
|
116
|
+
heroku_formation = heroku.formation
|
117
|
+
|
118
|
+
formations = heroku_formation.list(@app_name)
|
75
119
|
formations.each do |formation|
|
76
120
|
size = formation['size']
|
77
121
|
if !worker.nil? && formation['type'] == 'worker'
|
@@ -81,9 +125,9 @@ module HerokuHelper
|
|
81
125
|
quantity: worker,
|
82
126
|
size: size
|
83
127
|
}
|
84
|
-
|
128
|
+
HerokuHelper.logger.info "Scaling worker to #{worker}"
|
85
129
|
else
|
86
|
-
|
130
|
+
HerokuHelper.logger.warn "Worker is already scaled to #{worker}"
|
87
131
|
end
|
88
132
|
elsif !clock.nil? && formation['type'] == 'clock'
|
89
133
|
if formation['quantity'] != clock
|
@@ -92,26 +136,26 @@ module HerokuHelper
|
|
92
136
|
quantity: clock,
|
93
137
|
size: size
|
94
138
|
}
|
95
|
-
|
139
|
+
HerokuHelper.logger.info "Scaling clock to #{clock}"
|
96
140
|
else
|
97
|
-
|
141
|
+
HerokuHelper.logger.warn "Clock is already scaled to #{clock}"
|
98
142
|
end
|
99
143
|
end
|
100
144
|
end
|
101
145
|
|
102
146
|
if payload[:updates].empty?
|
103
|
-
|
147
|
+
HerokuHelper.logger.warn 'Nothing to scale. Please check your configurations'
|
104
148
|
else
|
105
149
|
if payload[:updates].map { |u| u[:size] }.uniq.include? 'Free'
|
106
|
-
|
150
|
+
HerokuHelper.logger.warn 'You can only run 2 dynos on the free tier'
|
107
151
|
updates = payload[:updates].sort { |a, b| a[:quantity] <=> b[:quantity] }
|
108
152
|
updates.each do |update|
|
109
153
|
type = update[:process]
|
110
154
|
quantity = update[:quantity]
|
111
|
-
|
155
|
+
heroku_formation.update(@app_name, type, quantity: quantity)
|
112
156
|
end
|
113
157
|
else
|
114
|
-
|
158
|
+
heroku_formation.batch_update(@app_name, payload)
|
115
159
|
end
|
116
160
|
end
|
117
161
|
end
|
@@ -119,12 +163,15 @@ module HerokuHelper
|
|
119
163
|
def restart
|
120
164
|
heroku = PlatformAPI.connect_oauth @api_key
|
121
165
|
heroku.dyno.restart_all @app_name
|
166
|
+
HerokuHelper.logger.info "#{app_name} restarted"
|
122
167
|
end
|
123
168
|
|
124
169
|
def version
|
125
170
|
heroku = PlatformAPI.connect_oauth @api_key
|
126
171
|
build = heroku.build.list(@app_name).last
|
127
|
-
build['source_blob']['version']
|
172
|
+
build['source_blob']['version'].tap do |version|
|
173
|
+
HerokuHelper.logger.info "#{@app_name}::version #{version}"
|
174
|
+
end
|
128
175
|
end
|
129
176
|
end
|
130
177
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: heroku-platform-helper
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Paul Robertson
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-01-
|
11
|
+
date: 2016-01-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -52,6 +52,34 @@ dependencies:
|
|
52
52
|
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: codeclimate-test-reporter
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: byebug
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
55
83
|
- !ruby/object:Gem::Dependency
|
56
84
|
name: platform-api
|
57
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -81,19 +109,19 @@ dependencies:
|
|
81
109
|
- !ruby/object:Gem::Version
|
82
110
|
version: '0.1'
|
83
111
|
- !ruby/object:Gem::Dependency
|
84
|
-
name:
|
112
|
+
name: git
|
85
113
|
requirement: !ruby/object:Gem::Requirement
|
86
114
|
requirements:
|
87
115
|
- - ">="
|
88
116
|
- !ruby/object:Gem::Version
|
89
|
-
version:
|
117
|
+
version: 1.2.6
|
90
118
|
type: :runtime
|
91
119
|
prerelease: false
|
92
120
|
version_requirements: !ruby/object:Gem::Requirement
|
93
121
|
requirements:
|
94
122
|
- - ">="
|
95
123
|
- !ruby/object:Gem::Version
|
96
|
-
version:
|
124
|
+
version: 1.2.6
|
97
125
|
description:
|
98
126
|
email:
|
99
127
|
- t.paulrobertson@gmail.com
|