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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9998684f8dfcc820a08844df7247679237cfd3ce
4
- data.tar.gz: 70a92edbd2b05be2b47312e5d1ab311aebe820b6
3
+ metadata.gz: 83e32fac0eb8a96b0ad8acbcf4b9581df7db222e
4
+ data.tar.gz: ab01b84a9ace7218870af8f766cf75bc2c98f34a
5
5
  SHA512:
6
- metadata.gz: 41c2b6de7a1a06a0eb2f3219a0a89eb291d480453333638ab446219d03e75325636815e1f0235a7a8705e387314bac3cd9e1af88e2b64b87ef8ec521a00244ae
7
- data.tar.gz: a155379dc080d5d8b0795a0d21fa23f892b71beb4a10bb6e4312dfcf6af6f33bec7d4712ee430c09778e9ef22c2872791172ef6fb854de08fc3ef25c9b5621a5
6
+ metadata.gz: 869ae7db97425435211e818df97de7ce7576bc5a55dd8cb3c8d0fc035234c200dcd0ffe711308fa453c32de39935402447a0a51232e34f7b916facb8c29fcbf9
7
+ data.tar.gz: e24bb9446d8842e4a49c3029d7ef60f399796212ac1a69d24810f7c2a8e004e175c2d9c855166a91c86e4b370bd9bd5622449c883b0c2ec95b30019855bb2279
data/README.md CHANGED
@@ -1,6 +1,8 @@
1
1
  # HerokuHelper
2
2
 
3
3
  [![Gem Version](https://badge.fury.io/rb/heroku-platform-helper.svg)](https://badge.fury.io/rb/heroku-platform-helper)
4
+ [![Code Climate](https://codeclimate.com/github/perobertson/heroku-platform-helper/badges/gpa.svg)](https://codeclimate.com/github/perobertson/heroku-platform-helper)
5
+ [![Test Coverage](https://codeclimate.com/github/perobertson/heroku-platform-helper/badges/coverage.svg)](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
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
3
  require "bundler/setup"
4
- require "heroku/helper"
4
+ require "heroku_helper"
5
5
 
6
6
  # You can add fixtures and/or initialization code here to make experimenting
7
7
  # with your gem easier. You can also use a different console, if you like.
@@ -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 'colorize'
29
+ spec.add_dependency 'git', '>= 1.2.6'
28
30
  end
@@ -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
- fail 'Cannot determine git url' if git_url.blank?
18
-
19
- # Fetch whats currently deployed
20
- system "[ \"$(git remote | grep -e ^#{remote})\" != '' ] && git remote rm #{remote}"
21
- unless system "git remote add #{remote} #{git_url}"
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
- unless system "git fetch #{remote} master"
25
- fail "Could not fetch master from #{remote}"
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
- unless system "git push #{remote} #{branch}:master"
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
- puts "Enabling maintenance for #{@app_name}".cyan
85
+ HerokuHelper.logger.info "Enabling maintenance for #{@app_name}"
44
86
  else
45
- puts "Disabling maintenance for #{@app_name}".cyan
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
- puts 'Running migrations'.cyan
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
- log.error("Error capturing output for dyno\n#{e.message}")
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
- formations = heroku.formation.list(@app_name)
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
- puts "Scaling worker to #{worker}".cyan
128
+ HerokuHelper.logger.info "Scaling worker to #{worker}"
85
129
  else
86
- puts "Worker is already scaled to #{worker}".yellow
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
- puts "Scaling clock to #{clock}".cyan
139
+ HerokuHelper.logger.info "Scaling clock to #{clock}"
96
140
  else
97
- puts "Clock is already scaled to #{clock}".yellow
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
- puts 'Warning: nothing to scale. Please check your configurations'.yellow
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
- puts 'Warning: you can only run 2 dynos on the free tier'.yellow
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
- heroku.formation.update(@app_name, type, quantity: quantity)
155
+ heroku_formation.update(@app_name, type, quantity: quantity)
112
156
  end
113
157
  else
114
- heroku.formation.batch_update(@app_name, payload)
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
@@ -1,3 +1,3 @@
1
1
  module HerokuHelper
2
- VERSION = '0.1.0'
2
+ VERSION = '0.2.0'
3
3
  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.1.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-13 00:00:00.000000000 Z
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: colorize
112
+ name: git
85
113
  requirement: !ruby/object:Gem::Requirement
86
114
  requirements:
87
115
  - - ">="
88
116
  - !ruby/object:Gem::Version
89
- version: '0'
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: '0'
124
+ version: 1.2.6
97
125
  description:
98
126
  email:
99
127
  - t.paulrobertson@gmail.com