class Fanforce::AppFactory::CLI::Heroku include Fanforce::AppFactory::CLI::Utils attr_reader :app require_gem 'heroku-api', 'heroku-api' def initialize(app) @app = app end def heroku(environment) @heroku ||= {} @heroku[environment] ||= Heroku::API.new(:username => config[:heroku][environment][:user], :password => config[:heroku][environment][:password]) rescue Exception => e #raise "Heroku user #{config[:heroku][environment][:user]} does not seem to exist: #{e.message}" if e.response.status == 404 raise end def setup(environment) environment = environment.to_sym return puts "OOPS... #{environment.to_s.upcase}".format(:red,:bold) + ' has not been setup for Heroku' if config[:heroku].blank? or config[:heroku][environment].blank? heroku = heroku(environment) heroku_app_name = app_name(environment) begin heroku.get_app(heroku_app_name) puts "#{'Found '.format(:green,:bold)}" + "#{environment} app on heroku (#{heroku_app_name})" rescue heroku.post_app(name: heroku_app_name) puts "#{'Created '.format(:green,:bold)}" + "#{environment} on heroku (#{heroku_app_name})" end # Setup standard app domain domain = "#{app._id}.#{Fanforce::Base::DomainEnvironments.method(environment).call[:apps_base]}" domain_found = heroku.get_domains(heroku_app_name).body.inject(false) {|result, d| d['domain'] == domain ? (break true) : false } if domain_found puts "#{'Found '.format(:green,:bold)}" + "#{domain} domain on #{environment}" else heroku.post_domain(heroku_app_name, domain) puts "#{'Added '.format(:green,:bold)}" + "#{domain} domain to #{environment}" end # Setup default short domain domain = "#{app._id}.#{Fanforce::Base::DomainEnvironments.method(environment).call[:default_short_domain]}" domain_found = heroku.get_domains(heroku_app_name).body.inject(false) {|result, d| d['domain'] == domain ? (break true) : false } if domain_found puts "#{'Found '.format(:green,:bold)}" + "#{domain} domain on #{environment}" else heroku.post_domain(heroku_app_name, domain) puts "#{'Added '.format(:green,:bold)}" + "#{domain} domain to #{environment}" end remote_name = "#{env(environment)}-heroku" if (`git remote`).split(/\r?\n/).include?(remote_name) puts "#{'Updated '.format(:green,:bold)}" + "git remote for #{remote_name}" `git remote rm #{remote_name}` else puts "#{'Created '.format(:green,:bold)}" + "git remote for #{remote_name}" end `git remote add #{remote_name} git@#{config[:heroku][environment][:git_ssh_domain] || 'heroku.com'}:#{heroku_app_name}.git` end def update_config(environment, vars) heroku(environment).put_config_vars(app_name(environment), vars) if vars end def env(environment) case environment when :staging then env = :stg when :production then env = :prd end end def app_name(environment) environment = environment.to_sym raise 'unknown environment' if ![:production, :staging].include?(environment) heroku_app_name = "#{env(environment)}-#{app.dir_name}" heroku_app_name.length > 30 ? heroku_app_name.gsub!(/(a|e|i|o|u)/, '') : heroku_app_name end end