heroku-platform-helper 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
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