class FoundersTemplate::CLI
Public Instance Methods
check()
click to toggle source
# File lib/founders_template/cli.rb, line 36 def check return if REQUIRED_SYSTEM_TOOLS.all? { |command| check_command(command) } error 'Some dependencies were missing, please check the README for instructions.' exit 1 end
ci(script_name, *args)
click to toggle source
# File lib/founders_template/cli.rb, line 28 def ci(script_name, *args) script_name = Shellwords.escape(script_name) file_path = File.join(SCRIPT_PATH, 'ci', "#{script_name}.sh") exec '/usr/bin/env', 'bash', file_path, *args end
install()
click to toggle source
# File lib/founders_template/cli.rb, line 44 def install check ensure_application_config ensure_aws_credentials ensure_credentials_key ensure_secret_key ensure_github_oauth_token template 'buildspec.yml.erb', 'buildspec.yml' template 'dockerignore.erb', '.dockerignore' template 'docker-compose.ci.yml.erb', 'docker-compose.ci.yml' template 'docker-compose.yml.erb', 'docker-compose.yml' template 'docker-sync.yml.erb', 'docker-sync.yml' template 'Dockerfile.erb', 'Dockerfile' install_terraform_project directory 'docker', 'docker' directory 'ci', 'ci' end
Private Instance Methods
app_config()
click to toggle source
# File lib/founders_template/cli.rb, line 219 def app_config @app_config ||= ConfigFile.new(CONFIG_PATH) end
aws_credentials?()
click to toggle source
# File lib/founders_template/cli.rb, line 194 def aws_credentials? sts = Aws::STS::Client.new(region: 'us-east-1') sts.get_caller_identity true rescue Aws::Errors::MissingCredentialsError false end
chamber_key?(key)
click to toggle source
# File lib/founders_template/cli.rb, line 85 def chamber_key?(key) system("chamber read #{chamber_repo_key} #{key} > /dev/null 2>&1") end
chamber_repo_key()
click to toggle source
# File lib/founders_template/cli.rb, line 93 def chamber_repo_key "#{app_config.slugified_name}-terraform" end
chamber_write(key, value)
click to toggle source
# File lib/founders_template/cli.rb, line 89 def chamber_write(key, value) system("chamber write #{chamber_repo_key} #{key} #{value} > /dev/null 2>&1") end
copy_credentials_to_secrets_manager()
click to toggle source
# File lib/founders_template/cli.rb, line 167 def copy_credentials_to_secrets_manager return if secrets_manager_key_exist?(secrets_manager_credentials_key_id) key = run("cat #{CREDENTIALS_KEY_FILE}") secrets_manager.create_secret( description: "The Rails credentials key for #{app_config.short_name}", name: secrets_manager_credentials_key_id, secret_string: { production: key }.to_json ) end
credentials_supported?()
click to toggle source
# File lib/founders_template/cli.rb, line 156 def credentials_supported? Dir.exist?(CREDENTIALS_PATH) end
ensure_application_config()
click to toggle source
# File lib/founders_template/cli.rb, line 202 def ensure_application_config unless app_config.name app_config.name = ask 'Application Name:' app_config.short_name = ask 'Application Short Name:', default: app_config.short_name end app_config.github_org = ask 'GitHub Organization:' unless app_config.github_org app_config.github_repo = ask 'GitHub Repo Name:' unless app_config.github_repo unless app_config.valid? error 'There is an error in your config.' exit 1 end template_file app_config end
ensure_aws_credentials()
click to toggle source
# File lib/founders_template/cli.rb, line 97 def ensure_aws_credentials return if aws_credentials? message = <<~TEXT We need to setup an AWS credentials profile on your system. This will add a section to ~/.aws/credentials so you will have a profile containing your keys for this project. This will then configure direnv so that whenever you are inside your project's directory all AWS commands will be configured to use that profile. TEXT say message, :yellow aws_access_key_id = ask 'AWS Access Key ID:' aws_secret_access_key = ask 'AWS Secret Access Key (typing will be hidden):', echo: false regions = Aws::EC2::Client.new(region: 'us-east-1', access_key_id: aws_access_key_id, secret_access_key: aws_secret_access_key).describe_regions aws_region = ask 'AWS Region:', limited_to: regions.regions.map(&:region_name), default: 'us-east-1' add_to_envrc AWS_REGION: aws_region add_to_envrc AWS_DEFAULT_REGION: aws_region profile = <<~TEXT [#{app_config.short_name}] aws_access_key_id = #{aws_access_key_id} aws_secret_access_key = #{aws_secret_access_key} TEXT append_to_file '~/.aws/credentials', profile add_to_envrc AWS_PROFILE: app_config.short_name end
ensure_credentials_key()
click to toggle source
# File lib/founders_template/cli.rb, line 148 def ensure_credentials_key return unless credentials_supported? return if secrets_manager_key_exist?(secrets_manager_credentials_key_id) ensure_credentials_key_file copy_credentials_to_secrets_manager end
ensure_credentials_key_file()
click to toggle source
# File lib/founders_template/cli.rb, line 160 def ensure_credentials_key_file return if File.exist?(CREDENTIALS_KEY_FILE) create_file CREDENTIALS_KEY_FILE, ActiveSupport::EncryptedFile.generate_key chmod CREDENTIALS_KEY_FILE, 0o600 end
ensure_github_oauth_token()
click to toggle source
# File lib/founders_template/cli.rb, line 81 def ensure_github_oauth_token chamber_write(:github_token, ask('GitHub Oauth Token:')) unless chamber_key?(:github_token) end
ensure_secret_key()
click to toggle source
# File lib/founders_template/cli.rb, line 178 def ensure_secret_key return if secrets_manager_key_exist?(secrets_manager_secret_key_id) key = ask 'Rails Secret Key (leave blank to generate a new one):' key = SecureRandom.hex(64) if key == '' secrets_manager.create_secret( description: "The Rails secret key for #{app_config.short_name}", name: secrets_manager_secret_key_id, secret_string: { production: key }.to_json ) end
install_terraform_project()
click to toggle source
# File lib/founders_template/cli.rb, line 72 def install_terraform_project directory 'terraform', 'terraform' template 'terraform-production-backend.tf.erb', 'terraform/production/backend.tf' template 'terraform-production.tfvars.erb', 'terraform/production/terraform.tfvars' template 'terraform-production-envrc.erb', 'terraform/production/.envrc' template 'terraform-shared.tfvars.erb', 'terraform/shared/terraform.tfvars' end
secrets_manager()
click to toggle source
# File lib/founders_template/cli.rb, line 190 def secrets_manager @secrets_manager ||= Aws::SecretsManager::Client.new end
secrets_manager_credentials_key_id()
click to toggle source
# File lib/founders_template/cli.rb, line 140 def secrets_manager_credentials_key_id "#{app_config.short_name}/rails/production/credentials_master_key" end
secrets_manager_key_exist?(key_id)
click to toggle source
# File lib/founders_template/cli.rb, line 133 def secrets_manager_key_exist?(key_id) secrets_manager.describe_secret({ secret_id: key_id }) true rescue Aws::SecretsManager::Errors::ResourceNotFoundException false end
secrets_manager_secret_key_id()
click to toggle source
# File lib/founders_template/cli.rb, line 144 def secrets_manager_secret_key_id "#{app_config.short_name}/rails/production/secret_key_base" end
version()
click to toggle source
# File lib/founders_template/cli.rb, line 68 def version VERSION end