jets 1.2.1 → 1.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +8 -0
- data/Gemfile.lock +4 -4
- data/README.md +2 -2
- data/lib/jets.rb +3 -4
- data/lib/jets/application.rb +13 -2
- data/lib/jets/builders.rb +3 -0
- data/lib/jets/builders/code_builder.rb +22 -89
- data/lib/jets/builders/code_size.rb +55 -0
- data/lib/jets/builders/gem_replacer.rb +22 -1
- data/lib/jets/builders/handler_generator.rb +31 -5
- data/lib/jets/builders/lambda_layer.rb +50 -0
- data/lib/jets/builders/md5.rb +10 -5
- data/lib/jets/builders/md5_zip.rb +1 -0
- data/lib/jets/builders/purger.rb +35 -0
- data/lib/jets/builders/rack_packager.rb +25 -5
- data/lib/jets/builders/rackup_wrappers/rackup +1 -5
- data/lib/jets/builders/ruby_packager.rb +25 -27
- data/lib/jets/builders/shim_vars/app.rb +3 -3
- data/lib/jets/builders/shim_vars/base.rb +9 -4
- data/lib/jets/builders/shim_vars/shared.rb +2 -2
- data/lib/jets/builders/templates/handler.rb +7 -0
- data/lib/jets/builders/tidy.rb +4 -3
- data/lib/jets/builders/util.rb +11 -3
- data/lib/jets/cfn/builders/base_child_builder.rb +6 -3
- data/lib/jets/cfn/builders/interface.rb +1 -1
- data/lib/jets/cfn/builders/parent_builder.rb +5 -0
- data/lib/jets/commands/build.rb +4 -2
- data/lib/jets/commands/help/gems/check.md +1 -1
- data/lib/jets/commands/main.rb +1 -1
- data/lib/jets/commands/new.rb +4 -2
- data/lib/jets/commands/sequence.rb +1 -1
- data/lib/jets/commands/templates/skeleton/Gemfile.tt +2 -2
- data/lib/jets/commands/templates/skeleton/config/application.rb.tt +0 -5
- data/lib/jets/commands/templates/skeleton/config/database.yml.tt +2 -2
- data/lib/jets/commands/templates/skeleton/config/environments/development.rb +2 -1
- data/lib/jets/commands/templates/skeleton/config/environments/production.rb +2 -3
- data/lib/jets/commands/upgrade/v1.rb +21 -0
- data/lib/jets/controller/renderers/template_renderer.rb +1 -1
- data/lib/jets/controller/rendering.rb +1 -4
- data/lib/jets/core.rb +45 -6
- data/lib/jets/internal/app/jobs/jets/preheat_job.rb +32 -34
- data/lib/jets/mega/request.rb +11 -0
- data/lib/jets/overrides/lambda.rb +1 -0
- data/lib/jets/overrides/lambda/marshaller.rb +31 -0
- data/lib/jets/overrides/rails.rb +4 -0
- data/lib/jets/{rails_overrides → overrides/rails}/asset_tag_helper.rb +0 -0
- data/lib/jets/{rails_overrides → overrides/rails}/common_methods.rb +0 -0
- data/lib/jets/{rails_overrides → overrides/rails}/rendering_helper.rb +0 -0
- data/lib/jets/{rails_overrides → overrides/rails}/url_helper.rb +0 -0
- data/lib/jets/poly_fun/base_executor.rb +1 -1
- data/lib/jets/preheat.rb +1 -0
- data/lib/jets/processors/main_processor.rb +3 -10
- data/lib/jets/{server.rb → rack_server.rb} +31 -2
- data/lib/jets/resource.rb +1 -1
- data/lib/jets/resource/api_gateway/base_path/function.rb +1 -1
- data/lib/jets/resource/child_stack/app_class.rb +10 -4
- data/lib/jets/resource/lambda.rb +5 -0
- data/lib/jets/resource/{function.rb → lambda/function.rb} +8 -6
- data/lib/jets/resource/{function → lambda/function}/environment.rb +1 -1
- data/lib/jets/resource/lambda/gem_layer.rb +17 -0
- data/lib/jets/resource/lambda/layer_version.rb +46 -0
- data/lib/jets/tmp_loader.rb +52 -0
- data/lib/jets/version.rb +1 -1
- data/{README → readme}/prerelease.md +0 -0
- data/{README → readme}/testing.md +5 -0
- data/vendor/jets-gems/lib/jets/gems.rb +1 -1
- data/vendor/jets-gems/lib/jets/gems/check.rb +7 -7
- data/vendor/jets-gems/lib/jets/gems/exist.rb +5 -5
- data/vendor/jets-gems/lib/jets/gems/extract/base.rb +4 -11
- data/vendor/jets-gems/lib/jets/gems/extract/gem.rb +15 -8
- data/vendor/jets-gems/lib/jets/gems/extract/ruby.rb +19 -10
- metadata +22 -15
- data/lib/jets/builders/templates/handler.js +0 -9
- data/lib/jets/builders/templates/shim.js +0 -275
- data/lib/jets/rails_overrides.rb +0 -4
- data/lib/jets/ruby_server.rb +0 -148
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bb0598c2fec261f9cf41a160261d7641963e09a62158e1590194e96eff34fbcb
|
4
|
+
data.tar.gz: f2e34c4c936ab77a6c75045d048a9c5ddebac2611b876f28a74ed11881e3d802
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 603c3925ff7c16dac27e5c1695f948882b6880f91ee162346df13a74c8b3ee59a936555af15eca5b99c966b60da26adbd53c1a252a925aa64dceb3c82b62d9e1
|
7
|
+
data.tar.gz: c1336fde24ccee02f4ac5e2de60856960b9b33bb84ae5678365ee98f67982c297e8dae3272a126f0f0c4694467d8d5311a4461630bc4c3fea8c4075d83aaaa54
|
data/CHANGELOG.md
CHANGED
@@ -3,6 +3,14 @@
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
4
4
|
This project *loosely tries* to adhere to [Semantic Versioning](http://semver.org/), even before v1.0.
|
5
5
|
|
6
|
+
## [1.3.0]
|
7
|
+
- Official AWS Ruby Support
|
8
|
+
- Ruby Version 2.5.3 upgrade
|
9
|
+
- Gem Layer introduced
|
10
|
+
- Removed node shim
|
11
|
+
- Build purger: /tmp/jets/project is auto purge when major or minor version changes
|
12
|
+
- Update default gems source to https://gems2.lambdagems.com
|
13
|
+
|
6
14
|
## [1.2.1]
|
7
15
|
- remove comments about routes workaround, auto blue-green deployments resolves this
|
8
16
|
|
data/Gemfile.lock
CHANGED
@@ -11,7 +11,7 @@ GIT
|
|
11
11
|
PATH
|
12
12
|
remote: .
|
13
13
|
specs:
|
14
|
-
jets (1.
|
14
|
+
jets (1.3.0)
|
15
15
|
actionpack (>= 5.2.1)
|
16
16
|
actionview (>= 5.2.1)
|
17
17
|
activerecord (>= 5.2.1)
|
@@ -66,7 +66,7 @@ GEM
|
|
66
66
|
tzinfo (~> 1.1)
|
67
67
|
arel (9.0.0)
|
68
68
|
aws-eventstream (1.0.1)
|
69
|
-
aws-partitions (1.
|
69
|
+
aws-partitions (1.123.0)
|
70
70
|
aws-sdk-apigateway (1.23.0)
|
71
71
|
aws-sdk-core (~> 3, >= 3.39.0)
|
72
72
|
aws-sigv4 (~> 1.0)
|
@@ -76,7 +76,7 @@ GEM
|
|
76
76
|
aws-sdk-cloudwatchlogs (1.12.0)
|
77
77
|
aws-sdk-core (~> 3, >= 3.39.0)
|
78
78
|
aws-sigv4 (~> 1.0)
|
79
|
-
aws-sdk-core (3.
|
79
|
+
aws-sdk-core (3.44.0)
|
80
80
|
aws-eventstream (~> 1.0)
|
81
81
|
aws-partitions (~> 1.0)
|
82
82
|
aws-sigv4 (~> 1.0)
|
@@ -109,7 +109,7 @@ GEM
|
|
109
109
|
gems (1.1.1)
|
110
110
|
json
|
111
111
|
hashie (3.6.0)
|
112
|
-
i18n (1.
|
112
|
+
i18n (1.2.0)
|
113
113
|
concurrent-ruby (~> 1.0)
|
114
114
|
jmespath (1.4.0)
|
115
115
|
json (2.1.0)
|
data/README.md
CHANGED
@@ -30,13 +30,13 @@ Jets supports writing AWS Lambda functions with Ruby. You define them in the `ap
|
|
30
30
|
app/functions/simple.rb:
|
31
31
|
|
32
32
|
```ruby
|
33
|
-
def handle(event
|
33
|
+
def handle(event:, context:)
|
34
34
|
puts "hello world"
|
35
35
|
{hello: "world"}
|
36
36
|
end
|
37
37
|
```
|
38
38
|
|
39
|
-
Though simple functions are supported by Jets,
|
39
|
+
Though simple functions are supported by Jets, they do not really add much value as other ways to write Ruby code with Jets. Classes like Controllers and Jobs add many conveniences and are more powerful to use. We’ll cover them next.
|
40
40
|
|
41
41
|
### Jets Controllers
|
42
42
|
|
data/lib/jets.rb
CHANGED
@@ -12,8 +12,7 @@ require "fileutils"
|
|
12
12
|
require "memoist"
|
13
13
|
|
14
14
|
module Jets
|
15
|
-
|
16
|
-
RUBY_VERSION = "2.5.0"
|
15
|
+
RUBY_VERSION = "2.5.3"
|
17
16
|
|
18
17
|
autoload :Application, "jets/application"
|
19
18
|
autoload :AwsInfo, "jets/aws_info"
|
@@ -42,14 +41,14 @@ module Jets
|
|
42
41
|
autoload :PolyFun, 'jets/poly_fun'
|
43
42
|
autoload :Preheat, "jets/preheat"
|
44
43
|
autoload :Processors, 'jets/processors'
|
44
|
+
autoload :RackServer, "jets/rack_server"
|
45
45
|
autoload :Rdoc, "jets/rdoc"
|
46
46
|
autoload :Resource, "jets/resource"
|
47
47
|
autoload :Route, "jets/route"
|
48
48
|
autoload :Router, "jets/router"
|
49
|
-
autoload :RubyServer, "jets/ruby_server"
|
50
49
|
autoload :Rule, 'jets/rule'
|
51
|
-
autoload :Server, "jets/server"
|
52
50
|
autoload :Stack, "jets/stack"
|
51
|
+
autoload :TmpLoader, "jets/tmp_loader"
|
53
52
|
autoload :Turbine, 'jets/turbine'
|
54
53
|
autoload :Util, "jets/util"
|
55
54
|
|
data/lib/jets/application.rb
CHANGED
@@ -52,7 +52,7 @@ class Jets::Application
|
|
52
52
|
|
53
53
|
config.gems = ActiveSupport::OrderedOptions.new
|
54
54
|
config.gems.sources = [
|
55
|
-
|
55
|
+
Jets.default_gems_source
|
56
56
|
]
|
57
57
|
|
58
58
|
config.inflections = ActiveSupport::OrderedOptions.new
|
@@ -65,7 +65,6 @@ class Jets::Application
|
|
65
65
|
config.assets.cache_control = nil # IE: public, max-age=3600 , max_age is a shorter way to set cache_control.
|
66
66
|
|
67
67
|
config.ruby = ActiveSupport::OrderedOptions.new
|
68
|
-
config.ruby.lazy_load = true # also set in config/environments files
|
69
68
|
|
70
69
|
config.middleware = Jets::Middleware::Configurator.new
|
71
70
|
|
@@ -133,6 +132,18 @@ class Jets::Application
|
|
133
132
|
load_app_config
|
134
133
|
load_db_config
|
135
134
|
load_environments_config
|
135
|
+
deprecated_configs_message
|
136
|
+
end
|
137
|
+
|
138
|
+
def deprecated_configs_message
|
139
|
+
unless config.ruby.lazy_load.nil?
|
140
|
+
puts "Detected config.ruby.lazy_load = #{config.ruby.lazy_load.inspect}".colorize(:yellow)
|
141
|
+
puts "Deprecated: config.ruby.lazy_load".colorize(:yellow)
|
142
|
+
puts "Gems are now bundled with with Lambda Layer and there's no need to lazy load them."
|
143
|
+
puts "Please remove the config in your config/application.rb or config/environments files."
|
144
|
+
puts "You can have Jets automatically do this by running:"
|
145
|
+
puts " jets upgrade:v1"
|
146
|
+
end
|
136
147
|
end
|
137
148
|
|
138
149
|
def setup_auto_load_paths
|
data/lib/jets/builders.rb
CHANGED
@@ -1,9 +1,12 @@
|
|
1
1
|
class Jets::Builders
|
2
2
|
autoload :CodeBuilder, "jets/builders/code_builder"
|
3
|
+
autoload :CodeSize, "jets/builders/code_size"
|
3
4
|
autoload :GemReplacer, "jets/builders/gem_replacer"
|
4
5
|
autoload :HandlerGenerator, "jets/builders/handler_generator"
|
6
|
+
autoload :LambdaLayer, "jets/builders/lambda_layer"
|
5
7
|
autoload :Md5, "jets/builders/md5"
|
6
8
|
autoload :Md5Zip, "jets/builders/md5_zip"
|
9
|
+
autoload :Purger, "jets/builders/purger"
|
7
10
|
autoload :RackPackager, "jets/builders/rack_packager"
|
8
11
|
autoload :ReconfigureRails, "jets/builders/reconfigure_rails"
|
9
12
|
autoload :RubyPackager, "jets/builders/ruby_packager"
|
@@ -10,49 +10,10 @@ require "action_view"
|
|
10
10
|
# /tmp/jets: build root where different jets projects get built.
|
11
11
|
# /tmp/jets/project: each jets project gets built in a different subdirectory.
|
12
12
|
#
|
13
|
-
# The rest of the folders are subfolders under /tmp/jets/project
|
13
|
+
# The rest of the folders are subfolders under /tmp/jets/project.
|
14
14
|
#
|
15
|
-
# cache: Gemfile is here, this is where we run bundle install.
|
16
|
-
# cache/bundled/gems: Vendored gems that get created as part of bundled install.
|
17
|
-
# Initially, macosx gems but then get replaced by linux gems where appropriate.
|
18
|
-
# cache/downloads/rubies: ruby tarballs.
|
19
|
-
# cache/downloads/gems: gem tarballs.
|
20
|
-
# code: Where project gets copied into in order for us to configure it.
|
21
|
-
# app_root/bundled/gems: Where vendored gems finally end up at. The compiled
|
22
|
-
# gems at this point are only linux gems.
|
23
|
-
# artifacts/code/code-md5sha.zip: code artifact that gets uploaded to lambda.
|
24
|
-
#
|
25
|
-
# Building Steps:
|
26
|
-
#
|
27
|
-
### Before copy
|
28
|
-
# * compile assets: easier to do this before the copy
|
29
|
-
#
|
30
|
-
### copy project
|
31
|
-
# * copy project: to app_root
|
32
|
-
#
|
33
|
-
### setup app_root project
|
34
|
-
# * clean project: remove log and ignored files to reduce size
|
35
|
-
# * reconfigure webpacker: config/webpacker.yml
|
36
|
-
# * generate node shims: handlers
|
37
|
-
#
|
38
|
-
### build bundled in cache area
|
39
|
-
# * bundle install: cache/bundled/gems
|
40
|
-
#
|
41
|
-
### setup bundled on app root from cache
|
42
|
-
# * copy bundled to code: code/bundled
|
43
|
-
# * extract linux ruby: cache/downloads/rubies:
|
44
|
-
# cache/bundled/rbenv, cache/bundled/linuxbrew
|
45
|
-
# * extract linux gems: cache/downloads/gems:
|
46
|
-
# cache/bundled/gems, cache/bundled/linuxbrew
|
47
|
-
# * setup bundled config: code/.bundle/config
|
48
|
-
#
|
49
|
-
### zip
|
50
|
-
# * create zip file
|
51
15
|
class Jets::Builders
|
52
16
|
class CodeBuilder
|
53
|
-
# https://docs.aws.amazon.com/lambda/latest/dg/limits.html
|
54
|
-
AWS_CODE_SIZE_LIMIT = 250 * 1024 * 1024 # 250MB
|
55
|
-
|
56
17
|
include Jets::AwsServices
|
57
18
|
include Util
|
58
19
|
extend Memoist
|
@@ -62,11 +23,13 @@ class Jets::Builders
|
|
62
23
|
# Expanding to the full path and capture now.
|
63
24
|
# Dir.chdir gets called later and we'll lose this info.
|
64
25
|
@full_project_path = File.expand_path(Jets.root) + "/"
|
26
|
+
@version_purger = Purger.new
|
65
27
|
end
|
66
28
|
|
67
29
|
def build
|
68
|
-
cache_check_message
|
69
30
|
check_ruby_version
|
31
|
+
@version_purger.purge
|
32
|
+
cache_check_message
|
70
33
|
|
71
34
|
clean_start
|
72
35
|
compile_assets # easier to do before we copy the project because node and yarn has been likely setup in the that dir
|
@@ -101,6 +64,7 @@ class Jets::Builders
|
|
101
64
|
|
102
65
|
def create_zip_files
|
103
66
|
folders = Md5.stage_folders
|
67
|
+
# Md5.stage_folders ["stage/bundled", "stage/code"]
|
104
68
|
folders.each do |folder|
|
105
69
|
zip = Md5Zip.new(folder)
|
106
70
|
if exist_on_s3?(zip.md5_name)
|
@@ -122,56 +86,38 @@ class Jets::Builders
|
|
122
86
|
end
|
123
87
|
end
|
124
88
|
|
125
|
-
# Moves code/bundled and code/rack to build_root.
|
126
|
-
# These files will be packaged separated and lazy loaded as part of the
|
127
|
-
# node shim. This keeps the code zipfile smaller in size and helps
|
128
|
-
# with the 250MB extract limited. /tmp permits up to 512MB.
|
129
|
-
# AWS Lambda Limits: https://amzn.to/2A7y6v6
|
130
|
-
#
|
131
|
-
# > Each Lambda function receives an additional 512MB of non-persistent disk space in its own /tmp directory. The /tmp directory can be used for loading additional resources like dependency libraries or data sets during function initialization.
|
132
|
-
#
|
133
|
-
def setup_tmp
|
134
|
-
tmp_symlink("bundled") if Jets.lazy_load?
|
135
|
-
tmp_symlink("rack")
|
136
|
-
end
|
137
|
-
|
138
89
|
def stage_area
|
139
90
|
"#{Jets.build_root}/stage"
|
140
91
|
end
|
141
92
|
|
142
|
-
# Moves folder to a stage folder and create a symlink its place
|
143
|
-
# that links from /var/task to /tmp. Example:
|
144
|
-
#
|
145
|
-
# /var/task/bundled => /tmp/bundled
|
146
|
-
#
|
147
|
-
def tmp_symlink(folder)
|
148
|
-
src = "#{full(tmp_code)}/#{folder}"
|
149
|
-
return unless File.exist?(src)
|
150
|
-
|
151
|
-
dest = "#{stage_area}/#{folder}"
|
152
|
-
dir = File.dirname(dest)
|
153
|
-
FileUtils.mkdir_p(dir) unless File.exist?(dir)
|
154
|
-
FileUtils.mv(src, dest)
|
155
|
-
|
156
|
-
# Create symlink
|
157
|
-
FileUtils.ln_sf("/tmp/#{folder}", "/#{full(tmp_code)}/#{folder}")
|
158
|
-
end
|
159
|
-
|
160
93
|
def code_setup
|
161
94
|
reconfigure_development_webpacker
|
162
95
|
end
|
163
96
|
|
164
97
|
def code_finish
|
165
|
-
|
98
|
+
# Reconfigure code
|
166
99
|
store_s3_base_url
|
167
100
|
disable_webpacker_middleware
|
168
101
|
copy_internal_jets_code
|
169
|
-
|
102
|
+
|
103
|
+
# Code prep and zipping
|
104
|
+
build_lambda_layer
|
105
|
+
check_code_size!
|
170
106
|
calculate_md5s # must be called before generate_node_shims and create_zip_files
|
171
107
|
generate_node_shims
|
172
108
|
create_zip_files
|
173
109
|
end
|
174
110
|
|
111
|
+
def build_lambda_layer
|
112
|
+
return if Jets.poly_only?
|
113
|
+
lambda_layer = LambdaLayer.new
|
114
|
+
lambda_layer.build
|
115
|
+
end
|
116
|
+
|
117
|
+
def check_code_size!
|
118
|
+
CodeSize.check!
|
119
|
+
end
|
120
|
+
|
175
121
|
# We copy the files into the project because we cannot require simple functions
|
176
122
|
# directly since they are wrapped by an anonymous class.
|
177
123
|
# TODO: Do this with the other files we required the same way.
|
@@ -185,17 +131,6 @@ class Jets::Builders
|
|
185
131
|
end
|
186
132
|
end
|
187
133
|
|
188
|
-
def update_lazy_load_config
|
189
|
-
size_limit = AWS_CODE_SIZE_LIMIT
|
190
|
-
code_size = dir_size(full(tmp_code))
|
191
|
-
if code_size > size_limit && !Jets.config.ruby.lazy_load
|
192
|
-
# override the setting because we dont have to a choice but to lazy load
|
193
|
-
mb_limit = AWS_CODE_SIZE_LIMIT / 1024 / 1024
|
194
|
-
puts "Code size close to AWS code size limit of #{mb_limit}MB. Lazy loading automatically enabled."
|
195
|
-
Jets.config.ruby.lazy_load = true
|
196
|
-
end
|
197
|
-
end
|
198
|
-
|
199
134
|
# Thanks https://stackoverflow.com/questions/9354595/recursively-getting-the-size-of-a-directory
|
200
135
|
# Seems to overestimate a little bit but close enough.
|
201
136
|
def dir_size(folder)
|
@@ -210,8 +145,6 @@ class Jets::Builders
|
|
210
145
|
# At this point the minimal stack exists, so we can grab it with the AWS API.
|
211
146
|
# We do not want to grab this as part of the live request because it is slow.
|
212
147
|
def store_s3_base_url
|
213
|
-
return if poly_only?
|
214
|
-
|
215
148
|
write_s3_base_url("config/s3_base_url.txt")
|
216
149
|
write_s3_base_url("rack/config/s3_base_url.txt") if Jets.rack?
|
217
150
|
end
|
@@ -369,9 +302,9 @@ class Jets::Builders
|
|
369
302
|
return if Jets.poly_only?
|
370
303
|
|
371
304
|
ruby_packager.install
|
372
|
-
reconfigure_rails
|
305
|
+
reconfigure_rails # call here after full(tmp_code) is available
|
373
306
|
rack_packager.install
|
374
|
-
ruby_packager.finish
|
307
|
+
ruby_packager.finish # by this time we have a /tmp/jets/demo/stage/code/bundled
|
375
308
|
rack_packager.finish
|
376
309
|
end
|
377
310
|
|
@@ -0,0 +1,55 @@
|
|
1
|
+
class Jets::Builders
|
2
|
+
class CodeSize
|
3
|
+
LAMBDA_SIZE_LIMIT = 250 # Total lambda limit is 250MB
|
4
|
+
include Util
|
5
|
+
|
6
|
+
def self.check!
|
7
|
+
new.check
|
8
|
+
end
|
9
|
+
|
10
|
+
def check
|
11
|
+
return if within_lambda_limit?
|
12
|
+
say "Over the Lambda size limit of #{LAMBDA_SIZE_LIMIT}MB".colorize(:red)
|
13
|
+
say "Please reduce the size of your code."
|
14
|
+
display_sizes
|
15
|
+
exit 1
|
16
|
+
end
|
17
|
+
|
18
|
+
def within_lambda_limit?
|
19
|
+
total_size < LAMBDA_SIZE_LIMIT * 1024 # 120MB
|
20
|
+
end
|
21
|
+
|
22
|
+
def total_size
|
23
|
+
code_size = compute_size("#{stage_area}/code")
|
24
|
+
opt_size = compute_size("#{stage_area}/opt")
|
25
|
+
opt_size + code_size # total_size
|
26
|
+
end
|
27
|
+
|
28
|
+
def display_sizes
|
29
|
+
code_size = compute_size("#{stage_area}/code")
|
30
|
+
opt_size = compute_size("#{stage_area}/opt")
|
31
|
+
total_size = opt_size + code_size
|
32
|
+
overlimit = (LAMBDA_SIZE_LIMIT * 1024 - total_size) * -1
|
33
|
+
say "Sizes:"
|
34
|
+
say "Code: #{megabytes(code_size)} - #{stage_area}/code"
|
35
|
+
say "Gem Layer: #{megabytes(opt_size)} - #{stage_area}/opt"
|
36
|
+
say "Total Package: #{megabytes(total_size)}"
|
37
|
+
say "Over limit by: #{megabytes(overlimit)}"
|
38
|
+
# sh "du -csh #{stage_area}/*" unless ENV['TEST'] # uncomment to debug
|
39
|
+
end
|
40
|
+
|
41
|
+
def compute_size(path)
|
42
|
+
out = `du -s #{path}`
|
43
|
+
out.split(' ').first.to_i # bytes
|
44
|
+
end
|
45
|
+
|
46
|
+
def megabytes(bytes)
|
47
|
+
n = bytes / 1024.0
|
48
|
+
sprintf('%.1f', n) + 'MB'
|
49
|
+
end
|
50
|
+
|
51
|
+
def say(message)
|
52
|
+
puts message unless ENV['TEST']
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -17,15 +17,36 @@ class Jets::Builders
|
|
17
17
|
gem_extractor.run
|
18
18
|
end
|
19
19
|
|
20
|
+
# At this point the current compiled gems have been removed and compiled gems
|
21
|
+
# have been unpacked to code/opt. We can take the unpacked gems in opt and fully
|
22
|
+
# move them into vendor/bundle gems now.
|
23
|
+
move_opt_gems_to_vendor
|
24
|
+
|
20
25
|
tidy
|
21
26
|
end
|
22
27
|
|
23
|
-
def
|
28
|
+
def move_opt_gems_to_vendor
|
29
|
+
code = "#{Jets.build_root}/stage/code"
|
30
|
+
opt_gems = "#{code}/opt/ruby/gems/#{Jets::Gems.ruby_folder}"
|
31
|
+
vendor_gems = "#{code}/vendor/bundle/ruby/#{Jets::Gems.ruby_folder}"
|
32
|
+
# https://stackoverflow.com/questions/23698183/how-to-force-cp-to-overwrite-directory-instead-of-creating-another-one-inside
|
33
|
+
# $ cp -TRv foo/ bar/
|
34
|
+
sh "cp -TR #{opt_gems} #{vendor_gems}"
|
35
|
+
# clean up opt compiled gems
|
36
|
+
FileUtils.rm_rf("#{code}/opt/ruby")
|
37
|
+
end
|
24
38
|
|
39
|
+
def sh(command)
|
40
|
+
puts "=> #{command}".colorize(:green)
|
41
|
+
success = system(command)
|
42
|
+
abort("Command Failed") unless success
|
43
|
+
success
|
25
44
|
end
|
26
45
|
|
27
46
|
# remove unnecessary files to reduce package size
|
28
47
|
def tidy
|
48
|
+
# project_root: /tmp/jets/demo/stage/code/
|
49
|
+
# /tmp/jets/demo/stage/code/bundled
|
29
50
|
tidy_gems("#{@options[:project_root]}/bundled/gems/ruby/*/gems/*")
|
30
51
|
tidy_gems("#{@options[:project_root]}/bundled/gems/ruby/*/bundler/gems/*")
|
31
52
|
end
|
@@ -14,21 +14,47 @@ class Jets::Builders
|
|
14
14
|
end
|
15
15
|
|
16
16
|
def build
|
17
|
-
|
17
|
+
generate_data_yaml
|
18
18
|
app_ruby_shims
|
19
19
|
poly_shims
|
20
20
|
shared_shims
|
21
21
|
internal_shims
|
22
22
|
end
|
23
23
|
|
24
|
+
# The handlers/data.yml is used by the shims
|
25
|
+
def generate_data_yaml
|
26
|
+
vars = Jets::Builders::ShimVars::Base.new
|
27
|
+
data = {
|
28
|
+
"s3_bucket" => vars.s3_bucket
|
29
|
+
}
|
30
|
+
data["rack_zip"] = vars.rack_zip if vars.rack_zip
|
31
|
+
|
32
|
+
content = YAML.dump(data)
|
33
|
+
path = "#{tmp_code}/handlers/data.yml"
|
34
|
+
FileUtils.mkdir_p(File.dirname(path))
|
35
|
+
IO.write(path, content)
|
36
|
+
end
|
37
|
+
|
24
38
|
def app_ruby_shims
|
25
39
|
app_files.each do |path|
|
26
|
-
# Generates one
|
40
|
+
# Generates one shim for each app class: controller, job, etc
|
27
41
|
vars = Jets::Builders::ShimVars::App.new(path)
|
28
|
-
|
42
|
+
if path.include?('app/functions')
|
43
|
+
copy_simple_function(path)
|
44
|
+
else
|
45
|
+
generate_handler(vars)
|
46
|
+
end
|
29
47
|
end
|
30
48
|
end
|
31
49
|
|
50
|
+
# source_path: app/functions/simple.rb
|
51
|
+
def copy_simple_function(source_path)
|
52
|
+
# Handler: handlers/controllers/posts_controller.handle
|
53
|
+
dest_path = source_path.sub('app/functions', 'handlers/functions')
|
54
|
+
FileUtils.mkdir_p(File.dirname(dest_path))
|
55
|
+
FileUtils.cp(source_path, dest_path)
|
56
|
+
end
|
57
|
+
|
32
58
|
def app_files
|
33
59
|
Jets::Commands::Build.app_files
|
34
60
|
end
|
@@ -127,8 +153,8 @@ class Jets::Builders
|
|
127
153
|
end
|
128
154
|
|
129
155
|
def generate_handler(vars)
|
130
|
-
result = evaluate_template("handler.
|
131
|
-
dest = "#{tmp_code}/#{vars.
|
156
|
+
result = evaluate_template("handler.rb", vars)
|
157
|
+
dest = "#{tmp_code}/#{vars.dest_path}"
|
132
158
|
FileUtils.mkdir_p(File.dirname(dest))
|
133
159
|
IO.write(dest, result)
|
134
160
|
end
|