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