Class: LambdaLayerCake::RakeHelper

Inherits:
Object
  • Object
show all
Includes:
Rake::DSL
Defined in:
lib/lambda_layer_cake/rake_helper.rb

Constant Summary collapse

INPUT_FILES =

Files used to generate the gem layer

Rake::FileList.new(
  ['Gemfile', 'Gemfile.lock', 'system-packages.txt'].collect { |f| File.join(Rails.root, f) }
)
APP_FILES =

Files used to generate the

Rake::FileList.new(Dir['*'] - ['spec','test','log', 'tmp'])
OUTPUT_DIR =
File.expand_path(File.join(Rails.root,'.layer_cake/'))

Instance Method Summary collapse

Instance Method Details

#app_task_definitions!Object



61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
# File 'lib/lambda_layer_cake/rake_helper.rb', line 61

def app_task_definitions!
  desc "Zip up Rails directory into an app"
  file ".layer_cake/app.zip": APP_FILES do
    FileUtils.mkdir_p(working_dir)

    cmd = %W{zip -r .layer_cake/app.zip}  + APP_FILES
    system(*cmd) or raise
    
    #Insert a symlink into the app.zip
    FileUtils.rm_r(working_dir("app/")) if(File.exists?(working_dir("app")))
    FileUtils.mkdir_p(working_dir("app/vendor"))
    FileUtils.ln_s("/tmp", working_dir("app/tmp"))
    FileUtils.ln_s("/opt/bundle", working_dir("app/vendor/bundle"), force: true)
    Dir.chdir(working_dir("app")) do
      system(*((%W{zip --symlinks -r} << working_dir("app.zip")) + Dir["*"])) or raise
    end
  end    
end

#clean_task_definitions!Object



93
94
95
96
97
98
# File 'lib/lambda_layer_cake/rake_helper.rb', line 93

def clean_task_definitions!
  desc "Clean out intermediate files"
  task :clean do
    FileUtils.rm_r(working_dir) if File.exists?(working_dir)
  end
end

#layer_buildObject



21
22
23
24
25
26
27
28
29
30
31
32
# File 'lib/lambda_layer_cake/rake_helper.rb', line 21

def layer_build
  FileUtils.mkdir_p(inputs_dir)
  FileUtils.cp(INPUT_FILES.existing, inputs_dir)
  
  cmd = %W{docker run --rm
    -v #{inputs_dir}:/tmp/inputs 
    -v #{outputs_dir}:/tmp/outputs 
    -v #{File.expand_path(__dir__ + "/../../build_env")}:/var/task 
    lambci/lambda:#{docker_tag} ruby build_ruby.rb}
  STDERR.puts("Excuting cmd: #{cmd.join(' ')}")
  system(*cmd) or raise    
end

#layer_dependenciesObject



18
19
20
# File 'lib/lambda_layer_cake/rake_helper.rb', line 18

def layer_dependencies
  INPUT_FILES.existing
end

#layer_directoryObject



15
16
17
# File 'lib/lambda_layer_cake/rake_helper.rb', line 15

def layer_directory
  ".layer_cake/layer-#{input_hash}"
end

#layer_task_definitions!Object



34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# File 'lib/lambda_layer_cake/rake_helper.rb', line 34

def layer_task_definitions!
  desc "Builds a layer.zip with gems and libraries"
  task build_layer: ".layer_cake/layer.zip"

  desc "Build a layer for version #{input_hash}"
  directory ".layer_cake/layer-#{input_hash}"
  file ".layer_cake/layer-#{input_hash}" => layer_dependencies do
    layer_build
  end

  file ".layer_cake/layer-#{input_hash}.zip" => ".layer_cake/layer-#{input_hash}" do
    pwd = Dir.pwd
    begin
      Dir.chdir(outputs_dir)
      cmd = %W{zip -r #{File.join(working_dir, "layer-#{input_hash}.zip")} lib bundle}
      system(*cmd) or raise
    ensure
      Dir.chdir(pwd)
    end
  end

  desc "Build the current layer version and symlink it to the versioned zip"
  file ".layer_cake/layer.zip": ".layer_cake/layer-#{input_hash}.zip" do
    FileUtils.ln_s("layer-#{input_hash}.zip",".layer_cake/layer.zip", force: true)
  end
end

#version_task_definitions!Object



80
81
82
83
84
85
86
87
88
89
90
91
# File 'lib/lambda_layer_cake/rake_helper.rb', line 80

def version_task_definitions!
  desc "Output the version hash for the current input files (Gemfile, Gemfile.lock, system-packages.txt)"
  task :version do
    $stdout.write input_hash
  end

  desc "Reports the ruby version of the lambda environment"
  task :ruby_version do
    $stdout.write ruby_version
  end

end