lono 7.2.3 → 7.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 93d21105409fe3d2c1173d636bc7b852c7a02d7846422e6688b064babd591b08
4
- data.tar.gz: 9e38baab88bb7604187e80e5b6c2071ed52df1bc81762e40885190c19ac088f2
3
+ metadata.gz: 50634682d0b2bd1142fa36acb73b537e1fcceabde68d7ea88da24621c17b2267
4
+ data.tar.gz: 53a2e8a25610f8f039cdee8c6cb71ab15b24732642d0453a61ace628fb925ca4
5
5
  SHA512:
6
- metadata.gz: 2a0c0b478ca67fc90289fa0e96bc212f75ffc6b22c6dbd92bc10a80eedf7b3198bd328b75e93ea877622c2d0cd205b3b19ab2eb23442c065ae537e64673ba577
7
- data.tar.gz: d58eb137d8faf09aef321b413de9a2179858da95a34b3c38861c6ab8ef91c8517599efde1efff432af0c0f1e6a66b2005fc6bd5bfc2a7e745bc5d2c771760466
6
+ metadata.gz: a700f987afc86bdf10ffc561e0f9027d7ce7aa661b852395a6ff734d272f06a655f24ff4f44aff316b3cb0c225ce64affccab258bde7ac58c0393ce47eff09b5
7
+ data.tar.gz: 1ad6215fc323bd75bd88c085761fe96131d9e71e531cf40ee0d2940cf8f10483c97cb86984c382cf1c3b6ee1522edc60782275a514713b4fc05c5d6627bf184c
@@ -3,6 +3,9 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  This project *tries* to adhere to [Semantic Versioning](http://semver.org/), even before v1.0.
5
5
 
6
+ ## [7.3.0]
7
+ - #54 introduce lambda layer concept
8
+
6
9
  ## [7.2.3]
7
10
  - #53 improve configset lookup path lookup
8
11
  - cleanup starter blueprint
@@ -15,8 +15,21 @@ module Lono::AppFile
15
15
  def build_all
16
16
  clean_output
17
17
  copy_to_output
18
+ build_layers
19
+ compress_output
20
+ end
21
+
22
+ def build_layers
23
+ layer_items = Registry.layers
24
+ layer_items.each do |item|
25
+ LambdaLayer.new(@blueprint, item).build
26
+ end
27
+ end
28
+
29
+ def compress_output
18
30
  Registry.items.each do |item|
19
- if item.directory?
31
+ # type can be lambda_layer or file
32
+ if item.type == "lambda_layer" || item.directory?
20
33
  zip_directory(item)
21
34
  elsif item.file?
22
35
  zip_file(item)
@@ -0,0 +1,20 @@
1
+ class Lono::AppFile::Build
2
+ class LambdaLayer
3
+ def initialize(blueprint, registry_item)
4
+ @blueprint, @registry_item = blueprint, registry_item
5
+ end
6
+
7
+ def build
8
+ lang = @registry_item.options[:lang]
9
+ unless lang =~ /ruby/
10
+ puts "WARN: Currently only support ruby lambda layers".color(:yellow)
11
+ return
12
+ end
13
+
14
+ klass_name = "Lono::AppFile::Build::LambdaLayer::#{lang.camelize}Packager"
15
+ klass = klass_name.constantize
16
+ packager = klass.new(@blueprint, @registry_item)
17
+ packager.build
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,180 @@
1
+ class Lono::AppFile::Build::LambdaLayer
2
+ # Based on jets
3
+ class RubyPackager
4
+ def initialize(blueprint, registry_item)
5
+ @blueprint, @registry_item = blueprint, registry_item
6
+
7
+ @registry_name = @registry_item.name.sub(/\/$/,'')
8
+ @app_root = "#{Lono.blueprint_root}/app/files/#{@registry_name}"
9
+ end
10
+
11
+ def build
12
+ return unless gemfile_exist?
13
+
14
+ bundle_install
15
+ package
16
+ end
17
+
18
+ # We consolidate all gems to opt
19
+ def package
20
+ setup_bundle_config(output_area)
21
+ # copy_cache_gems # TODO: might not need this cache
22
+ consolidate_gems_to_opt
23
+ end
24
+
25
+ # Also restructure the folder from:
26
+ # vendor/gems/ruby/2.5.0
27
+ # To:
28
+ # ruby/gems/2.5.0
29
+ #
30
+ # For Lambda Layer structure
31
+ def consolidate_gems_to_opt
32
+ src = "#{cache_area}/vendor/gems/ruby/#{ruby_folder}"
33
+ dest = "#{opt_area}/ruby/gems/#{ruby_folder}"
34
+ rsync_and_link(src, dest)
35
+ end
36
+
37
+ def rsync_and_link(src, dest)
38
+ FileUtils.mkdir_p(dest)
39
+ # Trailing slashes are required
40
+ sh "rsync -a --links #{src}/ #{dest}/"
41
+
42
+ # create symlink in output path not the cache path
43
+ symlink_dest = "#{output_area}/vendor/gems/ruby/#{ruby_folder}"
44
+ puts "symlink_dest #{symlink_dest}"
45
+ FileUtils.rm_rf(symlink_dest) # blow away original 2.5.0 folder
46
+
47
+ # Create symlink that will point to the gems in the Lambda Layer:
48
+ # stage/opt/ruby/gems/2.5.0 -> /opt/ruby/gems/2.5.0
49
+ FileUtils.mkdir_p(File.dirname(symlink_dest))
50
+ FileUtils.ln_sf("/opt/ruby/gems/#{ruby_folder}", symlink_dest)
51
+ end
52
+
53
+ def ruby_folder
54
+ major, minor, _ = RUBY_VERSION.split('.')
55
+ [major, minor, '0'].join('.') # 2.5.1 => 2.5.0
56
+ end
57
+
58
+ # Installs gems on the current target system: both compiled and non-compiled.
59
+ # If user is on a macosx machine, macosx gems will be installed.
60
+ # If user is on a linux machine, linux gems will be installed.
61
+ #
62
+ # Copies Gemfile* to /tmp/jets/demo/cache folder and installs
63
+ # gems with bundle install from there.
64
+ #
65
+ # We take the time to copy Gemfile and bundle into a separate directory
66
+ # because it gets left around to act as a 'cache'. So, when the builds the
67
+ # project gets built again not all the gems from get installed from the
68
+ # beginning.
69
+ def bundle_install
70
+ puts "Bundling: running bundle install in cache area: #{cache_area}."
71
+
72
+ copy_gemfiles(@app_root)
73
+
74
+ # Uncomment out to always remove the cache/vendor/gems to debug
75
+ # FileUtils.rm_rf("#{cache_area}/vendor/gems")
76
+
77
+ # Remove .bundle folder so .bundle/config doesnt affect how Jets packages gems.
78
+ # Not using BUNDLE_IGNORE_CONFIG=1 to allow home ~/.bundle/config to affect bundling though.
79
+ # This is useful if you have private gems sources that require authentication. Example:
80
+ #
81
+ # bundle config gems.myprivatesource.com user:pass
82
+ #
83
+
84
+ FileUtils.rm_rf("#{cache_area}/.bundle")
85
+ require "bundler" # dynamically require bundler so user can use any bundler
86
+ setup_bundle_config(cache_area)
87
+ Bundler.with_unbundled_env do
88
+ sh "cd #{cache_area} && env bundle install"
89
+ end
90
+
91
+ remove_bundled_with("#{cache_area}/Gemfile.lock")
92
+
93
+ # Copy the Gemfile.lock back to the project in case it was updated.
94
+ # For example we add the jets-rails to the Gemfile.
95
+ copy_back_gemfile_lock
96
+
97
+ puts 'Bundle install success.'
98
+ end
99
+
100
+ # Remove the BUNDLED WITH line since we don't control the bundler gem version on AWS Lambda
101
+ # And this can cause issues with require 'bundler/setup'
102
+ def remove_bundled_with(gemfile_lock)
103
+ lines = IO.readlines(gemfile_lock)
104
+
105
+ # amount is the number of lines to remove
106
+ new_lines, capture, count, amount = [], true, 0, 2
107
+ lines.each do |l|
108
+ capture = false if l.include?('BUNDLED WITH')
109
+ if capture
110
+ new_lines << l
111
+ end
112
+ if capture == false
113
+ count += 1
114
+ capture = count > amount # renable capture
115
+ end
116
+ end
117
+
118
+ content = new_lines.join('')
119
+ IO.write(gemfile_lock, content)
120
+ end
121
+
122
+ def copy_back_gemfile_lock
123
+ src = "#{cache_area}/Gemfile.lock"
124
+ dest = "#{@app_root}/Gemfile.lock"
125
+ FileUtils.cp(src, dest)
126
+ end
127
+
128
+ # Clean up extra unneeded files to reduce package size
129
+ def copy_gemfiles(app_root)
130
+ FileUtils.mkdir_p(cache_area)
131
+ FileUtils.cp("#{app_root}/Gemfile", "#{cache_area}/Gemfile")
132
+
133
+ gemfile_lock = "#{app_root}/Gemfile.lock"
134
+ dest = "#{cache_area}/Gemfile.lock"
135
+ return unless File.exist?(gemfile_lock)
136
+
137
+ FileUtils.cp(gemfile_lock, dest)
138
+ end
139
+
140
+ def setup_bundle_config(dir)
141
+ text =<<-EOL
142
+ ---
143
+ BUNDLE_FROZEN: "true"
144
+ BUNDLE_PATH: "vendor/gems"
145
+ BUNDLE_WITHOUT: "development:test"
146
+ EOL
147
+ bundle_config = "#{dir}/.bundle/config"
148
+ FileUtils.mkdir_p(File.dirname(bundle_config))
149
+ IO.write(bundle_config, text)
150
+ end
151
+
152
+ def output_area
153
+ "#{Lono.config.output_path}/#{@blueprint}/files/#{@registry_name}"
154
+ end
155
+
156
+ def build_area
157
+ "#{Lono.config.output_path}/#{@blueprint}/lambda_layers/#{@registry_name}"
158
+ end
159
+
160
+ def cache_area
161
+ "#{build_area}/cache"
162
+ end
163
+
164
+ def opt_area
165
+ "#{build_area}/opt"
166
+ end
167
+
168
+ def gemfile_exist?
169
+ gemfile_path = "#{@app_root}/Gemfile"
170
+ File.exist?(gemfile_path)
171
+ end
172
+
173
+ def sh(command)
174
+ puts "=> #{command}"
175
+ out = `#{command}`
176
+ puts out if ENV['LONO_DEBUG_LAMBDA_LAYER']
177
+ $?.success?
178
+ end
179
+ end
180
+ end
@@ -1,13 +1,15 @@
1
1
  module Lono::AppFile
2
2
  class Registry
3
+ cattr_reader :items
3
4
  @@items = []
5
+
4
6
  class << self
5
7
  def register(name, blueprint, options={})
6
- @@items << Item.new(name, blueprint, options) unless @@items.detect { |i| i.name == name }
8
+ @@items << Item.new(name, blueprint, options) unless @@items.detect { |i| i.name == name && i.type == options[:type] }
7
9
  end
8
10
 
9
- def items
10
- @@items
11
+ def layers
12
+ @@items.select { |i| i.type == "lambda_layer" }
11
13
  end
12
14
  end
13
15
  end
@@ -2,13 +2,18 @@ module Lono::AppFile
2
2
  class Registry
3
3
  # Holds metadata about the item in the regsitry.
4
4
  class Item
5
- attr_reader :name, :options
5
+ attr_reader :name, :options, :type
6
6
  def initialize(name, blueprint, options={})
7
7
  @name, @blueprint, @options = name, blueprint, options
8
+ @type = options[:type] || "file"
8
9
  end
9
10
 
10
11
  def path
11
- "#{Lono.root}/output/#{@blueprint}/files/#{@name}"
12
+ if @type == "file"
13
+ "#{Lono.root}/output/#{@blueprint}/files/#{@name}"
14
+ else
15
+ "#{Lono.root}/output/#{@blueprint}/lambda_layers/#{@name}/opt"
16
+ end
12
17
  end
13
18
 
14
19
  def directory?
@@ -20,7 +25,7 @@ module Lono::AppFile
20
25
  end
21
26
 
22
27
  def s3_path
23
- file_path = zip_file_path.sub(%r{.*/output/[\w_-]+/files/}, '') # dont use basename. there might be subfolders
28
+ file_path = zip_file_path.sub(%r{.*/output/[\w_-]+/(files|lambda_layers)/}, '') # dont use basename. there might be subfolders
24
29
  "#{s3_prefix}/#{file_path}"
25
30
  end
26
31
 
@@ -30,7 +35,7 @@ module Lono::AppFile
30
35
  end
31
36
 
32
37
  def zip_file_name
33
- "#{File.basename(path)}-#{Lono::Md5.sum(path)}.zip"
38
+ "#{File.basename(path)}-#{@type}-#{Lono::Md5.sum(path)}.zip"
34
39
  end
35
40
 
36
41
  private
@@ -14,15 +14,15 @@ class Lono::Template
14
14
  def replacements
15
15
  map = {}
16
16
  registry_items.each do |item|
17
- if item.directory? || item.file?
18
- replacement = item.s3_path
17
+ if item.type == "lambda_layer"
18
+ placeholder = "file://app/files/lambda_layer/#{item.name}"
19
+ elsif item.directory? || item.file?
20
+ placeholder = "file://app/files/file/#{item.name}"
19
21
  else
20
22
  puts "WARN: PostProcessor replacements Cannot find file: #{item.path}"
21
23
  next
22
24
  end
23
-
24
- placeholder = "file://app/files/#{item.name}"
25
- map[placeholder] = replacement
25
+ map[placeholder] = item.s3_path
26
26
  end
27
27
  map
28
28
  end
@@ -4,10 +4,12 @@ module Lono::Template::Strategy::Dsl::Builder::Helpers
4
4
  Lono::S3::Bucket.name
5
5
  end
6
6
 
7
- def file_s3_key(name, options={})
7
+ def s3_key(name, options={})
8
+ default = {type: "file"}
9
+ options.reverse_merge!(default)
8
10
  Lono::AppFile::Registry.register(name, @blueprint, options)
9
- "file://app/files/#{name}" # placeholder for post processing
11
+ "file://app/files/#{options[:type]}/#{name}" # placeholder for post processing
10
12
  end
11
- alias_method :s3_key, :file_s3_key
13
+ alias_method :file_s3_key, :s3_key
12
14
  end
13
15
  end
@@ -1,3 +1,3 @@
1
1
  module Lono
2
- VERSION = "7.2.3"
2
+ VERSION = "7.3.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lono
3
3
  version: !ruby/object:Gem::Version
4
- version: 7.2.3
4
+ version: 7.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tung Nguyen
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-03-10 00:00:00.000000000 Z
11
+ date: 2020-03-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -450,6 +450,8 @@ files:
450
450
  - lib/lono/api/verify.rb
451
451
  - lib/lono/app_file/base.rb
452
452
  - lib/lono/app_file/build.rb
453
+ - lib/lono/app_file/build/lambda_layer.rb
454
+ - lib/lono/app_file/build/lambda_layer/ruby_packager.rb
453
455
  - lib/lono/app_file/registry.rb
454
456
  - lib/lono/app_file/registry/item.rb
455
457
  - lib/lono/app_file/upload.rb