lib/honeybadger/cli/heroku.rb in honeybadger-5.0.2 vs lib/honeybadger/cli/heroku.rb in honeybadger-5.1.0

- old
+ new

@@ -1,129 +1,129 @@ -module Honeybadger - module CLI - class Heroku < Thor - class_option :app, aliases: :'-a', type: :string, default: nil, desc: 'Specify optional Heroku APP' - - desc 'install_deploy_notification', 'Install Heroku deploy notifications addon' - option :api_key, aliases: :'-k', type: :string, desc: 'Api key of your Honeybadger application' - option :environment, aliases: :'-e', type: :string, desc: 'Environment of your Heroku application (i.e. "production", "staging")' - def install_deploy_notification - app = options.has_key?('app') ? options['app'] : detect_heroku_app(false) - rails_env = options['environment'] || heroku_var('RAILS_ENV', app) - api_key = options['api_key'] || heroku_var('HONEYBADGER_API_KEY', app) - - unless api_key =~ /\S/ - say("Unable to detect your API key from Heroku.", :red) - say('Have you configured multiple Heroku apps? Try using --app APP', :red) unless app - exit(1) - end - - unless rails_env =~ /\S/ - say("Unable to detect your environment from Heroku. Use --environment ENVIRONMENT.", :red) - say('Have you configured multiple Heroku apps? Try using --app APP', :red) unless app - exit(1) - end - - cmd = %Q(heroku webhooks:add -i api:release -l notify -u "https://api.honeybadger.io/v1/deploys/heroku?environment=#{rails_env}&api_key=#{api_key}"#{app ? " --app #{app}" : ''}) - - say("Running: `#{cmd}`") - say(run(cmd)) - end - - desc 'install API_KEY', 'Install Honeybadger on Heroku using API_KEY' - def install(api_key) - say("Installing Honeybadger #{VERSION} for Heroku") - - app = options[:app] || detect_heroku_app(false) - say("Adding config HONEYBADGER_API_KEY=#{api_key} to Heroku.", :magenta) - unless write_heroku_env({'HONEYBADGER_API_KEY' => api_key}, app) - say('Unable to update heroku config. You may need to specify an app name with --app APP', :red) - exit(1) - end - - if env = heroku_var('RAILS_ENV', app, heroku_var('RACK_ENV', app)) - say('Installing deploy notification addon', :magenta) - invoke :install_deploy_notification, [], { app: app, api_key: api_key, environment: env } - else - say('Skipping deploy notification installation: we were unable to determine the environment name from your Heroku app.', :yellow) - say("To install manually, try `honeybadger heroku install_deploy_notification#{app ? " -a #{app}" : ""} -k #{api_key} --environment ENVIRONMENT`", :yellow) - end - - say("Installation complete. Happy 'badgering!", :green) - end - - private - - # Detects the Heroku app name from GIT. - # - # @param [Boolean] prompt_on_default If a single remote is discoverd, - # should we prompt the user before returning it? - # - # Returns the String app name if detected, otherwise nil. - def detect_heroku_app(prompt_on_default = true) - apps, git_config = {}, File.join(Dir.pwd, '.git', 'config') - if File.exist?(git_config) - require 'inifile' - ini = IniFile.load(git_config) - ini.each_section do |section| - if match = section.match(/remote \"(?<remote>.+)\"/) - url = ini[section]['url'] - if url_match = url.match(/heroku\.com:(?<app>.+)\.git$/) - apps[match[:remote]] = url_match[:app] - end - end - end - - if apps.size == 1 - if !prompt_on_default - apps.values.first - else - say "We detected a Heroku app named #{apps.values.first}. Do you want to load the config? (y/yes or n/no)" - if STDIN.gets.chomp =~ /(y|yes)/i - apps.values.first - end - end - elsif apps.size > 1 - say "We detected the following Heroku apps:" - apps.each_with_index {|a,i| say "\s\s#{i+1}. #{a[1]}" } - say "\s\s#{apps.size+1}. Use default" - say "Please select an option (1-#{apps.size+1}):" - apps.values[STDIN.gets.chomp.to_i-1] - end - end - end - - def run(cmd) - Bundler.with_unbundled_env { `#{cmd}` } - end - - def heroku_var(var, app_name, default = nil) - app = app_name ? "--app #{app_name}" : '' - result = run("heroku config:get #{var} #{app} 2> /dev/null").strip - result.split.find(lambda { default }) {|x| x =~ /\S/ } - end - - def read_heroku_env(app = nil) - cmd = ['heroku config'] - cmd << "--app #{app}" if app - output = run(cmd.join("\s")) - return false unless $?.to_i == 0 - Hash[output.scan(/(HONEYBADGER_[^:]+):\s*(\S.*)\s*$/)] - end - - def set_env_from_heroku(app = nil) - return false unless env = read_heroku_env(app) - env.each_pair do |k,v| - ENV[k] ||= v - end - end - - def write_heroku_env(env, app = nil) - cmd = ["heroku config:set"] - Hash(env).each_pair {|k,v| cmd << "#{k}=#{v}" } - cmd << "--app #{app}" if app - run(cmd.join("\s")) - $?.to_i == 0 - end - end - end -end +module Honeybadger + module CLI + class Heroku < Thor + class_option :app, aliases: :'-a', type: :string, default: nil, desc: 'Specify optional Heroku APP' + + desc 'install_deploy_notification', 'Install Heroku deploy notifications addon' + option :api_key, aliases: :'-k', type: :string, desc: 'Api key of your Honeybadger application' + option :environment, aliases: :'-e', type: :string, desc: 'Environment of your Heroku application (i.e. "production", "staging")' + def install_deploy_notification + app = options.has_key?('app') ? options['app'] : detect_heroku_app(false) + rails_env = options['environment'] || heroku_var('RAILS_ENV', app) + api_key = options['api_key'] || heroku_var('HONEYBADGER_API_KEY', app) + + unless api_key =~ /\S/ + say("Unable to detect your API key from Heroku.", :red) + say('Have you configured multiple Heroku apps? Try using --app APP', :red) unless app + exit(1) + end + + unless rails_env =~ /\S/ + say("Unable to detect your environment from Heroku. Use --environment ENVIRONMENT.", :red) + say('Have you configured multiple Heroku apps? Try using --app APP', :red) unless app + exit(1) + end + + cmd = %Q(heroku webhooks:add -i api:release -l notify -u "https://api.honeybadger.io/v1/deploys/heroku?environment=#{rails_env}&api_key=#{api_key}"#{app ? " --app #{app}" : ''}) + + say("Running: `#{cmd}`") + say(run(cmd)) + end + + desc 'install API_KEY', 'Install Honeybadger on Heroku using API_KEY' + def install(api_key) + say("Installing Honeybadger #{VERSION} for Heroku") + + app = options[:app] || detect_heroku_app(false) + say("Adding config HONEYBADGER_API_KEY=#{api_key} to Heroku.", :magenta) + unless write_heroku_env({'HONEYBADGER_API_KEY' => api_key}, app) + say('Unable to update heroku config. You may need to specify an app name with --app APP', :red) + exit(1) + end + + if env = heroku_var('RAILS_ENV', app, heroku_var('RACK_ENV', app)) + say('Installing deploy notification addon', :magenta) + invoke :install_deploy_notification, [], { app: app, api_key: api_key, environment: env } + else + say('Skipping deploy notification installation: we were unable to determine the environment name from your Heroku app.', :yellow) + say("To install manually, try `honeybadger heroku install_deploy_notification#{app ? " -a #{app}" : ""} -k #{api_key} --environment ENVIRONMENT`", :yellow) + end + + say("Installation complete. Happy 'badgering!", :green) + end + + private + + # Detects the Heroku app name from GIT. + # + # @param [Boolean] prompt_on_default If a single remote is discoverd, + # should we prompt the user before returning it? + # + # Returns the String app name if detected, otherwise nil. + def detect_heroku_app(prompt_on_default = true) + apps, git_config = {}, File.join(Dir.pwd, '.git', 'config') + if File.exist?(git_config) + require 'inifile' + ini = IniFile.load(git_config) + ini.each_section do |section| + if match = section.match(/remote \"(?<remote>.+)\"/) + url = ini[section]['url'] + if url_match = url.match(/heroku\.com:(?<app>.+)\.git$/) + apps[match[:remote]] = url_match[:app] + end + end + end + + if apps.size == 1 + if !prompt_on_default + apps.values.first + else + say "We detected a Heroku app named #{apps.values.first}. Do you want to load the config? (y/yes or n/no)" + if STDIN.gets.chomp =~ /(y|yes)/i + apps.values.first + end + end + elsif apps.size > 1 + say "We detected the following Heroku apps:" + apps.each_with_index {|a,i| say "\s\s#{i+1}. #{a[1]}" } + say "\s\s#{apps.size+1}. Use default" + say "Please select an option (1-#{apps.size+1}):" + apps.values[STDIN.gets.chomp.to_i-1] + end + end + end + + def run(cmd) + Bundler.with_unbundled_env { `#{cmd}` } + end + + def heroku_var(var, app_name, default = nil) + app = app_name ? "--app #{app_name}" : '' + result = run("heroku config:get #{var} #{app} 2> /dev/null").strip + result.split.find(lambda { default }) {|x| x =~ /\S/ } + end + + def read_heroku_env(app = nil) + cmd = ['heroku config'] + cmd << "--app #{app}" if app + output = run(cmd.join("\s")) + return false unless $?.to_i == 0 + Hash[output.scan(/(HONEYBADGER_[^:]+):\s*(\S.*)\s*$/)] + end + + def set_env_from_heroku(app = nil) + return false unless env = read_heroku_env(app) + env.each_pair do |k,v| + ENV[k] ||= v + end + end + + def write_heroku_env(env, app = nil) + cmd = ["heroku config:set"] + Hash(env).each_pair {|k,v| cmd << "#{k}=#{v}" } + cmd << "--app #{app}" if app + run(cmd.join("\s")) + $?.to_i == 0 + end + end + end +end