From f2b3e0e0068b0724ad44efac973e4bf67bfc4000 Mon Sep 17 00:00:00 2001 From: Agustin Gomez Date: Fri, 19 Feb 2021 13:51:21 -0300 Subject: [PATCH] feat(heroku): validate names in heroku recipe do not exceed the name limit set by heroku --- lib/potassium/recipes/heroku.rb | 65 ++++++++++++++++++--------------- 1 file changed, 36 insertions(+), 29 deletions(-) diff --git a/lib/potassium/recipes/heroku.rb b/lib/potassium/recipes/heroku.rb index f5ab3872..7de75e20 100644 --- a/lib/potassium/recipes/heroku.rb +++ b/lib/potassium/recipes/heroku.rb @@ -1,13 +1,7 @@ class Recipes::Heroku < Rails::AppBuilder NAME_PREFIX = 'pl' - - 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 + ENVIRONMENTS = ['staging', 'production'] + HEROKU_NAMES_MAX_CHARS = 30 def ask heroku = answer(:heroku) do @@ -16,6 +10,8 @@ def ask if heroku set(:heroku, heroku) + + ENVIRONMENTS.each { |environment| set_app_name_for(environment) } end end @@ -47,31 +43,34 @@ def add_heroku 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') 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? @@ -84,7 +83,7 @@ def who_am_i 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 @@ -99,14 +98,14 @@ def create_app_on_heroku(environment) 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 @@ -133,4 +132,12 @@ def run_toolbelt_command(command, app_env_name = nil) `heroku #{command} --app #{app_env_name}` end end + + def valid_heroku_name(name, element) + while name.length > HEROKU_NAMES_MAX_CHARS + puts "Heroku names must be shorter than #{HEROKU_NAMES_MAX_CHARS} chars." + name = Ask.input("Please enter a valid name for #{element}:") + end + name + end end