engineyard-serverside 2.0.7 → 2.1.0.pre

Sign up to get free protection for your applications and to get access to all the features.
Files changed (98) hide show
  1. data/lib/engineyard-serverside.rb +0 -1
  2. data/lib/engineyard-serverside/cli.rb +44 -42
  3. data/lib/engineyard-serverside/configuration.rb +55 -4
  4. data/lib/engineyard-serverside/dependency_manager.rb +17 -0
  5. data/lib/engineyard-serverside/dependency_manager/base.rb +65 -0
  6. data/lib/engineyard-serverside/dependency_manager/bundler.rb +124 -0
  7. data/lib/engineyard-serverside/dependency_manager/bundler_lock.rb +155 -0
  8. data/lib/engineyard-serverside/dependency_manager/legacy_helpers.rb +24 -0
  9. data/lib/engineyard-serverside/dependency_manager/npm.rb +16 -0
  10. data/lib/engineyard-serverside/deploy.rb +86 -178
  11. data/lib/engineyard-serverside/deprecation.rb +11 -1
  12. data/lib/engineyard-serverside/paths.rb +6 -0
  13. data/lib/engineyard-serverside/propagator.rb +2 -2
  14. data/lib/engineyard-serverside/rails_assets.rb +152 -0
  15. data/lib/engineyard-serverside/rails_assets/strategy.rb +197 -0
  16. data/lib/engineyard-serverside/server.rb +5 -0
  17. data/lib/engineyard-serverside/servers.rb +19 -7
  18. data/lib/engineyard-serverside/shell.rb +7 -5
  19. data/lib/engineyard-serverside/shell/command_result.rb +1 -1
  20. data/lib/engineyard-serverside/strategies/git.rb +14 -4
  21. data/lib/engineyard-serverside/task.rb +1 -0
  22. data/lib/engineyard-serverside/version.rb +1 -1
  23. data/spec/bundler_deploy_spec.rb +36 -33
  24. data/spec/configuration_spec.rb +5 -4
  25. data/spec/custom_deploy_spec.rb +11 -9
  26. data/spec/deploy_hook_spec.rb +10 -3
  27. data/spec/ey_yml_customized_deploy_spec.rb +1 -1
  28. data/spec/fixtures/lockfiles/1.0-no-bundler +1 -1
  29. data/spec/fixtures/lockfiles/1.0.0.rc.1-with-bundler +1 -1
  30. data/spec/fixtures/lockfiles/1.0.18-do_mysql +1 -1
  31. data/spec/fixtures/lockfiles/1.0.18-do_postgres +1 -1
  32. data/spec/fixtures/lockfiles/1.0.18-mysql +1 -1
  33. data/spec/fixtures/lockfiles/1.0.18-mysql2 +1 -1
  34. data/spec/fixtures/lockfiles/1.0.18-pg +1 -1
  35. data/spec/fixtures/lockfiles/1.0.6-no-bundler +2 -2
  36. data/spec/fixtures/lockfiles/1.0.6-with-any-bundler +2 -2
  37. data/spec/fixtures/lockfiles/1.0.6-with-bundler +2 -2
  38. data/spec/fixtures/lockfiles/1.3.1-rails-3.2.13 +112 -0
  39. data/spec/fixtures/repos/{assets_enabled → assets_detected}/Gemfile +1 -2
  40. data/spec/fixtures/repos/{assets_enabled → assets_detected}/Gemfile.lock +1 -3
  41. data/spec/fixtures/repos/{assets_enabled → assets_detected}/README +0 -0
  42. data/spec/fixtures/repos/assets_detected/Rakefile +5 -0
  43. data/spec/fixtures/repos/{assets_enabled → assets_detected}/app/assets/empty +0 -0
  44. data/spec/fixtures/repos/{assets_enabled → assets_detected}/config/application.rb +0 -0
  45. data/spec/fixtures/repos/assets_detected/config/ey.yml +3 -0
  46. data/spec/fixtures/repos/assets_disabled/Gemfile +1 -2
  47. data/spec/fixtures/repos/assets_disabled/Gemfile.lock +1 -3
  48. data/spec/fixtures/repos/assets_disabled/Rakefile +1 -0
  49. data/spec/fixtures/repos/assets_disabled/config/ey.yml +3 -0
  50. data/spec/fixtures/repos/assets_disabled_in_ey_yml/Gemfile +1 -2
  51. data/spec/fixtures/repos/assets_disabled_in_ey_yml/Gemfile.lock +1 -3
  52. data/spec/fixtures/repos/assets_disabled_in_ey_yml/Rakefile +1 -0
  53. data/spec/fixtures/repos/assets_disabled_in_ey_yml/config/ey.yml +1 -0
  54. data/spec/fixtures/repos/assets_enabled_all/Gemfile +1 -2
  55. data/spec/fixtures/repos/assets_enabled_all/Gemfile.lock +1 -3
  56. data/spec/fixtures/repos/assets_enabled_all/Rakefile +1 -0
  57. data/spec/fixtures/repos/assets_enabled_all/config/ey.yml +1 -0
  58. data/spec/fixtures/repos/assets_enabled_in_ey_yml/Gemfile +1 -1
  59. data/spec/fixtures/repos/assets_enabled_in_ey_yml/Gemfile.lock +1 -1
  60. data/spec/fixtures/repos/assets_enabled_in_ey_yml/Rakefile +1 -0
  61. data/spec/fixtures/repos/assets_enabled_util_only/Gemfile +1 -2
  62. data/spec/fixtures/repos/assets_enabled_util_only/Gemfile.lock +1 -3
  63. data/spec/fixtures/repos/assets_enabled_util_only/Rakefile +1 -0
  64. data/spec/fixtures/repos/assets_enabled_util_only/config/ey.yml +1 -0
  65. data/spec/fixtures/repos/assets_in_hook/Gemfile +1 -2
  66. data/spec/fixtures/repos/assets_in_hook/Gemfile.lock +1 -3
  67. data/spec/fixtures/repos/assets_in_hook/config/ey.yml +3 -0
  68. data/spec/fixtures/repos/assets_in_hook/deploy/before_compile_assets.rb +1 -1
  69. data/spec/fixtures/repos/bundle_fails/Gemfile +1 -0
  70. data/spec/fixtures/repos/bundle_fails/README +1 -0
  71. data/spec/fixtures/repos/bundle_fails/deploy/after_bundle.rb +1 -0
  72. data/spec/fixtures/repos/default/Gemfile +1 -2
  73. data/spec/fixtures/repos/default/Gemfile.lock +1 -3
  74. data/spec/fixtures/repos/default/ey.yml +3 -0
  75. data/spec/fixtures/repos/ey_yml/Gemfile +1 -1
  76. data/spec/fixtures/repos/ey_yml/Gemfile.lock +1 -1
  77. data/spec/fixtures/repos/ey_yml/config/ey.yml +11 -7
  78. data/spec/fixtures/repos/ey_yml_alt/Gemfile +1 -1
  79. data/spec/fixtures/repos/ey_yml_alt/Gemfile.lock +1 -1
  80. data/spec/fixtures/repos/no_ey_config/Gemfile +1 -2
  81. data/spec/fixtures/repos/no_ey_config/Gemfile.lock +1 -3
  82. data/spec/fixtures/repos/no_ey_config/ey.yml +3 -0
  83. data/spec/fixtures/repos/no_gemfile_lock/Gemfile +1 -2
  84. data/spec/fixtures/repos/no_gemfile_lock/ey.yml +3 -0
  85. data/spec/fixtures/repos/sqlite3/Gemfile +1 -1
  86. data/spec/fixtures/repos/sqlite3/Gemfile.lock +1 -1
  87. data/spec/lockfile_parser_spec.rb +25 -11
  88. data/spec/rails31_deploy_spec.rb +46 -5
  89. data/spec/restart_spec.rb +3 -3
  90. data/spec/services_deploy_spec.rb +89 -86
  91. data/spec/shell_spec.rb +0 -8
  92. data/spec/spec_helper.rb +81 -36
  93. data/spec/sqlite3_deploy_spec.rb +4 -5
  94. data/spec/support/integration.rb +22 -37
  95. metadata +167 -154
  96. data/lib/engineyard-serverside/lockfile_parser.rb +0 -101
  97. data/lib/engineyard-serverside/rails_asset_support.rb +0 -132
  98. data/spec/fixtures/repos/assets_enabled/Rakefile +0 -5
