lambda-layer-cake 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c2e83a6e8260e73527a3adb0d302da0ff59bfe734f165b8c3a5ae2b02c874225
4
- data.tar.gz: f3702b522dfae36a3cfab37f5642d9d8618de5c2c82b44cbe7e5c5106c8f6269
3
+ metadata.gz: ad779537dd417dd3ddb16ca96ece7692dbf38aedff64ee95ae37a712b0fd5d33
4
+ data.tar.gz: 3330511939df7a90a960711dc55bddd7e3f13ee187d0020febcba01ca7293f98
5
5
  SHA512:
6
- metadata.gz: 29f5718a159d316a2de9a5785d173dfa1c78332d318531b358970aa67baa4ffc2c42416518056a35a7df3b74585e49237c6386d74ebdce07f65a1b7583f5e9d5
7
- data.tar.gz: a8590370365b683367f81829d1992a0ec32e049368b9c92a7002c7e819c001ae2e6c896e6ecbebfc80ab29d04ab6b11ee94f271e38c6a6b7bbe883e54a0a4b7d
6
+ metadata.gz: a38a3e6ea2694cb6de54d490d940529c498bfb2f6b3f5974f6c3f89487aedec0e7e2d8855a1cf16b19ae4f9f9fb5e53d45027a833c8d4b2930a96b4895922523
7
+ data.tar.gz: 99b148c4bc9f65e3c911a42a1b4be725bd3aa5fb2c2abe18918a9c5413ac6a431012899f4084c5b70a9b53ba9d9c873328da6426f923b8dbd541710013c4098d
data/README.md CHANGED
@@ -9,10 +9,31 @@ This gem does just the packaging of the app and leaves deployment as an exercise
9
9
  ## Usage
10
10
 
11
11
  1. Include Lamby and this gem in your Rails app's Gemfile.
12
- 1. Create an `app.rb` in the root of your project per Lamby instructions to implement a Lambda handler.
12
+
13
+ gem 'lambda-layer-cake'
14
+ gem 'lamby'
15
+
16
+ 1. Create an `app.rb` in the root of your project that contains (stock Lamby app.rb with an extra line for Bundler config):
17
+
18
+ ```ruby
19
+ # This line tells Bundler where the Layer Cake gems are located
20
+ ENV['BUNDLE_PATH'] = 'vendor/bundle/ruby/2.5.0'
21
+
22
+ require_relative 'config/boot'
23
+ require 'lamby'
24
+ require_relative 'config/application'
25
+ require_relative 'config/environment'
26
+
27
+ $app = Rack::Builder.new { run Rails.application }.to_app
28
+
29
+ def handler(event:, context:)
30
+ Lamby.handler $app, event, context, rack: :api
31
+ end
32
+ ```
33
+
13
34
  1. If you need extra system packages (such as `postgresql-libs` for the `pg` gem), create a file called `system-packages.txt` in the root of your Rails project and include package names, one per line.
14
35
  1. When you are ready to deploy your app, use `rake .layer_cake/layer.zip` and `rake .layer_cake/app.zip` to build files suitable for deployment to Lambda.
15
- 1. Use the the demployment tools of your choice to deploy the app.
36
+ 1. Use the the demployment tools of your choice to define a Lambda function. The `layer.zip`
16
37
 
17
38
 
18
39
  ## How It Works
@@ -30,7 +51,9 @@ This is my first attempt at publishing a complete gem and Rails plugin. I took i
30
51
  Contributions on the following items is particularly appreciated:
31
52
 
32
53
  * Modifying the Docker build environment to probe the host system's cache of gemfiles to more gracefully handle private and unreleased gems
33
- * A `clean` Rake task
54
+ * Give proper names to the rake tasks
55
+ * A better `clean` Rake task
56
+ * Under some circumstances, `app.zip` does rebuild due to not detecting dependencies
34
57
 
35
58
  ## License
36
59
  The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
@@ -18,6 +18,7 @@ def main
18
18
  if(File.exist?('system-packages.txt'))
