engineyard-serverside 2.0.7 → 2.1.0.pre

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 (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
-