Class: Jets::Commands::Deploy
- Inherits:
-
Object
- Object
- Jets::Commands::Deploy
- Extended by:
- Memoist
- Defined in:
- lib/jets/commands/deploy.rb
Constant Summary
Constants included from Timing
Instance Method Summary collapse
- #build_code ⇒ Object
- #check_dev_mode ⇒ Object
- #delete_minimal_stack ⇒ Object
-
#exit_unless_updateable! ⇒ Object
All CloudFormation states listed here: docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-describing-stacks.html.
- #find_stack(stack_name) ⇒ Object
-
#initialize(options) ⇒ Deploy
constructor
A new instance of Deploy.
-
#minimal_rollback_complete? ⇒ Boolean
Checks for a few things before deciding to delete the parent stack.
- #run ⇒ Object
- #ship(stack_options) ⇒ Object
- #stack_name ⇒ Object
- #status ⇒ Object
-
#validate_routes! ⇒ Object
Checks that all routes are validate and have corresponding lambda functions.
Methods included from Timing
clear, #record_data, #record_log, report
Methods included from StackInfo
#first_run?, #parent_stack_name, #s3_bucket, #stack_type
Methods included from AwsServices
#cfn, #lambda, #logs, #s3, #s3_resource, #sns, #sts
Methods included from AwsServices::StackStatus
#stack_exists?, #stack_in_progress?
Constructor Details
#initialize(options) ⇒ Deploy
Returns a new instance of Deploy.
7 8 9 |
# File 'lib/jets/commands/deploy.rb', line 7 def initialize() @options = end |
Instance Method Details
#build_code ⇒ Object
49 50 51 |
# File 'lib/jets/commands/deploy.rb', line 49 def build_code Jets::Commands::Build.new(@options).build_code end |
#check_dev_mode ⇒ Object
42 43 44 45 46 47 |
# File 'lib/jets/commands/deploy.rb', line 42 def check_dev_mode if File.exist?("#{Jets.root}dev.mode") puts "The dev.mode file exists. Please removed it and run bundle update before you deploy.".colorize(:red) exit 1 end end |
#delete_minimal_stack ⇒ Object
35 36 37 38 39 40 |
# File 'lib/jets/commands/deploy.rb', line 35 def delete_minimal_stack puts "Existing stack is in ROLLBACK_COMPLETE state from a previous failed minimal deploy. Deleting stack and continuing." cfn.delete_stack(stack_name: stack_name) status.wait status.reset end |
#exit_unless_updateable! ⇒ Object
All CloudFormation states listed here: docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-describing-stacks.html
112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 |
# File 'lib/jets/commands/deploy.rb', line 112 def exit_unless_updateable! stack_name = Jets::Naming.parent_stack_name exists = stack_exists?(stack_name) return unless exists # continue because stack could be updating stack = cfn.describe_stacks(stack_name: stack_name).stacks.first status = stack["stack_status"] if status =~ /^ROLLBACK_/ || status =~ /_IN_PROGRESS$/ region = `aws configure get region`.strip rescue "us-east-1" url = "https://console.aws.amazon.com/cloudformation/home?region=#{region}#/stacks" puts "The parent stack of the #{Jets.config.project_name.colorize(:green)} project is not in an updateable state." puts "Stack name #{stack_name.colorize(:yellow)} status #{stack["stack_status"].colorize(:yellow)}" puts "Here's the CloudFormation url to check for more details #{url}" exit 1 end end |
#find_stack(stack_name) ⇒ Object
99 100 101 102 103 104 105 106 107 108 109 |
# File 'lib/jets/commands/deploy.rb', line 99 def find_stack(stack_name) resp = cfn.describe_stacks(stack_name: stack_name) resp.stacks.first rescue Aws::CloudFormation::Errors::ValidationError => e # example: Stack with id demo-dev does not exist if e. =~ /Stack with/ && e. =~ /does not exist/ nil else raise end end |
#minimal_rollback_complete? ⇒ Boolean
Checks for a few things before deciding to delete the parent stack
* Parent stack status status is ROLLBACK_COMPLETE
* Parent resources are in the DELETE_COMPLETE state
87 88 89 90 91 92 93 94 95 96 97 |
# File 'lib/jets/commands/deploy.rb', line 87 def minimal_rollback_complete? stack = find_stack(stack_name) return false unless stack return false unless stack.stack_status == 'ROLLBACK_COMPLETE' # Finally check if all the minimal resources in the parent template have been deleted resp = cfn.describe_stack_resources(stack_name: stack_name) resource_statuses = resp.stack_resources.map(&:resource_status).uniq resource_statuses == ['DELETE_COMPLETE'] end |
#run ⇒ Object
11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
# File 'lib/jets/commands/deploy.rb', line 11 def run deployment_env = Jets.config.project_namespace.colorize(:green) puts "Deploying to Lambda #{deployment_env} environment..." return if @options[:noop] check_dev_mode validate_routes! # Delete existing rollback stack from previous bad minimal deploy delete_minimal_stack if minimal_rollback_complete? exit_unless_updateable! # Stack could be in a weird rollback state or in progress state ship(stack_type: :minimal) if first_run? Jets.application.reload_iam_policy! # Build code after the minimal stack because need s3 bucket for assets # on_aws? and s3_base_url logic build_code # deploy full nested stack when stack already exists ship(stack_type: :full, s3_bucket: s3_bucket) end |
#ship(stack_options) ⇒ Object
66 67 68 69 70 |
# File 'lib/jets/commands/deploy.rb', line 66 def ship() = @options.merge() # includes stack_type and s3_bucket Jets::Commands::Build.new().build_templates Jets::Cfn::Ship.new().run end |
#stack_name ⇒ Object
78 79 80 |
# File 'lib/jets/commands/deploy.rb', line 78 def stack_name Jets::Naming.parent_stack_name end |
#status ⇒ Object
73 74 75 |
# File 'lib/jets/commands/deploy.rb', line 73 def status Jets::Cfn::Status.new(stack_name) end |
#validate_routes! ⇒ Object
Checks that all routes are validate and have corresponding lambda functions
55 56 57 58 59 60 61 62 63 64 |
# File 'lib/jets/commands/deploy.rb', line 55 def validate_routes! return if Jets::Router.all_routes_valid puts "Deploy fail: The jets application contain invalid routes.".colorize(:red) puts "Please double check the routes below map to valid controllers:" Jets::Router.invalid_routes.each do |route| puts " /#{route.path} => #{route.controller_name}##{route.action_name}" end exit 1 end |