19
19
  STDERR.puts("Installing System Packages")
20
20
  build_deps = File.read("system-packages.txt").split
21
+ STDERR.puts("Packages: #{build_deps.join(',')}")
21
22
  unless(system("yum", "install", "-y", *(build_deps)))
22
23
  STDERR.puts("Could not install build dependency pacakges")
23
24
  exit 2
@@ -25,8 +26,8 @@ def main
25
26
  end
26
27
 
27
28
  STDERR.puts("Building Gems")
28
- FileUtils.mkdir_p("/tmp/build")
29
- unless(system("bundle","install","--deployment","--path=/tmp/build"))
29
+ FileUtils.mkdir_p("/tmp/build/bundle")
30
+ unless(system("bundle","install","--deployment","--path=/tmp/build/bundle"))
30
31
  STDERR.puts("Couldn't build gems")
31
32
  exit 3
32
33
  end
@@ -66,10 +67,12 @@ def main
66
67
  FileUtils.mkdir_p('/tmp/outputs/lib')
67
68
  FileUtils.cp(libs.to_a, '/tmp/outputs/lib')
68
69
 
69
- STDERR.puts("Moving gems into place")
70
- FileUtils.mkdir_p('/tmp/outputs/ruby/gems/2.5.0')
71
- #Skip the cache directory since it's not needed at runtime
72
- FileUtils.cp_r(Dir["/tmp/build/ruby/2.5.0/*"] - ["/tmp/build/ruby/2.5.0/cache"], "/tmp/outputs/ruby/gems/2.5.0/")
70
+ #This directory is not needed at runtime
71
+ STDERR.puts("Removing extra files (skipping)")
72
+ FileUtils.rm_rf("/tmp/build/bundle/ruby/2.5.0/cache")
73
+
74
+ STDERR.puts("Moving Bundle into place")
75
+ FileUtils.cp_r("/tmp/build/bundle", "/tmp/outputs")
73
76
 
74
77
  STDERR.puts("All Done!")
75
78
  end
@@ -1,70 +1,3 @@
1
1
  module LambdaLayerCake
2
2
  require 'lambda_layer_cake/railtie' if defined?(Rails)