@@ -1,101 +0,0 @@
1
- require 'yaml'
2
- module EY
3
- module Serverside
4
- class LockfileParser
5
- DEFAULT = "1.1.5"
6
-
7
- def self.default_version
8
- DEFAULT
9
- end
10
-
11
- attr_reader :bundler_version, :lockfile_version
12
-
13
- def initialize(lockfile_contents)
14
- @contents = lockfile_contents
15
- parse
16
- end
17
-
18
- def has_ey_config?
19
- @contents.index(/^\s+ey_config\s\([^\)]+\)$/)
20
- end
21
-
22
- def any_database_adapter?
23
- any_ruby_adapter = %w[mysql2 mysql do_mysql pg do_postgres].any? do |type|
24
- @contents.index(/^\s+#{type}\s\([^\)]+\)$/)
25
- end
26
-
27
- any_jruby_adapter = %w[mysql postgresql postgres].any? do |type|
28
- @contents.index(/^\s+jdbc-#{type}\s\([^\)]+\)$/) || @contents.index(/^\s+activerecord-jdbc#{type}-adapter\s\([^\)]+\)$/)
29
- end
30
-
31
- any_ruby_adapter || any_jruby_adapter
32
- end
33
-
34
- def uses_sqlite3?
35
- !any_database_adapter? && @contents.index(/^\s+sqlite3\s\([^\)]+\)$/)
36
- end
37
-
38
- def parse
39
- parse_from_metadata ||
40
- parse_from_dependencies ||
41
- raise("Malformed or pre bundler-1.0.0 Gemfile.lock: #{@contents[0,50]}...")
42
- end
43
-
44
- def slice_section(header)
45
- if start = @contents.index(/^#{header}/)
46
- finish = @contents.index(/(^\S|\Z)/, start + header.length)
47
- @contents.slice(start..finish)
48
- else
49
- ""
50
- end
51
- end
52
-
53
- def parse_from_metadata
54
- section = slice_section('METADATA')
55
-
56
- if section.empty?
57
- return nil
58
- end
59
-
60
- result = section.scan(/^\s*version:\s*(.*)$/).first
61
- @lockfile_version = :bundler10
62
- @bundler_version = result ? result.first : DEFAULT
63
- end
64
-
65
- def parse_from_dependencies
66
- section = slice_section('DEPENDENCIES')
67
-
68
- if section.empty?
69
- return nil
70
- end
71
-
72
- result = scan_bundler(section)
73
- bundler_version = result ? result.last : nil
74
- version_qualifier = result ? result.first : nil
75
- @lockfile_version = :bundler10
76
- @bundler_version = fetch_version(bundler_version, version_qualifier)
77
- end
78
-
79
- def fetch_version(bundler_version, version_qualifier)
80
- return bundler_version || DEFAULT unless version_qualifier
81
-
82
- case version_qualifier
83
- when '='
84
- bundler_version
85
- when '>='
86
- Gem::Version.new(bundler_version) > Gem::Version.new(DEFAULT) ? bundler_version : DEFAULT
87
- when '~>'
88
- bundler_gem_version = Gem::Version.new(bundler_version)
89
- recommendation = bundler_gem_version.spermy_recommendation.gsub(/~>\s*(.+)$/, '\1.')
90
- recommends_default = DEFAULT.index(recommendation) == 0
91
- default_newer_than_requested = Gem::Version.new(DEFAULT) > bundler_gem_version
92
- (recommends_default && default_newer_than_requested) ? DEFAULT : bundler_version
93
- end
94
- end
95
-
96
- def scan_bundler(dep_section)
97
- dep_section.scan(/^\s*bundler\s*\((>?=|~>)\s*([^,\)]+)/).first
98
- end
99
- end
100
- end
101
- end
@@ -1,132 +0,0 @@
1
- module EY
2
- module Serverside
3
- module RailsAssetSupport
4
- def compile_assets
5
- return unless app_needs_assets?
6
- rails_version = bundled_rails_version
7
- roles config.asset_roles do
8
- keep_existing_assets
9
- cmd = "cd #{paths.active_release} && PATH=#{paths.binstubs}:$PATH #{config.framework_envs} rake assets:precompile RAILS_GROUPS=assets"
10
-
11
- if rails_version
12
- shell.status "Precompiling assets for rails v#{rails_version}"
13
- else
14
- shell.warning "Precompiling assets even though Rails was not bundled."
15
- end
16
-
17
- begin
18
- run(cmd)
19
- rescue StandardError => e
20
- if config.precompile_assets_inferred?
21
- # If specifically requested, then we want to fail if compilation fails.
22
- # If we are implicitly precompiling, we want to fail non-destructively
23
- # because we don't know if the rake task exists or if the user
24
- # actually intended for assets to be compiled.
25
- shell.notice "Asset compilation failure ignored.\nAdd 'precompile_assets: true' to ey.yml to abort deploy on failure."
26
- return
27
- else
28
- raise
29
- end
30
- end
31
- end
32
- end
33
-
34
- def app_needs_assets?
35
- if config.precompile_assets?
36
- shell.status "Attempting Rails asset precompilation. (enabled in config)"
37
- return true
38
- elsif config.skip_precompile_assets?
39
- shell.status "Skipping asset precompilation. (disabled in ey.yml)"
40
- return false
41
- end
42
-
43
- app_rb_path = paths.active_release_config.join('application.rb')
44
- unless app_rb_path.readable? # Not a Rails app in the first place.
45
- shell.status "Skipping asset precompilation. (not a Rails application)"
46
- return false
47
- end
48
-
49
- if paths.active_release.join('app','assets').exist?
50
- shell.status "Attempting Rails asset precompilation. (found directory: 'app/assets')"
51
- else
52
- shell.status "Skipping asset precompilation. (directory not found: 'app/assets')"
53
- return false
54
- end
55
-
56
- if paths.public_assets.exist?
57
- shell.status "Skipping asset compilation. Already compiled. (found directory: 'public/assets')"
58
- return false
59
- end
60
-
61
- if app_disables_assets?(app_rb_path)
62
- shell.status "Skipping asset compilation. (application.rb has disabled asset compilation)"
63
- return false
64
- end
65
-
66
- # This check is very expensive, and has been deemed not worth the time.
67
- # Leaving this here in case someone comes up with a faster way.
68
- #unless app_has_asset_task?
69
- # shell.status "No 'assets:precompile' Rake task found. Skipping."
70
- # return
71
- #end
72
-
73
- true
74
- end
75
-
76
- def app_disables_assets?(path)
77
- disabled = nil
78
- File.open(path) do |fd|
79
- pattern = /^[^#].*config\.assets\.enabled\s+=\s+(false|nil)/
80
- contents = fd.read
81
- disabled = contents.match(pattern)
82
- end
83
- disabled
84
- end
85
-
86
- # Runs 'rake -T' to see if there is an assets:precompile task.
87
- def app_has_asset_task?
88
- # We just run this locally on the app master; everybody else should
89
- # have the same code anyway.
90
- task_check = "PATH=#{paths.binstubs}:$PATH #{config.framework_envs} rake -T assets:precompile |grep 'assets:precompile'"
91
- cmd = "cd #{paths.active_release} && #{task_check}"
92
- shell.logged_system("cd #{paths.active_release} && #{task_check}").success?
93
- end
94
-
95
- def app_builds_own_assets?
96
- paths.public_assets.exist?
97
- end
98
-
99
- # To support operations like Unicorn's hot reload, it is useful to have
100
- # the prior release's assets as well. Otherwise, while a deploy is running,
101
- # clients may request stale assets that you just deleted.
102
- # Making use of this requires a properly-configured front-end HTTP server.
103
- def keep_existing_assets
104
- current = paths.shared_assets
105
- last_asset_path = paths.shared.join('last_assets')
106
- # If there are current shared assets, move them under a 'last_assets' directory.
107
- run <<-COMMAND
108
- if [ -d #{current} ]; then
109
- rm -rf #{last_asset_path} && mkdir #{last_asset_path} && mv #{current} #{last_asset_path} && mkdir -p #{current};
110
- else
111
- mkdir -p #{current} #{last_asset_path};
112
- fi;
113
- ln -nfs #{current} #{last_asset_path} #{paths.public}
114
- COMMAND
115
- end
116
-
117
- def bundled_rails_version(lockfile_path = paths.gemfile_lock)
118
- return unless lockfile_path.exist?
119
- lockfile = lockfile_path.read
120
- lockfile.each_line do |line|
121
- # scan for gemname (version) toplevel deps.
122
- # Likely doesn't handle ancient Bundler versions, but
123
- # we only call this when something looks like it is Rails 3.
124
- next unless line =~ /^\s{4}([-\w_.0-9]+)\s*\((.*)\)/
125
- return $2 if $1 == 'rails'
126
- end
127
- nil
128
- end
129
- end
130
- end
131
- end
132
-
@@ -1,5 +0,0 @@
1
- desc 'Precompile yar assetz'
2
- task 'assets:precompile' do
3
- sh 'touch precompiled'
4
- end
5
-