lambda-layer-cake 0.1.0 → 0.1.1

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: '0929fa88af212b2adbd2434aa1f75518fa50990c7b0ec5e1145153d76fde16b8'
4
+ data.tar.gz: 2322e1e5922ddf716815de7cb850efa1295947430938de80e167def203b006aa
5
5
  SHA512:
6
- metadata.gz: 29f5718a159d316a2de9a5785d173dfa1c78332d318531b358970aa67baa4ffc2c42416518056a35a7df3b74585e49237c6386d74ebdce07f65a1b7583f5e9d5
7
- data.tar.gz: a8590370365b683367f81829d1992a0ec32e049368b9c92a7002c7e819c001ae2e6c896e6ecbebfc80ab29d04ab6b11ee94f271e38c6a6b7bbe883e54a0a4b7d
6
+ metadata.gz: e823aee747d165029b115ff61455a0354d4cd33e9c73084e65b62a0199bd14ca75520ff026884e9ac59ac5c9dd5370d09b90311fb7ddb049cfa4f0750a95783b
7
+ data.tar.gz: fd1b85928ef49acd74b93408994bfb5513c51d06d8166d14d3e96ce38d102cbed9faeb090f94d81dbce6b63a66183a6c62e34d72729ff31544808856bc087e29
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).
@@ -25,8 +25,8 @@ def main
25
25
  end
26
26
 
27
27
  STDERR.puts("Building Gems")
28
- FileUtils.mkdir_p("/tmp/build")
29
- unless(system("bundle","install","--deployment","--path=/tmp/build"))
28
+ FileUtils.mkdir_p("/tmp/build/bundle")
29
+ unless(system("bundle","install","--deployment","--path=/tmp/build/bundle"))
30
30
  STDERR.puts("Couldn't build gems")
31
31
  exit 3
32
32
  end
@@ -66,10 +66,11 @@ def main
66
66
  FileUtils.mkdir_p('/tmp/outputs/lib')
67
67
  FileUtils.cp(libs.to_a, '/tmp/outputs/lib')
68
68
 
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/")
69
+ STDERR.puts("Moving Bundle into place")
70
+ FileUtils.cp_r("/tmp/build/bundle", "/tmp/outputs")
71
+ #This directory is not needed at runtime
72
+ #STDERR.puts("Removing extra files")
73
+ #FileUtils.rm_rf("/tmp/outputs/bundle/ruby/2.5.0/cache")
73
74
 
74
75
  STDERR.puts("All Done!")
75
76
  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,121 @@
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:build-ruby2.5 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.mkdir_p(working_dir("app/vendor"))
71
+ FileUtils.ln_s("/tmp", working_dir("app/tmp"))
72
+ FileUtils.ln_s("/opt/bundle", working_dir("app/vendor/bundle"), force: true)
73
+ Dir.chdir(working_dir("app")) do
74
+ system(*((%W{zip --symlinks -r} << working_dir("app.zip")) + Dir["*"])) or raise
75
+ end
76
+ end
77
+ end
78
+
79
+ def version_task_definitions!
80
+ desc "Output the version hash for the current input files (Gemfile, Gemfile.lock, system-packages.txt)"
81
+ task :version do
82
+ $stdout.write input_hash
83
+ end
84
+ end
85
+
86
+ def clean_task_definitions!
87
+ desc "Clean out intermediate files"
88
+ task :clean do
89
+ FileUtils.rm_r(working_dir) if File.exists?(working_dir)
90
+ end
91
+ end
92
+
93
+ private
94
+ # Some helper methods
95
+ def input_hash
96
+ @input_hash ||= begin
97
+ hash = Digest::SHA1.hexdigest(INPUT_FILES.existing.collect do |f|
98
+ File.read(f)
99
+ end.join("\x1C"))
100
+ hash[0..7]
101
+ end
102
+ end
103
+
104
+ def inputs_dir
105
+ working_dir("layer_inputs")
106
+ end
107
+
108
+ def outputs_dir
109
+ working_dir("layer-#{input_hash}")
110
+ end
111
+
112
+ def working_dir(path_suffix = "")
113
+ File.expand_path(
114
+ File.join(
115
+ OUTPUT_DIR,
116
+ path_suffix
117
+ )
118
+ )
119
+ end
120
+ end
121
+ end
@@ -1,3 +1,3 @@
1
1
  module LambdaLayerCake
2
- VERSION = '0.1.0'
2
+ VERSION = '0.1.1'
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.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Logan Bowers
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-09-13 00:00:00.000000000 Z
11
+ date: 2019-09-19 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,6 +66,7 @@ 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