3
-
4
- class Builder
5
- attr :version
6
-
7
- def initialize(version)
8
- @version = version
9
- end
10
-
11
- def clean!
12
- FileUtils.rm_r(outputs_dir!)
13
- end
14
-
15
- def build_layer!
16
- FileUtils.cp(%w{Gemfile Gemfile.lock system-packages.txt}.select {|f| File.exist?(f) }, inputs_dir!)
17
-
18
- cmd = %W{docker run --rm
19
- -v #{inputs_dir!}:/tmp/inputs
20
- -v #{outputs_dir!}:/tmp/outputs
21
- -v #{tools_dir}:/var/task
22
- lambci/lambda:build-ruby2.5 ruby build_ruby.rb}
23
- STDERR.puts("Excuting cmd: #{cmd.join(' ')}")
24
- system(*cmd) or raise
25
- end
26
-
27
- def zip_layer!
28
- pwd = Dir.pwd
29
- begin
30
- Dir.chdir(outputs_dir!)
31
- cmd = *%W{zip -r #{File.join(build_dir!, "layer-#{version}.zip")} lib ruby}
32
- system(*cmd) or raise
33
- ensure
34
- Dir.chdir(pwd)
35
- end
36
- end
37
-
38
- def build_rails!
39
-
40
- end
41
-
42
- private
43
-
44
- def inputs_dir!
45
- working_dir!("layer_inputs")
46
- end
47
-
48
- def outputs_dir!
49
- working_dir!("layer-#{version}")
50
- end
51
-
52
- def working_dir!(path_suffix = "")
53
- File.expand_path(
54
- File.join(
55
- Rails.root,
56
- '.layer_cake/',
57
- path_suffix
58
- )
59
- ).tap { |d| FileUtils.mkdir_p(d) }
60
- end
61
-
62
- def tools_dir
63
- File.expand_path(__dir__ + "/../build_env") # Never needs to be created
64
- end
65
-
66
- def build_dir!
67
- working_dir!
68
- end
69
- end
70
3
  end
@@ -0,0 +1,142 @@
1
+ module LambdaLayerCake
2
+ class RakeHelper
3
+ include Rake::DSL
4
+
5
+ #Files used to generate the gem layer
6
+ INPUT_FILES = Rake::FileList.new(
7
+ ['Gemfile', 'Gemfile.lock', 'system-packages.txt'].collect { |f| File.join(Rails.root, f) }
8
+ )
9
+
10
+
11
+ #Files used to generate the
12
+ APP_FILES = Rake::FileList.new(Dir['*'] - ['spec','test','log', 'tmp'])
13
+ OUTPUT_DIR = File.expand_path(File.join(Rails.root,'.layer_cake/'))
14
+
15
+ def layer_directory
16
+ ".layer_cake/layer-#{input_hash}"
17
+ end
18
+ def layer_dependencies
19
+ INPUT_FILES.existing
20
+ end
21
+ def layer_build
22
+ FileUtils.mkdir_p(inputs_dir)
23
+ FileUtils.cp(INPUT_FILES.existing, inputs_dir)
24
+
25
+ cmd = %W{docker run --rm
26
+ -v #{inputs_dir}:/tmp/inputs
27
+ -v #{outputs_dir}:/tmp/outputs
28
+ -v #{File.expand_path(__dir__ + "/../../build_env")}:/var/task
29
+ lambci/lambda:#{docker_tag} ruby build_ruby.rb}
30
+ STDERR.puts("Excuting cmd: #{cmd.join(' ')}")
31
+ system(*cmd) or raise
32
+ end
33
+
34
+ def layer_task_definitions!
35
+ desc "Builds a layer.zip with gems and libraries"
36
+ task build_layer: ".layer_cake/layer.zip"
37
+
38
+ desc "Build a layer for version #{input_hash}"
39
+ directory ".layer_cake/layer-#{input_hash}"
40
+ file ".layer_cake/layer-#{input_hash}" => layer_dependencies do
41
+ layer_build
42
+ end
43
+
44
+ file ".layer_cake/layer-#{input_hash}.zip" => ".layer_cake/layer-#{input_hash}" do
45
+ pwd = Dir.pwd
46
+ begin
47
+ Dir.chdir(outputs_dir)
48
+ cmd = %W{zip -r #{File.join(working_dir, "layer-#{input_hash}.zip")} lib bundle}
49
+ system(*cmd) or raise
50
+ ensure
51
+ Dir.chdir(pwd)
52
+ end
53
+ end
54
+
55
+ desc "Build the current layer version and symlink it to the versioned zip"
56
+ file ".layer_cake/layer.zip": ".layer_cake/layer-#{input_hash}.zip" do
57
+ FileUtils.ln_s("layer-#{input_hash}.zip",".layer_cake/layer.zip", force: true)
58
+ end
59
+ end
60
+
61
+ def app_task_definitions!
62
+ desc "Zip up Rails directory into an app"
63
+ file ".layer_cake/app.zip": APP_FILES do
64
+ FileUtils.mkdir_p(working_dir)
65
+
66
+ cmd = %W{zip -r .layer_cake/app.zip} + APP_FILES
67
+ system(*cmd) or raise
68
+
69
+ #Insert a symlink into the app.zip
70
+ FileUtils.rm_r(working_dir("app/")) if(File.exists?(working_dir("app")))
71
+ FileUtils.mkdir_p(working_dir("app/vendor"))
72
+ FileUtils.ln_s("/tmp", working_dir("app/tmp"))
73
+ FileUtils.ln_s("/opt/bundle", working_dir("app/vendor/bundle"), force: true)
74
+ Dir.chdir(working_dir("app")) do
75
+ system(*((%W{zip --symlinks -r} << working_dir("app.zip")) + Dir["*"])) or raise
76
+ end
77
+ end
78
+ end
79
+
80
+ def version_task_definitions!
81
+ desc "Output the version hash for the current input files (Gemfile, Gemfile.lock, system-packages.txt)"
82
+ task :version do
83
+ $stdout.write input_hash
84
+ end
85
+
86
+ desc "Reports the ruby version of the lambda environment"
87
+ task :ruby_version do
88
+ $stdout.write ruby_version
89
+ end
90
+
91
+ end
92
+
93
+ def clean_task_definitions!
94
+ desc "Clean out intermediate files"
95
+ task :clean do
96
+ FileUtils.rm_r(working_dir) if File.exists?(working_dir)
97
+ end
98
+ end
99
+
100
+ private
101
+ # Some helper methods
102
+ def input_hash
103
+ @input_hash ||= begin
104
+ hash = Digest::SHA1.hexdigest(INPUT_FILES.existing.collect do |f|
105
+ File.read(f)
106
+ end.join("\x1C"))
107
+ hash[0..7]
108
+ end
109
+ end
110
+
111
+ def inputs_dir
112
+ working_dir("layer_inputs")
113
+ end
114
+
115
+ def outputs_dir
116
+ working_dir("layer-#{input_hash}")
117
+ end
118
+
119
+ def working_dir(path_suffix = "")
120
+ File.expand_path(
121
+ File.join(
122
+ OUTPUT_DIR,
123
+ path_suffix
124
+ )
125
+ )
126
+ end
127
+
128
+ def docker_tag
129
+ "build-ruby#{/^\d+\.\d+/.match(RUBY_VERSION)[0]}"
130
+ end
131
+
132
+ def ruby_version
133
+ cmd = %W{docker run --rm
134
+ -v #{inputs_dir}:/tmp/inputs
135
+ -v #{outputs_dir}:/tmp/outputs
136
+ -v #{File.expand_path(__dir__ + "/../../build_env")}:/var/task
137
+ lambci/lambda:#{docker_tag} ruby -e }.push '$stdout.write RUBY_VERSION'
138
+ STDERR.puts("Excuting cmd: #{cmd.join(' ')}")
139
+ system(*cmd) or raise
140
+ end
141
+ end
142
+ end
@@ -1,3 +1,3 @@
1
1
  module LambdaLayerCake
2
- VERSION = '0.1.0'
2
+ VERSION = '0.2.0'
3
3
  end
@@ -3,90 +3,13 @@ require 'fileutils'
3
3
 
4
4
  require 'rake/packagetask'
5
5
 
6
- namespace :layer_cake do
7
- desc 'Clean the build directories'
8
- task :clean do
9
- LambdaLayerCake.clean!
10
- end
11
-
12
- #Files used to generate the gem layer
13
- INPUT_FILES = Rake::FileList.new(
14
- ['Gemfile', 'Gemfile.lock', 'system-packages.txt'].collect { |f| File.join(Rails.root, f) }
15
- )
16
- #Files used to generate the
17
- APP_FILES = Rake::FileList.new(Dir['*'] - ['spec','test','log', 'tmp'])
18
- OUTPUT_DIR = '.layer_cake'
19
-
20
- # Some helper methods
21
- def self.input_hash
22
- @input_hash ||= begin
23
- hash = Digest::SHA1.hexdigest(INPUT_FILES.existing.collect do |f|
24
- File.read(f)
25
- end.join("\x1C"))
26
- hash[0..7]
27
- end
28
- end
29
-
30
- def inputs_dir
31
- working_dir("layer_inputs")
32
- end
33
-
34
- def outputs_dir
35
- working_dir("layer-#{input_hash}")
36
- end
37
-
38
- def working_dir(path_suffix = "")
39
- File.expand_path(
40
- File.join(
41
- Rails.root,
42
- '.layer_cake/',
43
- path_suffix
44
- )
45
- )
46
- end
47
-
48
- desc "Output the version hash for the current input files (Gemfile, Gemfile.lock, system-packages.txt)"
49
- task :version do
50
- $stdout.write input_hash
51
- end
52
-
53
- desc "Builds a layer.zip with gems and libraries"
54
- task build_layer: '.layer_cake/layer.zip'
55
-
56
- desc "Build a layer for version #{input_hash}"
57
- directory ".layer_cake/layer-#{input_hash}"
58
- file ".layer_cake/layer-#{input_hash}": INPUT_FILES.existing do
59
- FileUtils.mkdir_p(inputs_dir)
60
- FileUtils.cp(INPUT_FILES.existing, inputs_dir)
6
+ require 'lambda_layer_cake/rake_helper'
61
7
 
62
- cmd = %W{docker run --rm
63
- -v #{inputs_dir}:/tmp/inputs
64
- -v #{outputs_dir}:/tmp/outputs
65
- -v #{File.expand_path(__dir__ + "/../../build_env")}:/var/task
66
- lambci/lambda:build-ruby2.5 ruby build_ruby.rb}
67
- STDERR.puts("Excuting cmd: #{cmd.join(' ')}")
68
- system(*cmd) or raise
69
- end
70
-
71
- file ".layer_cake/layer-#{input_hash}.zip": ".layer_cake/layer-#{input_hash}" do
72
- pwd = Dir.pwd
73
- begin
74
- Dir.chdir(outputs_dir)
75
- cmd = %W{zip -r #{File.join(working_dir, "layer-#{input_hash}.zip")} lib ruby}
76
- system(*cmd) or raise
77
- ensure
78
- Dir.chdir(pwd)
79
- end
80
- end
81
-
82
- desc "Build the current layer version and symlink it to the versioned zip"
83
- file ".layer_cake/layer.zip": ".layer_cake/layer-#{input_hash}.zip" do
84
- FileUtils.ln_s("layer-#{input_hash}.zip",".layer_cake/layer.zip", force: true)
85
- end
86
-
87
- desc "Zip up Rails directory into an app"
88
- file ".layer_cake/app.zip": APP_FILES do
89
- cmd = %W{zip -r .layer_cake/app.zip} + APP_FILES
90
- system(*cmd) or raise
8
+ namespace :layer_cake do
9
+ LambdaLayerCake::RakeHelper.new.tap do |rh|
10
+ rh.clean_task_definitions!
11
+ rh.version_task_definitions!
12
+ rh.layer_task_definitions!
13
+ rh.app_task_definitions!
91
14
  end
92
15
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lambda-layer-cake
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Logan Bowers
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-09-13 00:00:00.000000000 Z
11
+ date: 2020-07-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec
@@ -38,6 +38,20 @@ dependencies:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rubyzip
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
41
55
  description: A set of Rake tasks to bundle Rails apps for use on AWS Lambda
42
56
  email:
43
57
  - logan@datacurrent.com
@@ -52,13 +66,14 @@ files:
52
66
  - build_env/installed-packages.txt
53
67
  - lib/lambda-layer-cake.rb
54
68
  - lib/lambda_layer_cake/railtie.rb
69
+ - lib/lambda_layer_cake/rake_helper.rb
55
70
  - lib/lambda_layer_cake/version.rb
56
71
  - lib/tasks/layer_cake.rake
57
72
  homepage: http://github.com/loganb/lambda-layer-cake
58
73
  licenses:
59
74
  - MIT
60
75
  metadata: {}
61
- post_install_message:
76
+ post_install_message:
62
77
  rdoc_options: []
63
78
  require_paths:
64
79
  - lib
@@ -73,9 +88,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
73
88
  - !ruby/object:Gem::Version
74
89
  version: '0'
75
90
  requirements: []
76
- rubyforge_project:
77
- rubygems_version: 2.7.10
78
- signing_key:
91
+ rubygems_version: 3.1.2
92
+ signing_key:
79
93
  specification_version: 4
80
94
  summary: A set of Rake tasks to bundle Rails apps for use on AWS Lambda
81
95
  test_files: []