lib/potassium/recipes/heroku.rb in potassium-6.1.0 vs lib/potassium/recipes/heroku.rb in potassium-6.2.0

- old
+ new

@@ -1,23 +1,19 @@ class Recipes::Heroku < Rails::AppBuilder NAME_PREFIX = 'pl' + ENVIRONMENTS = ['staging', 'production'] + HEROKU_NAMES_MAX_CHARS = 30 - attr_accessor :app_name_staging - - def initialize(args) - super(args) - set(:heroku_app_name_staging, app_name_for('staging')) - set(:heroku_app_name_production, app_name_for('production')) - end - def ask heroku = answer(:heroku) do Ask.confirm("Are you going to deploy to heroku? (#{who_am_i})") end if heroku set(:heroku, heroku) + + ENVIRONMENTS.each { |environment| set_app_name_for(environment) } end end def create add_heroku if get(:heroku) @@ -45,35 +41,38 @@ run 'chmod a+x bin/release' template "../assets/bin/setup_heroku.erb", "bin/setup_heroku", force: true run "chmod a+x bin/setup_heroku" - if logged_in? - %w(staging production).each do |environment| - create_app_on_heroku(environment) - end - puts "Remember to connect the github repository to the new pipeline" - open_pipeline_command = "\e[33mheroku pipelines:open #{heroku_pipeline_name}\e[0m" - puts "run #{open_pipeline_command} to open the dashboard" - else - puts "You are not logged in into heroku" - login_command = "\e[33mheroku login\e[0m" - puts "Run #{login_command} and enter your credentials" - puts "You can install the heroku recipe again create the app in heroku" - install_command = "\e[33mpostassium install heroku --force\e[0m" - puts "Just run #{install_command}" - end + logged_in? ? create_apps : puts_not_logged_in_msg add_readme_header :deployment end + def create_apps + ENVIRONMENTS.each { |environment| create_app_on_heroku(environment) } + puts "Remember to connect the github repository to the new pipeline" + open_pipeline_command = "\e[33mheroku pipelines:open #{heroku_pipeline_name}\e[0m" + puts "run #{open_pipeline_command} to open the dashboard" + end + + def puts_not_logged_in_msg + puts "You are not logged in into heroku" + login_command = "\e[33mheroku login\e[0m" + puts "Run #{login_command} and enter your credentials" + puts "You can install the heroku recipe again to create the app in heroku" + install_command = "\e[33mpostassium install heroku --force\e[0m" + puts "Just run #{install_command}" + end + def heroku_pipeline_name - app_name.dasherize + @heroku_pipeline_name ||= valid_heroku_name(app_name.dasherize, 'pipeline', false) end - def app_name_for(environment) - "#{NAME_PREFIX}-#{app_name.dasherize}-#{environment}" + def set_app_name_for(environment) + default_name = "#{NAME_PREFIX}-#{app_name.dasherize}-#{environment}" + set("heroku_app_name_#{environment}".to_sym, valid_heroku_name(default_name, environment)) end def logged_in? !who_am_i.include? "not logged in" end @@ -82,11 +81,11 @@ `heroku auth:whoami`.strip end def create_app_on_heroku(environment) rack_env = "RACK_ENV=production" - staged_app_name = app_name_for(environment) + staged_app_name = get("heroku_app_name_#{environment}".to_sym) run_toolbelt_command "create #{staged_app_name} --remote #{environment}" run_toolbelt_command "labs:enable runtime-dyno-metadata", staged_app_name run_toolbelt_command "config:add HEROKU_APP_NAME=#{staged_app_name}", staged_app_name run_toolbelt_command "config:add #{rack_env}", staged_app_name @@ -97,18 +96,18 @@ end def set_rails_secrets(environment) run_toolbelt_command( "config:add SECRET_KEY_BASE=#{generate_secret}", - app_name_for(environment) + get("heroku_app_name_#{environment}".to_sym) ) end def set_app_multi_buildpack(environment) run_toolbelt_command( "buildpacks:set https://github.com/heroku/heroku-buildpack-multi.git", - app_name_for(environment) + get("heroku_app_name_#{environment}".to_sym) ) end def add_app_to_pipeline(app_env_name, environment) pipeline = `heroku pipelines:info \ @@ -130,7 +129,21 @@ if app_env_name.nil? `heroku #{command}` else `heroku #{command} --app #{app_env_name}` end + end + + def valid_heroku_name(name, element, force_suffix = true) + suffix = "-#{element}" + while name.length > HEROKU_NAMES_MAX_CHARS + puts "Heroku names must be shorter than #{HEROKU_NAMES_MAX_CHARS} chars." + if force_suffix + puts "Potassium uses the heroku-stage gem, because of that '#{suffix}' will be "\ + "added to your app name. The suffix, #{suffix}, counts towards the app name length." + end + name = Ask.input("Please enter a valid name for #{element}:") + name += suffix if force_suffix && !name.end_with?(suffix) + end + name end end