jets 1.3.9 → 1.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (35) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +5 -0
  3. data/Gemfile.lock +3 -3
  4. data/lib/jets.rb +1 -0
  5. data/lib/jets/booter.rb +12 -1
  6. data/lib/jets/builders/code_builder.rb +39 -35
  7. data/lib/jets/builders/code_size.rb +4 -2
  8. data/lib/jets/builders/gem_replacer.rb +7 -20
  9. data/lib/jets/builders/lambda_layer.rb +55 -37
  10. data/lib/jets/builders/rack_packager.rb +6 -4
  11. data/lib/jets/builders/ruby_packager.rb +8 -27
  12. data/lib/jets/builders/shim_vars/base.rb +0 -4
  13. data/lib/jets/builders/util.rb +6 -7
  14. data/lib/jets/commands/deploy.rb +1 -2
  15. data/lib/jets/commands/import/rail.rb +1 -34
  16. data/lib/jets/core.rb +3 -2
  17. data/lib/jets/turbo.rb +47 -0
  18. data/lib/jets/turbo/database_yaml.rb +41 -0
  19. data/lib/jets/turbo/project/.gitignore +12 -0
  20. data/lib/jets/turbo/project/.jetskeep +1 -0
  21. data/lib/jets/turbo/project/Gemfile +16 -0
  22. data/lib/jets/turbo/project/Gemfile.lock +184 -0
  23. data/lib/jets/turbo/project/Rakefile +2 -0
  24. data/lib/jets/turbo/project/app/controllers/application_controller.rb +2 -0
  25. data/lib/jets/turbo/project/app/helpers/application_helper.rb +2 -0
  26. data/lib/jets/turbo/project/app/jobs/application_job.rb +4 -0
  27. data/lib/jets/turbo/project/config.ru +5 -0
  28. data/lib/jets/turbo/project/config/application.rb +4 -0
  29. data/lib/jets/turbo/project/config/routes.rb +4 -0
  30. data/lib/jets/turbo/rail.rb +113 -0
  31. data/lib/jets/turbo/templates/config/database.yml +26 -0
  32. data/lib/jets/version.rb +1 -1
  33. data/vendor/jets-gems/lib/jets/gems/check.rb +18 -9
  34. data/vendor/jets-gems/lib/jets/gems/extract/gem.rb +1 -1
  35. metadata +17 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5de0cb4913504da995988d705fc03c5248d398fbd2538d3ec356ee89124dd38f
4
- data.tar.gz: abb22eb7ac6a16faa1914835e9c68c86263693cdd92aaebec44edda63a562e14
3
+ metadata.gz: ec914295c99192ef042110202c7ac3161003e644fb73a7b24cc196884d6295ae
4
+ data.tar.gz: 716b93e31d27fa740b11bfba46db5a5af8b344d0e8877363ad07a49d50728032
5
5
  SHA512:
