lambda-layer-cake 0.1.0 → 0.2.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: 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: []