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.
- data/lib/engineyard-serverside.rb +0 -1
- data/lib/engineyard-serverside/cli.rb +44 -42
- data/lib/engineyard-serverside/configuration.rb +55 -4
- data/lib/engineyard-serverside/dependency_manager.rb +17 -0
- data/lib/engineyard-serverside/dependency_manager/base.rb +65 -0
- data/lib/engineyard-serverside/dependency_manager/bundler.rb +124 -0
- data/lib/engineyard-serverside/dependency_manager/bundler_lock.rb +155 -0
- data/lib/engineyard-serverside/dependency_manager/legacy_helpers.rb +24 -0
- data/lib/engineyard-serverside/dependency_manager/npm.rb +16 -0
- data/lib/engineyard-serverside/deploy.rb +86 -178
- data/lib/engineyard-serverside/deprecation.rb +11 -1
- data/lib/engineyard-serverside/paths.rb +6 -0
- data/lib/engineyard-serverside/propagator.rb +2 -2
- data/lib/engineyard-serverside/rails_assets.rb +152 -0
- data/lib/engineyard-serverside/rails_assets/strategy.rb +197 -0
- data/lib/engineyard-serverside/server.rb +5 -0
- data/lib/engineyard-serverside/servers.rb +19 -7
- data/lib/engineyard-serverside/shell.rb +7 -5
- data/lib/engineyard-serverside/shell/command_result.rb +1 -1
- data/lib/engineyard-serverside/strategies/git.rb +14 -4
- data/lib/engineyard-serverside/task.rb +1 -0
- data/lib/engineyard-serverside/version.rb +1 -1
- data/spec/bundler_deploy_spec.rb +36 -33
- data/spec/configuration_spec.rb +5 -4
- data/spec/custom_deploy_spec.rb +11 -9
- data/spec/deploy_hook_spec.rb +10 -3
- data/spec/ey_yml_customized_deploy_spec.rb +1 -1
- data/spec/fixtures/lockfiles/1.0-no-bundler +1 -1
- data/spec/fixtures/lockfiles/1.0.0.rc.1-with-bundler +1 -1
- data/spec/fixtures/lockfiles/1.0.18-do_mysql +1 -1
- data/spec/fixtures/lockfiles/1.0.18-do_postgres +1 -1
- data/spec/fixtures/lockfiles/1.0.18-mysql +1 -1
- data/spec/fixtures/lockfiles/1.0.18-mysql2 +1 -1
- data/spec/fixtures/lockfiles/1.0.18-pg +1 -1
- data/spec/fixtures/lockfiles/1.0.6-no-bundler +2 -2
- data/spec/fixtures/lockfiles/1.0.6-with-any-bundler +2 -2
- data/spec/fixtures/lockfiles/1.0.6-with-bundler +2 -2
- data/spec/fixtures/lockfiles/1.3.1-rails-3.2.13 +112 -0
- data/spec/fixtures/repos/{assets_enabled → assets_detected}/Gemfile +1 -2
- data/spec/fixtures/repos/{assets_enabled → assets_detected}/Gemfile.lock +1 -3
- data/spec/fixtures/repos/{assets_enabled → assets_detected}/README +0 -0
- data/spec/fixtures/repos/assets_detected/Rakefile +5 -0
- data/spec/fixtures/repos/{assets_enabled → assets_detected}/app/assets/empty +0 -0
- data/spec/fixtures/repos/{assets_enabled → assets_detected}/config/application.rb +0 -0
- data/spec/fixtures/repos/assets_detected/config/ey.yml +3 -0
- data/spec/fixtures/repos/assets_disabled/Gemfile +1 -2
- data/spec/fixtures/repos/assets_disabled/Gemfile.lock +1 -3
- data/spec/fixtures/repos/assets_disabled/Rakefile +1 -0
- data/spec/fixtures/repos/assets_disabled/config/ey.yml +3 -0
- data/spec/fixtures/repos/assets_disabled_in_ey_yml/Gemfile +1 -2
- data/spec/fixtures/repos/assets_disabled_in_ey_yml/Gemfile.lock +1 -3
- data/spec/fixtures/repos/assets_disabled_in_ey_yml/Rakefile +1 -0
- data/spec/fixtures/repos/assets_disabled_in_ey_yml/config/ey.yml +1 -0
- data/spec/fixtures/repos/assets_enabled_all/Gemfile +1 -2
- data/spec/fixtures/repos/assets_enabled_all/Gemfile.lock +1 -3
- data/spec/fixtures/repos/assets_enabled_all/Rakefile +1 -0
- data/spec/fixtures/repos/assets_enabled_all/config/ey.yml +1 -0
- data/spec/fixtures/repos/assets_enabled_in_ey_yml/Gemfile +1 -1
- data/spec/fixtures/repos/assets_enabled_in_ey_yml/Gemfile.lock +1 -1
- data/spec/fixtures/repos/assets_enabled_in_ey_yml/Rakefile +1 -0
- data/spec/fixtures/repos/assets_enabled_util_only/Gemfile +1 -2
- data/spec/fixtures/repos/assets_enabled_util_only/Gemfile.lock +1 -3
- data/spec/fixtures/repos/assets_enabled_util_only/Rakefile +1 -0
- data/spec/fixtures/repos/assets_enabled_util_only/config/ey.yml +1 -0
- data/spec/fixtures/repos/assets_in_hook/Gemfile +1 -2
- data/spec/fixtures/repos/assets_in_hook/Gemfile.lock +1 -3
- data/spec/fixtures/repos/assets_in_hook/config/ey.yml +3 -0
- data/spec/fixtures/repos/assets_in_hook/deploy/before_compile_assets.rb +1 -1
- data/spec/fixtures/repos/bundle_fails/Gemfile +1 -0
- data/spec/fixtures/repos/bundle_fails/README +1 -0
- data/spec/fixtures/repos/bundle_fails/deploy/after_bundle.rb +1 -0
- data/spec/fixtures/repos/default/Gemfile +1 -2
- data/spec/fixtures/repos/default/Gemfile.lock +1 -3
- data/spec/fixtures/repos/default/ey.yml +3 -0
- data/spec/fixtures/repos/ey_yml/Gemfile +1 -1
- data/spec/fixtures/repos/ey_yml/Gemfile.lock +1 -1
- data/spec/fixtures/repos/ey_yml/config/ey.yml +11 -7
- data/spec/fixtures/repos/ey_yml_alt/Gemfile +1 -1
- data/spec/fixtures/repos/ey_yml_alt/Gemfile.lock +1 -1
- data/spec/fixtures/repos/no_ey_config/Gemfile +1 -2
- data/spec/fixtures/repos/no_ey_config/Gemfile.lock +1 -3
- data/spec/fixtures/repos/no_ey_config/ey.yml +3 -0
- data/spec/fixtures/repos/no_gemfile_lock/Gemfile +1 -2
- data/spec/fixtures/repos/no_gemfile_lock/ey.yml +3 -0
- data/spec/fixtures/repos/sqlite3/Gemfile +1 -1
- data/spec/fixtures/repos/sqlite3/Gemfile.lock +1 -1
- data/spec/lockfile_parser_spec.rb +25 -11
- data/spec/rails31_deploy_spec.rb +46 -5
- data/spec/restart_spec.rb +3 -3
- data/spec/services_deploy_spec.rb +89 -86
- data/spec/shell_spec.rb +0 -8
- data/spec/spec_helper.rb +81 -36
- data/spec/sqlite3_deploy_spec.rb +4 -5
- data/spec/support/integration.rb +22 -37
- metadata +167 -154
- data/lib/engineyard-serverside/lockfile_parser.rb +0 -101
- data/lib/engineyard-serverside/rails_asset_support.rb +0 -132
- 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
|
-
|