6
- metadata.gz: b7f26985d0b5dde339f8e887f508938e1565a306214520b563ebdd4c32fd87c0f05ff8f12366c35b9204e3fb35085fe959f852bb1255c99f673c896c94ccb227
7
- data.tar.gz: ad759caa51dae3942176697965c0313a699702415c44c5f9d4eaf329028e72acc9702ce357c269fa3ebee95f5ee07e46d3af216fc518f5702cf91dd4ae78736c
6
+ metadata.gz: fc7e956e2c6a675fc14d325f3207d10cecb16d29a54e7ef81679de2161feff423055bbef8e0b25071dc059a9c57c4205a5d8d20094d0fe46315deed8b58f8062
7
+ data.tar.gz: 05067666cbda6be6986a12fc1acd6f757f8c33f8fa12a3debfe7182f72d1b08a17bd7321d0c23a2e2d0f827e19c7b16ea6386a2e4a177d71e66af16b41f42d42
@@ -3,6 +3,11 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  This project *loosely tries* to adhere to [Semantic Versioning](http://semver.org/), even before v1.0.
5
5
 
6
+ ## [1.4.0]
7
+ - Afterburner mode: Allows you to deploy from within a Rails app
8
+ - #110 from tongueroo/jet-pack: Turbo charge mode: enabling afterburner
9
+ - Afterburner is recommended over Mega Mode.
10
+
6
11
  ## [1.3.9]
7
12
  - #106 from eamsc/sqs-special-map
8
13
  - #107 from eamsc/sqs-resource
@@ -11,7 +11,7 @@ GIT
11
11
  PATH
12
12
  remote: .
13
13
  specs:
14
- jets (1.3.9)
14
+ jets (1.4.0)
15
15
  actionpack (>= 5.2.1)
16
16
  actionview (>= 5.2.1)
17
17
  activerecord (>= 5.2.1)
@@ -113,7 +113,7 @@ GEM
113
113
  gems (1.1.1)
114
114
  json
115
115
  hashie (3.6.0)
116
- i18n (1.2.0)
116
+ i18n (1.3.0)
117
117
  concurrent-ruby (~> 1.0)
118
118
  jmespath (1.4.0)
119
119
  json (2.1.0)
@@ -123,7 +123,7 @@ GEM
123
123
  nokogiri (>= 1.5.9)
124
124
  memoist (0.16.0)
125
125
  method_source (0.9.2)
126
- mimemagic (0.3.2)
126
+ mimemagic (0.3.3)
127
127
  mini_portile2 (2.4.0)
128
128
  minitest (5.11.3)
129
129
  mysql2 (0.5.2)
@@ -50,6 +50,7 @@ module Jets
50
50
  autoload :Stack, "jets/stack"
51
51
  autoload :TmpLoader, "jets/tmp_loader"
52
52
  autoload :Turbine, 'jets/turbine'
53
+ autoload :Turbo, 'jets/turbo'
53
54
  autoload :Util, "jets/util"
54
55
 
55
56
  extend Core # root, logger, etc
@@ -4,8 +4,9 @@ class Jets::Booter
4
4
  def boot!(options={})
5
5
  return if @booted
6
6
 
7
+ turbo_charge
7
8
  confirm_jets_project!
8
- require_bundle_gems
9
+ require_bundle_gems unless bypass_bundler_setup?
9
10
  Jets::Dotenv.load!
10
11
 
11
12
  Jets.application.setup!
@@ -20,6 +21,16 @@ class Jets::Booter
20
21
  @booted = true
21
22
  end
22
23
 
24
+ def bypass_bundler_setup?
25
+ command = ARGV.first
26
+ %w[build delete deploy].include?(command)
27
+ end
28
+
29
+ def turbo_charge
30
+ turbo = Jets::Turbo.new
31
+ turbo.charge
32
+ end
33
+
23
34
  # Builds and memoize stack so it only gets built on bootup
24
35
  def build_middleware_stack
25
36
  Jets.application.build_stack
@@ -35,7 +35,7 @@ class Jets::Builders
35
35
  compile_assets # easier to do before we copy the project because node and yarn has been likely setup in the that dir
36
36
  compile_rails_assets
37
37
  copy_project
38
- Dir.chdir(full(tmp_code)) do
38
+ Dir.chdir("#{stage_area}/code") do
39
39
  # These commands run from project root
40
40
  code_setup
41
41
  package_ruby
@@ -47,7 +47,7 @@ class Jets::Builders
47
47
  # to reference files with the md5 checksum. The files are the:
48
48
  #
49
49
  # jets/code/rack-checksum.zip
50
- # jets/code/bundled-checksum.zip
50
+ # jets/code/opt-checksum.zip
51
51
  #
52
52
  # We compute the checksums before we generate the node shim handlers.
53
53
  def calculate_md5s
@@ -86,10 +86,6 @@ class Jets::Builders
86
86
  end
87
87
  end
88
88
 
89
- def stage_area
90
- "#{Jets.build_root}/stage"
91
- end
92
-
93
89
  def code_setup
94
90
  reconfigure_development_webpacker
95
91
  end
@@ -101,19 +97,12 @@ class Jets::Builders
101
97
  copy_internal_jets_code
102
98
 
103
99
  # Code prep and zipping
104
- build_lambda_layer
105
100
  check_code_size!
106
101
  calculate_md5s # must be called before generate_node_shims and create_zip_files
107
102
  generate_node_shims
108
103
  create_zip_files
109
104
  end
110
105
 
111
- def build_lambda_layer
112
- return if Jets.poly_only?
113
- lambda_layer = LambdaLayer.new
114
- lambda_layer.build
115
- end
116
-
117
106
  def check_code_size!
118
107
  CodeSize.check!
119
108
  end
@@ -125,7 +114,7 @@ class Jets::Builders
125
114
  files = []
126
115
  files.each do |relative_path|
127
116
  src = File.expand_path("../internal/#{relative_path}", File.dirname(__FILE__))
128
- dest = "#{full(tmp_code)}/#{relative_path}"
117
+ dest = "#{"#{stage_area}/code"}/#{relative_path}"
129
118
  FileUtils.mkdir_p(File.dirname(dest))
130
119
  FileUtils.cp(src, dest)
131
120
  end
@@ -145,12 +134,11 @@ class Jets::Builders
145
134
  # At this point the minimal stack exists, so we can grab it with the AWS API.
146
135
  # We do not want to grab this as part of the live request because it is slow.
147
136
  def store_s3_base_url
148
- write_s3_base_url("config/s3_base_url.txt")
149
- write_s3_base_url("rack/config/s3_base_url.txt") if Jets.rack?
137
+ write_s3_base_url("#{stage_area}/code/config/s3_base_url.txt")
138
+ write_s3_base_url("#{stage_area}/rack/config/s3_base_url.txt") if Jets.rack?
150
139
  end
151
140
 
152
- def write_s3_base_url(relative_path)
153
- full_path = "#{full(tmp_code)}/#{relative_path}"
141
+ def write_s3_base_url(full_path)
154
142
  FileUtils.mkdir_p(File.dirname(full_path))
155
143
  IO.write(full_path, s3_base_url)
156
144
  end
@@ -175,7 +163,7 @@ class Jets::Builders
175
163
  end
176
164
 
177
165
  def disable_webpacker_middleware
178
- full_path = "#{full(tmp_code)}/config/disable-webpacker-middleware.txt"
166
+ full_path = "#{"#{stage_area}/code"}/config/disable-webpacker-middleware.txt"
179
167
  FileUtils.mkdir_p(File.dirname(full_path))
180
168
  FileUtils.touch(full_path)
181
169
  end
@@ -212,17 +200,25 @@ class Jets::Builders
212
200
 
213
201
  return unless Jets.rack?
214
202
 
203
+ # Need to capture JETS_ROOT since can be changed by Turbo mode
204
+ jets_root = Jets.root
215
205
  Bundler.with_clean_env do
216
- rails_assets(:clobber)
217
- rails_assets(:precompile)
206
+ gemfile = ENV['BUNDLE_GEMFILE']
207
+ ENV['BUNDLE_GEMFILE'] = "#{jets_root}/rack/Gemfile"
208
+
209
+ sh "cd #{jets_root} && bundle install"
210
+ rails_assets(:clobber, jets_root: jets_root)
211
+ rails_assets(:precompile, jets_root: jets_root)
212
+
213
+ ENV['BUNDLE_GEMFILE'] = gemfile
218
214
  end
219
215
  end
220
216
 
221
- def rails_assets(cmd)
217
+ def rails_assets(cmd, jets_root:)
222
218
  # rake is available in both rails 4 and 5. rails command only in 5
223
219
  command = "bundle exec rake assets:#{cmd} --trace"
224
220
  command = "RAILS_ENV=#{Jets.env} #{command}" unless Jets.env.development?
225
- sh("cd rack && #{command}")
221
+ sh("cd #{jets_root}rack && #{command}")
226
222
  end
227
223
 
228
224
  # Rudimentary rails detection
@@ -247,14 +243,14 @@ class Jets::Builders
247
243
  # directory untouched and we can also remove a bunch of unnecessary files like
248
244
  # logs before zipping it up.
249
245
  def copy_project
250
- headline "Copying current project directory to temporary build area: #{full(tmp_code)}"
251
- FileUtils.rm_rf(stage_area) # clear out from previous build
252
- FileUtils.mkdir_p(stage_area)
253
- FileUtils.rm_rf(full(tmp_code)) # remove current code folder
246
+ headline "Copying current project directory to temporary build area: #{"#{stage_area}/code"}"
247
+ FileUtils.rm_rf("#{build_area}/stage") # clear out from previous build's stage area
248
+ FileUtils.mkdir_p("#{build_area}/stage")
249
+ FileUtils.rm_rf("#{stage_area}/code") # remove current code folder
254
250
  move_node_modules(Jets.root, Jets.build_root)
255
251
  begin
256
- # puts "cp -r #{@full_project_path} #{full(tmp_code)}".colorize(:yellow) # uncomment to debug
257
- FileUtils.cp_r(@full_project_path, full(tmp_code))
252
+ # puts "cp -r #{@full_project_path} #{"#{stage_area}/code"}".colorize(:yellow) # uncomment to debug
253
+ FileUtils.cp_r(@full_project_path, "#{stage_area}/code")
258
254
  ensure
259
255
  move_node_modules(Jets.build_root, Jets.root) # move node_modules directory back
260
256
  end
@@ -279,7 +275,7 @@ class Jets::Builders
279
275
  return unless Jets.env.development?
280
276
  headline "Reconfiguring webpacker development settings for AWS Lambda."
281
277
 
282
- webpacker_yml = "#{full(tmp_code)}/config/webpacker.yml"
278
+ webpacker_yml = "#{"#{stage_area}/code"}/config/webpacker.yml"
283
279
  return unless File.exist?(webpacker_yml)
284
280
 
285
281
  config = YAML.load_file(webpacker_yml)
@@ -302,15 +298,23 @@ class Jets::Builders
302
298
  return if Jets.poly_only?
303
299
 
304
300
  ruby_packager.install
305
- reconfigure_rails # call here after full(tmp_code) is available
301
+ reconfigure_rails # call here after "#{stage_area}/code" is available
306
302
  rack_packager.install
307
- ruby_packager.finish # by this time we have a /tmp/jets/demo/stage/code/bundled
303
+ ruby_packager.finish # by this time we have a /tmp/jets/demo/stage/code/vendor/gems
308
304
  rack_packager.finish
305
+
306
+ build_lambda_layer
307
+ end
308
+
309
+ def build_lambda_layer
310
+ return if Jets.poly_only?
311
+ lambda_layer = LambdaLayer.new
312
+ lambda_layer.build
309
313
  end
310
314
 
311
315
  # TODO: Move logic into plugin instead
312
316
  def reconfigure_rails
313
- ReconfigureRails.new("#{full(tmp_code)}/rack").run
317
+ ReconfigureRails.new("#{"#{stage_area}/code"}/rack").run
314
318
  end
315
319
 
316
320
  def cache_check_message
@@ -321,9 +325,9 @@ class Jets::Builders
321
325
 
322
326
  def check_ruby_version
323
327
  unless ruby_version_supported?
324
- puts "You are using ruby version #{RUBY_VERSION} which is not supported by Jets."
328
+ puts "You are using Ruby version #{RUBY_VERSION} which is not supported by Jets."
325
329
  ruby_variant = Jets::RUBY_VERSION.split('.')[0..1].join('.') + '.x'
326
- abort("Jets uses ruby #{Jets::RUBY_VERSION}. You should use a variant of ruby #{ruby_variant}".colorize(:red))
330
+ abort("Jets uses Ruby #{Jets::RUBY_VERSION}. You should use a variant of Ruby #{ruby_variant}".colorize(:red))
327
331
  end
328
332
  end
329
333
 
@@ -35,11 +35,13 @@ class Jets::Builders
35
35
  say "Gem Layer: #{megabytes(opt_size)} - #{stage_area}/opt"
36
36
  say "Total Package: #{megabytes(total_size)}"
37
37
  say "Over limit by: #{megabytes(overlimit)}"
38
- # sh "du -csh #{stage_area}/*" unless ENV['TEST'] # uncomment to debug
38
+ say "Sometimes blowing away the /tmp/jets cache will reduce the size: rm -rf /tmp/jets"
39
+ # sh "du -kcsh #{stage_area}/*" unless ENV['TEST'] # uncomment to debug
39
40
  end
40
41
 
41
42
  def compute_size(path)
42
- out = `du -s #{path}`
43
+ # -k option is required for macosx but not for linux
44
+ out = `du -ks #{path}`
43
45
  out.split(' ').first.to_i # bytes
44
46
  end
45
47
 
@@ -1,8 +1,7 @@
1
1
  class Jets::Builders
2
2
  class GemReplacer
3
3
  extend Memoist
4
- def initialize(ruby_version, options)
5
- @ruby_version = ruby_version
4
+ def initialize(options)
6
5
  @options = options
7
6
  end
8
7
 
@@ -17,25 +16,9 @@ class Jets::Builders
17
16
  gem_extractor.run
18
17
  end
19
18
 
20
- # At this point the current compiled gems have been removed and compiled gems
21
- # have been unpacked to code/opt. We can take the unpacked gems in opt and fully
22
- # move them into vendor/gems gems now.
23
- move_opt_gems_to_vendor
24
-
25
19
  tidy
26
20
  end
27
21
 
28
- def move_opt_gems_to_vendor
29
- code = "#{Jets.build_root}/stage/code"
30
- opt_gems = "#{code}/opt/ruby/gems/#{Jets::Gems.ruby_folder}"
31
- vendor_gems = "#{code}/vendor/gems/ruby/#{Jets::Gems.ruby_folder}"
32
- # https://stackoverflow.com/questions/23698183/how-to-force-cp-to-overwrite-directory-instead-of-creating-another-one-inside
33
- # Trailing slashes are required
34
- sh "rsync -a --links #{opt_gems}/ #{vendor_gems}/"
35
- # clean up opt compiled gems
36
- FileUtils.rm_rf("#{code}/opt/ruby")
37
- end
38
-
39
22
  def sh(command)
40
23
  puts "=> #{command}".colorize(:green)
41
24
  success = system(command)
@@ -43,12 +26,16 @@ class Jets::Builders
43
26
  success
44
27
  end
45
28
 
29
+ def ruby_folder
30
+ Jets::Gems.ruby_folder
31
+ end
32
+
46
33
  # remove unnecessary files to reduce package size
47
34
  def tidy
48
35
  # project_root: /tmp/jets/demo/stage/code/
49
36
  # /tmp/jets/demo/stage/code/bundled
50
- tidy_gems("#{@options[:project_root]}/bundled/gems/ruby/*/gems/*")
51
- tidy_gems("#{@options[:project_root]}/bundled/gems/ruby/*/bundler/gems/*")
37
+ tidy_gems("#{@options[:project_root]}/ruby/gems/#{ruby_folder}/*/gems/*")
38
+ tidy_gems("#{@options[:project_root]}/ruby/gems/#{ruby_folder}/*/bundler/gems/*")
52
39
  end
53
40
 
54
41
  def tidy_gems(gems_path)
@@ -2,50 +2,68 @@ class Jets::Builders
2
2
  class LambdaLayer
3
3
  include Util
4
4
 
5
- # At this point we gems have all been moved to stage/code/vendor/gems, this includes
6
- # binary gems, a good state. This method moves them:
7
- #
8
- # from stage/code/vendor/gems/ruby/2.5.0
9
- # to stage/opt/ruby/gems/2.5.0
10
- #
11
- # So we can move gems into the Lambda Layer. Important folders later:
12
- #
13
- # stage/code/opt/lib
14
- # stage/code/opt/ruby
15
- #
5
+ # At this point gems are in the stage/code and stage/rack folders still.
6
+ # We consolidate all gems to stage/opt.
7
+ # Then replace the binary gems.
16
8
  def build
17
- move_opt_to_stage
18
- move_vendor_to_opt
19
- symlink_vendor_gems
9
+ consolidate_gems_to_opt
10
+ replace_compiled_gems
20
11
  end
21
12
 
22
- def move_opt_to_stage
23
- opt_original = "#{code_area}/opt"
24
- opt = "#{stage_area}/opt"
25
- FileUtils.mkdir_p(File.dirname(opt))
26
- FileUtils.mv(opt_original, opt)
13
+ # Also restructure the folder from:
14
+ # vendor/gems/ruby/2.5.0
15
+ # To:
16
+ # ruby/gems/2.5.0
17
+ #
18
+ # For Lambda Layer structure
19
+ def consolidate_gems_to_opt
20
+ src = "#{stage_area}/code/vendor/gems/ruby/2.5.0"
21
+ dest = "#{stage_area}/opt/ruby/gems/2.5.0"
22
+ rsync_and_link(src, dest)
23
+
24
+ return unless Jets.rack?
25
+
26
+ src = "#{stage_area}/rack/vendor/gems/ruby/2.5.0"
27
+ rsync_and_link(src, dest)
27
28
  end
28
29
 
29
- def move_vendor_to_opt
30
- ruby_folder = Jets::Gems.ruby_folder
31
- gems_original = "#{code_area}/vendor/gems/ruby/#{ruby_folder}"
32
- gems = "#{stage_area}/opt/ruby/gems/#{ruby_folder}"
33
-
34
- FileUtils.mkdir_p(File.dirname(gems))
35
- FileUtils.mv(gems_original, gems)
36
- # Deleting in this way to make sure folders are empty before we delete them
37
- FileUtils.rmdir("#{code_area}/vendor/gems/ruby")
38
- FileUtils.rmdir("#{code_area}/vendor/gems")
39
- FileUtils.rmdir("#{code_area}/vendor") if Dir.empty?("#{code_area}/vendor")
30
+ def rsync_and_link(src, dest)
31
+ FileUtils.mkdir_p(dest)
32
+ # Trailing slashes are required
33
+ sh "rsync -a --links #{src}/ #{dest}/"
34
+
35
+ FileUtils.rm_rf(src) # blow away original 2.5.0 folder
36
+
37
+ # Create symlink that will point to the gems in the Lambda Layer:
38
+ # stage/opt/ruby/gems/2.5.0 -> /opt/ruby/gems/2.5.0
39
+ FileUtils.ln_sf("/opt/ruby/gems/#{Jets::Gems.ruby_folder}", src)
40
40
  end
41
41
 
42
- # Simple logic: vendor/gems/ruby/2.5.0 -> /opt/ruby/gems/2.5.0
43
- def symlink_vendor_gems
44
- ruby_folder = Jets::Gems.ruby_folder
45
- dest = "#{code_area}/vendor/gems/ruby/#{ruby_folder}"
46
- FileUtils.mkdir_p(File.dirname(dest))
47
- # puts "ln -sf /opt/ruby/gems/#{ruby_folder} #{dest}" # uncomment to debug
48
- FileUtils.ln_sf("/opt/ruby/gems/#{ruby_folder}", dest)
42
+ # replace_compiled_gems:
43
+ # remove binary gems in vendor/gems/ruby/2.5.0
44
+ # extract binary gems in opt/ruby/gems/2.5.0
45
+ # move binary gems from opt/ruby/gems/2.5.0 to vendor/gems/ruby/2.5.0
46
+ #
47
+ # After this point, gems have been replace in stage/code/vendor/gems with their
48
+ # binary extensions: a good state. This method moves these gems to the Lambda
49
+ # Layers structure and creates a symlinks to it. First:
50
+ #
51
+ # from stage/code/vendor/gems/ruby/2.5.0
52
+ # to stage/opt/ruby/gems/2.5.0
53
+ #
54
+ # Then:
55
+ #
56
+ # stage/code/vendor/gems/ruby/2.5.0 -> /opt/ruby/gems/2.5.0
57
+ #
58
+ def replace_compiled_gems
59
+ project_root = "#{stage_area}/opt"
60
+ headline "Replacing compiled gems with AWS Lambda Linux compiled versions: #{project_root}"
61
+ options = {
62
+ s3: "lambdagems2",
63
+ build_root: cache_area, # used in jets-gems
64
+ project_root: project_root, # used in gem_replacer and jets-gems
65
+ }
66
+ GemReplacer.new(options).run
49
67
  end
50
68
  end
51
69
  end
@@ -3,9 +3,11 @@ class Jets::Builders
3
3
  def finish
4
4
  return unless gemfile_exist?
5
5
 
6
+ super
7
+
6
8
  symlink_gems
7
- rack_symlink
8
9
  copy_rackup_wrappers
10
+ rack_symlink
9
11
  end
10
12
 
11
13
  def symlink_gems
@@ -31,10 +33,10 @@ class Jets::Builders
31
33
  # Moves folder to a stage folder and create a symlink its place
32
34
  # that links from /var/task to /tmp. Example:
33
35
  #
34
- # code_area/rack => /tmp/rack
36
+ # stage/code/rack => /tmp/rack
35
37
  #
36
38
  def rack_symlink
37
- src = "#{@full_app_root}/rack"
39
+ src = @full_app_root
38
40
  return unless File.exist?(src)
39
41
 
40
42
  dest = "#{stage_area}/rack"
@@ -43,7 +45,7 @@ class Jets::Builders
43
45
  FileUtils.mv(src, dest)
44
46
 
45
47
  # Create symlink
46
- FileUtils.ln_sf("/tmp/rack", "/#{@full_app_root}/rack")
48
+ FileUtils.ln_sf("/tmp/rack", src)
47
49
  end
48
50
  end
49
51
  end