jets 1.3.9 → 1.4.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.
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