engineyard-serverside 2.6.15.cf2 → 2.6.15.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 (192) hide show
  1. checksums.yaml +4 -4
  2. data/lib/engineyard-serverside/deploy.rb +0 -2
  3. data/lib/engineyard-serverside/paths.rb +34 -36
  4. data/lib/engineyard-serverside/version.rb +1 -1
  5. data/spec/archive_deploy_spec.rb +53 -0
  6. data/spec/basic_deploy_spec.rb +26 -0
  7. data/spec/bundler_deploy_spec.rb +160 -0
  8. data/spec/configuration_spec.rb +205 -0
  9. data/spec/custom_deploy_spec.rb +128 -0
  10. data/spec/deploy_hook_spec.rb +362 -0
  11. data/spec/deprecation_spec.rb +23 -0
  12. data/spec/ey_yml_customized_deploy_spec.rb +99 -0
  13. data/spec/fixtures/gitrepo.tar.gz +0 -0
  14. data/spec/fixtures/invalid_hook.rb +1 -0
  15. data/spec/fixtures/lockfiles/0.9-no-bundler +111 -0
  16. data/spec/fixtures/lockfiles/0.9-with-bundler +117 -0
  17. data/spec/fixtures/lockfiles/1.0-no-bundler +54 -0
  18. data/spec/fixtures/lockfiles/1.0.0.rc.1-with-bundler +162 -0
  19. data/spec/fixtures/lockfiles/1.0.18-do_mysql +88 -0
  20. data/spec/fixtures/lockfiles/1.0.18-do_postgres +79 -0
  21. data/spec/fixtures/lockfiles/1.0.18-mysql +43 -0
  22. data/spec/fixtures/lockfiles/1.0.18-mysql2 +43 -0
  23. data/spec/fixtures/lockfiles/1.0.18-pg +43 -0
  24. data/spec/fixtures/lockfiles/1.0.6-no-bundler +51 -0
  25. data/spec/fixtures/lockfiles/1.0.6-with-any-bundler +52 -0
  26. data/spec/fixtures/lockfiles/1.0.6-with-bundler +52 -0
  27. data/spec/fixtures/lockfiles/1.15.1-no-bundler +51 -0
  28. data/spec/fixtures/lockfiles/1.3.1-rails-3.2.13 +112 -0
  29. data/spec/fixtures/lockfiles/not-a-lockfile +1 -0
  30. data/spec/fixtures/repos/assets_detected/Gemfile +5 -0
  31. data/spec/fixtures/repos/assets_detected/Gemfile.lock +88 -0
  32. data/spec/fixtures/repos/assets_detected/README +1 -0
  33. data/spec/fixtures/repos/assets_detected/Rakefile +5 -0
  34. data/spec/fixtures/repos/assets_detected/app/assets/empty +0 -0
  35. data/spec/fixtures/repos/assets_detected/config/application.rb +5 -0
  36. data/spec/fixtures/repos/assets_detected/config/ey.yml +3 -0
  37. data/spec/fixtures/repos/assets_disabled/Gemfile +5 -0
  38. data/spec/fixtures/repos/assets_disabled/Gemfile.lock +88 -0
  39. data/spec/fixtures/repos/assets_disabled/README +1 -0
  40. data/spec/fixtures/repos/assets_disabled/Rakefile +6 -0
  41. data/spec/fixtures/repos/assets_disabled/app/assets/empty +0 -0
  42. data/spec/fixtures/repos/assets_disabled/config/application.rb +5 -0
  43. data/spec/fixtures/repos/assets_disabled/config/ey.yml +3 -0
  44. data/spec/fixtures/repos/assets_disabled_in_ey_yml/Gemfile +5 -0
  45. data/spec/fixtures/repos/assets_disabled_in_ey_yml/Gemfile.lock +88 -0
  46. data/spec/fixtures/repos/assets_disabled_in_ey_yml/README +1 -0
  47. data/spec/fixtures/repos/assets_disabled_in_ey_yml/Rakefile +6 -0
  48. data/spec/fixtures/repos/assets_disabled_in_ey_yml/app/assets/empty +0 -0
  49. data/spec/fixtures/repos/assets_disabled_in_ey_yml/config/application.rb +5 -0
  50. data/spec/fixtures/repos/assets_disabled_in_ey_yml/config/ey.yml +5 -0
  51. data/spec/fixtures/repos/assets_disabled_utf8/Gemfile +5 -0
  52. data/spec/fixtures/repos/assets_disabled_utf8/Gemfile.lock +88 -0
  53. data/spec/fixtures/repos/assets_disabled_utf8/README +3 -0
  54. data/spec/fixtures/repos/assets_disabled_utf8/Rakefile +5 -0
  55. data/spec/fixtures/repos/assets_disabled_utf8/app/assets/empty +0 -0
  56. data/spec/fixtures/repos/assets_disabled_utf8/config/application.rb +7 -0
  57. data/spec/fixtures/repos/assets_disabled_utf8/config/ey.yml +3 -0
  58. data/spec/fixtures/repos/assets_enabled_all/Gemfile +5 -0
  59. data/spec/fixtures/repos/assets_enabled_all/Gemfile.lock +88 -0
  60. data/spec/fixtures/repos/assets_enabled_all/README +1 -0
  61. data/spec/fixtures/repos/assets_enabled_all/app/assets/empty +0 -0
  62. data/spec/fixtures/repos/assets_enabled_all/config/application.rb +5 -0
  63. data/spec/fixtures/repos/assets_enabled_all/config/ey.yml +6 -0
  64. data/spec/fixtures/repos/assets_enabled_all/script/assets +5 -0
  65. data/spec/fixtures/repos/assets_enabled_all/tmp/obstruction +1 -0
  66. data/spec/fixtures/repos/assets_enabled_in_ey_yml/Gemfile +3 -0
  67. data/spec/fixtures/repos/assets_enabled_in_ey_yml/Gemfile.lock +10 -0
  68. data/spec/fixtures/repos/assets_enabled_in_ey_yml/README +1 -0
  69. data/spec/fixtures/repos/assets_enabled_in_ey_yml/Rakefile +8 -0
  70. data/spec/fixtures/repos/assets_enabled_in_ey_yml/config/ey.yml +4 -0
  71. data/spec/fixtures/repos/assets_enabled_util_only/Gemfile +5 -0
  72. data/spec/fixtures/repos/assets_enabled_util_only/Gemfile.lock +88 -0
  73. data/spec/fixtures/repos/assets_enabled_util_only/README +1 -0
  74. data/spec/fixtures/repos/assets_enabled_util_only/Rakefile +6 -0
  75. data/spec/fixtures/repos/assets_enabled_util_only/app/assets/empty +0 -0
  76. data/spec/fixtures/repos/assets_enabled_util_only/config/application.rb +5 -0
  77. data/spec/fixtures/repos/assets_enabled_util_only/config/ey.yml +6 -0
  78. data/spec/fixtures/repos/assets_in_hook/Gemfile +5 -0
  79. data/spec/fixtures/repos/assets_in_hook/Gemfile.lock +88 -0
  80. data/spec/fixtures/repos/assets_in_hook/README +2 -0
  81. data/spec/fixtures/repos/assets_in_hook/Rakefile +5 -0
  82. data/spec/fixtures/repos/assets_in_hook/app/assets/empty +0 -0
  83. data/spec/fixtures/repos/assets_in_hook/config/application.rb +5 -0
  84. data/spec/fixtures/repos/assets_in_hook/config/ey.yml +3 -0
  85. data/spec/fixtures/repos/assets_in_hook/deploy/before_compile_assets.rb +2 -0
  86. data/spec/fixtures/repos/bundle_fails/Gemfile +1 -0
  87. data/spec/fixtures/repos/bundle_fails/README +1 -0
  88. data/spec/fixtures/repos/bundle_fails/deploy/after_bundle.rb +1 -0
  89. data/spec/fixtures/repos/bundler_disabled/Gemfile +4 -0
  90. data/spec/fixtures/repos/bundler_disabled/Gemfile.lock +12 -0
  91. data/spec/fixtures/repos/bundler_disabled/README +1 -0
  92. data/spec/fixtures/repos/bundler_disabled/config/ey.yml +2 -0
  93. data/spec/fixtures/repos/bundler_disabled/deploy/after_bundle.rb +1 -0
  94. data/spec/fixtures/repos/bundler_disabled/deploy/before_bundle.rb +1 -0
  95. data/spec/fixtures/repos/bundler_old/Gemfile +5 -0
  96. data/spec/fixtures/repos/bundler_old/Gemfile.lock +15 -0
  97. data/spec/fixtures/repos/bundler_old/README +1 -0
  98. data/spec/fixtures/repos/default/Gemfile +4 -0
  99. data/spec/fixtures/repos/default/Gemfile.lock +12 -0
  100. data/spec/fixtures/repos/default/README +5 -0
  101. data/spec/fixtures/repos/default/ey.yml +3 -0
  102. data/spec/fixtures/repos/executable_hooks/README +1 -0
  103. data/spec/fixtures/repos/executable_hooks/deploy/before_restart +72 -0
  104. data/spec/fixtures/repos/executable_hooks_not_executable/README +3 -0
  105. data/spec/fixtures/repos/executable_hooks_not_executable/deploy/before_restart +3 -0
  106. data/spec/fixtures/repos/ey_yml/Gemfile +4 -0
  107. data/spec/fixtures/repos/ey_yml/Gemfile.lock +12 -0
  108. data/spec/fixtures/repos/ey_yml/README +1 -0
  109. data/spec/fixtures/repos/ey_yml/config/ey.yml +18 -0
  110. data/spec/fixtures/repos/ey_yml/deploy/before_migrate.rb +6 -0
  111. data/spec/fixtures/repos/ey_yml_alt/Gemfile +4 -0
  112. data/spec/fixtures/repos/ey_yml_alt/Gemfile.lock +12 -0
  113. data/spec/fixtures/repos/ey_yml_alt/README +1 -0
  114. data/spec/fixtures/repos/ey_yml_alt/deploy/before_migrate.rb +6 -0
  115. data/spec/fixtures/repos/ey_yml_alt/ey.yml +12 -0
  116. data/spec/fixtures/repos/hook_fails/README +1 -0
  117. data/spec/fixtures/repos/hook_fails/deploy/before_deploy.rb +1 -0
  118. data/spec/fixtures/repos/hooks/README +1 -0
  119. data/spec/fixtures/repos/hooks/deploy/after_bundle.rb +1 -0
  120. data/spec/fixtures/repos/hooks/deploy/after_compile_assets.rb +1 -0
  121. data/spec/fixtures/repos/hooks/deploy/after_deploy.rb +1 -0
  122. data/spec/fixtures/repos/hooks/deploy/after_migrate.rb +1 -0
  123. data/spec/fixtures/repos/hooks/deploy/after_restart.rb +1 -0
  124. data/spec/fixtures/repos/hooks/deploy/after_symlink.rb +1 -0
  125. data/spec/fixtures/repos/hooks/deploy/before_bundle.rb +1 -0
  126. data/spec/fixtures/repos/hooks/deploy/before_compile_assets.rb +1 -0
  127. data/spec/fixtures/repos/hooks/deploy/before_deploy.rb +1 -0
  128. data/spec/fixtures/repos/hooks/deploy/before_migrate.rb +1 -0
  129. data/spec/fixtures/repos/hooks/deploy/before_restart.rb +1 -0
  130. data/spec/fixtures/repos/hooks/deploy/before_symlink.rb +1 -0
  131. data/spec/fixtures/repos/multi_dep_manager/README +1 -0
  132. data/spec/fixtures/repos/multi_dep_manager/composer.json +5 -0
  133. data/spec/fixtures/repos/multi_dep_manager/composer.lock +462 -0
  134. data/spec/fixtures/repos/multi_dep_manager/package.json +7 -0
  135. data/spec/fixtures/repos/multi_dep_manager/public/index.php +4 -0
  136. data/spec/fixtures/repos/no_ey_config/Gemfile +3 -0
  137. data/spec/fixtures/repos/no_ey_config/Gemfile.lock +10 -0
  138. data/spec/fixtures/repos/no_ey_config/README +1 -0
  139. data/spec/fixtures/repos/no_ey_config/ey.yml +3 -0
  140. data/spec/fixtures/repos/no_gemfile_lock/Gemfile +4 -0
  141. data/spec/fixtures/repos/no_gemfile_lock/README +1 -0
  142. data/spec/fixtures/repos/no_gemfile_lock/ey.yml +3 -0
  143. data/spec/fixtures/repos/nodejs/README +1 -0
  144. data/spec/fixtures/repos/nodejs/package.json +7 -0
  145. data/spec/fixtures/repos/not_bundled/README +1 -0
  146. data/spec/fixtures/repos/npm_disabled/README +1 -0
  147. data/spec/fixtures/repos/npm_disabled/config/ey.yml +2 -0
  148. data/spec/fixtures/repos/npm_disabled/package.json +7 -0
  149. data/spec/fixtures/repos/php_composer_disabled/README +1 -0
  150. data/spec/fixtures/repos/php_composer_disabled/composer.json +5 -0
  151. data/spec/fixtures/repos/php_composer_disabled/composer.lock +462 -0
  152. data/spec/fixtures/repos/php_composer_disabled/config/ey.yml +2 -0
  153. data/spec/fixtures/repos/php_composer_disabled/public/index.php +4 -0
  154. data/spec/fixtures/repos/php_composer_lock/README +1 -0
  155. data/spec/fixtures/repos/php_composer_lock/composer.json +5 -0
  156. data/spec/fixtures/repos/php_composer_lock/composer.lock +462 -0
  157. data/spec/fixtures/repos/php_composer_lock/public/index.php +4 -0
  158. data/spec/fixtures/repos/php_no_composer_lock/README +1 -0
  159. data/spec/fixtures/repos/php_no_composer_lock/composer.json +21 -0
  160. data/spec/fixtures/repos/php_no_composer_lock/public/index.php +4 -0
  161. data/spec/fixtures/repos/public_system/Gemfile +4 -0
  162. data/spec/fixtures/repos/public_system/Gemfile.lock +12 -0
  163. data/spec/fixtures/repos/public_system/README +5 -0
  164. data/spec/fixtures/repos/public_system/ey.yml +3 -0
  165. data/spec/fixtures/repos/public_system/public/system/cant_touch_this.txt +3 -0
  166. data/spec/fixtures/repos/sqlite3/Gemfile +4 -0
  167. data/spec/fixtures/repos/sqlite3/Gemfile.lock +89 -0
  168. data/spec/fixtures/repos/sqlite3/README +1 -0
  169. data/spec/fixtures/retwisj.war +0 -0
  170. data/spec/fixtures/valid_hook.rb +1 -0
  171. data/spec/git_strategy_spec.rb +34 -0
  172. data/spec/lockfile_parser_spec.rb +126 -0
  173. data/spec/maintenance_spec.rb +44 -0
  174. data/spec/multi_dependency_manager_spec.rb +25 -0
  175. data/spec/nodejs_deploy_spec.rb +30 -0
  176. data/spec/php_deploy_spec.rb +81 -0
  177. data/spec/platform_configure_spec.rb +61 -0
  178. data/spec/rails31_deploy_spec.rb +164 -0
  179. data/spec/restart_spec.rb +43 -0
  180. data/spec/rollback_spec.rb +87 -0
  181. data/spec/server_spec.rb +70 -0
  182. data/spec/services_deploy_spec.rb +153 -0
  183. data/spec/shell_spec.rb +57 -0
  184. data/spec/source/archive_spec.rb +33 -0
  185. data/spec/source/git_spec.rb +44 -0
  186. data/spec/spec_helper.rb +360 -0
  187. data/spec/sqlite3_deploy_spec.rb +38 -0
  188. data/spec/support/integration.rb +103 -0
  189. data/spec/support/source_doubles.rb +28 -0
  190. data/spec/support/timecop.rb +5 -0
  191. data/spec/symlink_spec.rb +15 -0
  192. metadata +378 -4
@@ -0,0 +1,81 @@
1
+ require 'spec_helper'
2
+
3
+ describe "Deploying an application that uses PHP and Composer" do
4
+
5
+ with_composer_mocked do |mocked|
6
+ context "with composer available" do
7
+ before(:all) { mock_composer if mocked }
8
+
9
+ context "with a composer.lock" do
10
+ before(:all) do
11
+ deploy_test_application('php_composer_lock')
12
+ end
13
+
14
+ it "runs 'composer install'" do
15
+ install_cmd = @deployer.commands.grep(/composer install/).first
16
+ expect(install_cmd).not_to be_nil
17
+ end
18
+
19
+ it "attempts to run 'composer self-update' before 'composer install'" do
20
+ update_cmd = nil
21
+ @deployer.commands.each do |cmd|
22
+ update_cmd ||= /composer.*self-update/.match(cmd)
23
+ if /composer install/.match(cmd)
24
+ expect(update_cmd).not_to be nil
25
+ end
26
+ end
27
+ end
28
+ end
29
+
30
+ context "with composer disabled in ey.yml" do
31
+ before(:all) do
32
+ deploy_test_application('php_composer_disabled')
33
+ end
34
+
35
+ it "does not run composer" do
36
+ expect(@deployer.commands.grep(/composer/)).to be_empty
37
+ end
38
+ end
39
+
40
+ context "WITHOUT a composer.lock but with composer.json" do
41
+ before(:all) do
42
+ deploy_test_application('php_no_composer_lock')
43
+ end
44
+
45
+ it "outputs a warning about deploying without a .lock" do
46
+ warning_out = expect(read_output).to include("WARNING: composer.json found but composer.lock missing!")
47
+ expect(warning_out).not_to be_nil
48
+ end
49
+
50
+ it "runs 'composer install'" do
51
+ install_cmd = @deployer.commands.grep(/composer install/).first
52
+ expect(install_cmd).not_to be_nil
53
+ end
54
+
55
+ it "attempts to run 'composer self-update' before 'composer install'" do
56
+ update_cmd = nil
57
+ @deployer.commands.each do |cmd|
58
+ update_cmd ||= /composer.*self-update/.match(cmd)
59
+ if /composer install/.match(cmd)
60
+ expect(update_cmd).not_to be nil
61
+ end
62
+ end
63
+ end
64
+
65
+ end
66
+
67
+ end
68
+
69
+ unless $COMPOSER_INSTALLED
70
+ context "without composer available" do
71
+
72
+ it "fails to deploy" do
73
+ expect {deploy_test_application('php_composer_lock')}.to raise_error EY::Serverside::RemoteFailure
74
+ expect {deploy_test_application('php_no_composer_lock')}.to raise_error EY::Serverside::RemoteFailure
75
+ end
76
+
77
+ end
78
+ end
79
+ end
80
+ end
81
+
@@ -0,0 +1,61 @@
1
+ require 'spec_helper'
2
+
3
+ describe "Deploying an application with platform configure command" do
4
+ describe "configure script does not exist" do
5
+ before do
6
+ @releases_failed = deploy_dir.join('releases_failed')
7
+ deploy_test_application('default')
8
+ end
9
+
10
+ it "works without warning" do
11
+ expect(read_output).not_to match(/WARNING/)
12
+
13
+ expect(@releases_failed).not_to exist
14
+ end
15
+ end
16
+
17
+ describe "a succesful deploy" do
18
+ before do
19
+ @releases_failed = deploy_dir.join('releases_failed')
20
+ ENV['EY_SERVERSIDE_CONFIGURE_COMMAND'] = "echo platform_configure_command_ran >&2"
21
+ deploy_test_application('default')
22
+ end
23
+
24
+ after do
25
+ ENV.delete('EY_SERVERSIDE_CONFIGURE_COMMAND')
26
+ end
27
+
28
+ it "runs the configure_command during deploy and finishes successfully" do
29
+ expect(read_output).to match(/platform_configure_command_ran/)
30
+
31
+ expect(@releases_failed).not_to exist
32
+
33
+ restart = deploy_dir.join('current', 'restart')
34
+ expect(restart).to exist
35
+ end
36
+ end
37
+
38
+ describe "a failed configure command" do
39
+
40
+ before do
41
+ ENV['EY_SERVERSIDE_CONFIGURE_COMMAND'] = "echo platform_configure_command_failed >&2 && false"
42
+ end
43
+
44
+ after do
45
+ ENV.delete('EY_SERVERSIDE_CONFIGURE_COMMAND')
46
+ end
47
+
48
+ it "aborts the deplo when it fails, preventing the app from being restarted" do
49
+ @releases_failed = deploy_dir.join('releases_failed')
50
+ expect(@releases_failed).not_to exist
51
+
52
+ begin
53
+ deploy_test_application('default')
54
+ rescue
55
+ end
56
+ expect(read_output).to match(/platform_configure_command_failed/)
57
+
58
+ expect(@releases_failed.entries).not_to be_empty
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,164 @@
1
+ require 'spec_helper'
2
+
3
+ describe "Deploying a Rails 3.1 application" do
4
+ context "with default production settings" do
5
+ it "precompiles assets when asset compilation is detected" do
6
+ deploy_test_application('assets_detected')
7
+ expect(deploy_dir.join('current', 'precompiled')).to exist
8
+ expect(deploy_dir.join('current', 'public', 'assets')).to exist
9
+ expect(deploy_dir.join('current', 'public', 'assets', 'compiled_asset')).to exist
10
+ expect(read_output).to include("Precompiling assets. ('app/assets' exists, 'public/assets' not found, not disabled in config.)")
11
+ end
12
+
13
+ it "precompiles assets, then reuses them on the next deploy if nothing has changed" do
14
+ deploy_test_application('assets_enabled_in_ey_yml')
15
+ expect(deploy_dir.join('current', 'precompiled')).to exist
16
+ expect(deploy_dir.join('current', 'public', 'assets')).to exist
17
+ expect(deploy_dir.join('current', 'public', 'assets', 'compiled_asset')).to exist
18
+
19
+ redeploy_test_application
20
+ expect(deploy_dir.join('current', 'precompiled')).not_to exist # doesn't run the task
21
+ expect(deploy_dir.join('current', 'public', 'assets')).to exist # but the assets are there
22
+ expect(deploy_dir.join('current', 'public', 'assets', 'compiled_asset')).to exist
23
+ expect(read_output).to match(%r#Reusing existing assets\. \(configured asset_dependencies unchanged from \w{7}..\w{7}\)#)
24
+
25
+ redeploy_test_application('config' => {'precompile_unchanged_assets' => 'true'})
26
+ expect(deploy_dir.join('current', 'precompiled')).to exist # doesn't run the task
27
+ expect(deploy_dir.join('current', 'public', 'assets')).to exist # but the assets are there
28
+ expect(deploy_dir.join('current', 'public', 'assets', 'compiled_asset')).to exist
29
+ expect(read_output).not_to include("Reusing existing assets")
30
+ end
31
+
32
+ it "precompile assets again when redeploying a ref with changes" do
33
+ deploy_test_application('assets_enabled_in_ey_yml')
34
+ expect(deploy_dir.join('current', 'precompiled')).to exist
35
+ expect(deploy_dir.join('current', 'public', 'assets')).to exist
36
+ expect(deploy_dir.join('current', 'public', 'assets', 'compiled_asset')).to exist
37
+ expect(deploy_dir.join('current', 'tmp', 'cache')).to exist
38
+ expect(deploy_dir.join('current', 'tmp')).to be_a_symlink
39
+ expect(deploy_dir.join('current', 'cache_compiled')).not_to exist
40
+ expect(read_output).to include("Precompiling assets. (precompile_assets: true)")
41
+
42
+ # changing the ref stands in for actually having assets change (see Strategies::IntegrationSpec#same?)
43
+ redeploy_test_application('branch' => 'somenewref')
44
+ expect(deploy_dir.join('current', 'precompiled')).to exist # it does runs the task
45
+ expect(deploy_dir.join('current', 'public', 'assets')).to exist
46
+ expect(deploy_dir.join('current', 'public', 'assets', 'compiled_asset')).to exist
47
+ expect(deploy_dir.join('current', 'tmp')).to be_a_symlink
48
+ expect(deploy_dir.join('current', 'tmp', 'cache')).to exist # preserves tmp dir
49
+ expect(deploy_dir.join('current', 'cache_compiled')).to exist # uses tmp/cache to compile assets faster
50
+ expect(read_output).not_to match(%r#Reusing existing assets#)
51
+ end
52
+
53
+ it "precompile assets when redeploying the same ref, but assets were turned off the first time" do
54
+ deploy_test_application('assets_enabled_in_ey_yml', 'config' => {'precompile_assets' => 'false'})
55
+ expect(deploy_dir.join('current', 'precompiled')).not_to exist
56
+ expect(deploy_dir.join('current', 'public', 'assets')).not_to exist
57
+ expect(deploy_dir.join('current', 'public', 'assets', 'compiled_asset')).not_to exist
58
+ expect(read_output).not_to include("Precompiling assets. (precompile_assets: true)")
59
+
60
+ # assets will show as unchanged, but it should compile them fresh anyway.
61
+ redeploy_test_application('config' => {'precompile_assets' => 'true'})
62
+ expect(deploy_dir.join('current', 'precompiled')).to exist # it does runs the task
63
+ expect(deploy_dir.join('current', 'public', 'assets')).to exist
64
+ expect(deploy_dir.join('current', 'public', 'assets', 'compiled_asset')).to exist
65
+ expect(read_output).not_to match(%r#Reusing existing assets#)
66
+ end
67
+
68
+ %w[cleaning shared private].each do |strategy|
69
+ it "precompiles assets with asset_strategy '#{strategy}', then reuses them on the next deploy if nothing has changed" do
70
+ deploy_test_application('assets_enabled_in_ey_yml', 'config' => {'asset_strategy' => strategy})
71
+ expect(deploy_dir.join('current', 'precompiled')).to exist
72
+ expect(deploy_dir.join('current', 'public', 'assets')).to exist
73
+ expect(deploy_dir.join('current', 'public', 'assets', 'compiled_asset')).to exist
74
+
75
+ redeploy_test_application
76
+ expect(deploy_dir.join('current', 'precompiled')).not_to exist # doesn't run the task
77
+ expect(deploy_dir.join('current', 'public', 'assets')).to exist # but the assets are there
78
+ expect(deploy_dir.join('current', 'public', 'assets', 'compiled_asset')).to exist
79
+ expect(read_output).to match(%r#Reusing existing assets\. \(configured asset_dependencies unchanged from \w{7}..\w{7}\)#)
80
+ end
81
+ end
82
+ end
83
+
84
+ context "with asset compilation enabled in ey.yml, despite not otherwise being enabled" do
85
+ before(:all) do
86
+ deploy_test_application('assets_enabled_in_ey_yml')
87
+ end
88
+
89
+ it "precompiles assets" do
90
+ expect(deploy_dir.join('current', 'precompiled')).to exist
91
+ expect(read_output).to include("Precompiling assets. (precompile_assets: true)")
92
+ end
93
+ end
94
+
95
+ context "with asset compilation enabled in ey.yml, but asset_roles is set to only :util" do
96
+ before(:all) do
97
+ deploy_test_application('assets_enabled_util_only')
98
+ end
99
+
100
+ it "precompiles assets" do
101
+ expect(deploy_dir.join('current', 'precompiled')).not_to exist
102
+ expect(read_output).to include("Precompiling assets. (precompile_assets: true)")
103
+ end
104
+ end
105
+
106
+ context "with asset compilation enabled in ey.yml, and asset_roles is set to :all, and a custom compile command" do
107
+ before(:all) do
108
+ deploy_test_application('assets_enabled_all')
109
+ end
110
+
111
+ it "precompiles assets but never shares the tmp cache because the repository has a committed tmp dir with contents" do
112
+ expect(deploy_dir.join('current', 'custom_compiled')).to exist
113
+ expect(deploy_dir.join('current', 'cache_compiled')).not_to exist
114
+ expect(deploy_dir.join('current', 'tmp', 'cache')).to exist
115
+ expect(deploy_dir.join('current', 'tmp')).not_to be_a_symlink
116
+ expect(read_output).to include("Precompiling assets. (precompile_assets: true)")
117
+
118
+ redeploy_test_application('config' => {'precompile_unchanged_assets' => 'true'})
119
+ expect(deploy_dir.join('current', 'tmp', 'cache')).to exist
120
+ expect(deploy_dir.join('current', 'cache_compiled')).not_to exist
121
+ expect(deploy_dir.join('current', 'tmp')).not_to be_a_symlink
122
+ end
123
+ end
124
+
125
+ context "with asset support disabled in config/application.rb" do
126
+ it "does not precompile assets" do
127
+ deploy_test_application('assets_disabled')
128
+ expect(deploy_dir.join('current', 'precompiled')).not_to exist
129
+ expect(read_output).to include("Skipping asset precompilation. ('config/application.rb' disables assets.)")
130
+ end
131
+
132
+ it "deploys successfully when application.rb has utf-8 encoding" do
133
+ deploy_test_application('assets_disabled_utf8')
134
+ expect(deploy_dir.join('current', 'precompiled')).not_to exist
135
+ expect(read_output).to include("Skipping asset precompilation. ('config/application.rb' disables assets.)")
136
+ end
137
+ end
138
+
139
+ context "with asset compilation disabled in ey.yml, despite all other configuration would enable assets" do
140
+ before(:all) do
141
+ deploy_test_application('assets_disabled_in_ey_yml')
142
+ end
143
+
144
+ it "does not precompile assets" do
145
+ expect(deploy_dir.join('current', 'precompiled')).not_to exist
146
+ expect(read_output).to include("Skipping asset precompilation. (precompile_assets: false)")
147
+ end
148
+ end
149
+
150
+ context "with existing precompilation in a deploy hook" do
151
+ before(:all) do
152
+ deploy_test_application('assets_in_hook')
153
+ end
154
+
155
+ it "does not replace the public/assets directory" do
156
+ expect(deploy_dir.join('current', 'custom_compiled')).to exist
157
+ expect(deploy_dir.join('current', 'precompiled')).not_to exist
158
+ expect(deploy_dir.join('current', 'public', 'assets')).to be_directory
159
+ expect(deploy_dir.join('current', 'public', 'assets')).not_to be_symlink
160
+ expect(deploy_dir.join('current', 'public', 'assets', 'custom_compiled_asset')).to exist
161
+ expect(read_output).to include("Skipping asset precompilation. ('public/assets' directory already exists.)")
162
+ end
163
+ end
164
+ end
@@ -0,0 +1,43 @@
1
+ require 'spec_helper'
2
+
3
+ class TestRestartDeploy < FullTestDeploy
4
+ attr_reader :call_order
5
+ def initialize(*a)
6
+ super
7
+ @call_order = []
8
+ end
9
+
10
+ def require_custom_tasks() @call_order << 'require_custom_tasks' end
11
+ def restart() @call_order << 'restart' end
12
+ def enable_maintenance_page() @call_order << 'enable_maintenance_page' end
13
+ def disable_maintenance_page() @call_order << 'disable_maintenance_page' end
14
+ end
15
+
16
+ describe "EY::Serverside::Deploy#restart_with_maintenance_page" do
17
+
18
+ class TestRestartWithMaintenancePage < TestRestartDeploy
19
+ def conditionally_enable_maintenance_page() @call_order << 'conditionally_enable_maintenance_page' end
20
+ end
21
+
22
+ it "puts up the maintenance page if necessary, restarts, and takes down the maintenance page" do
23
+ config = EY::Serverside::Deploy::Configuration.new('deploy_to' => deploy_dir, 'app' => 'app_name')
24
+ deployer = TestRestartWithMaintenancePage.realnew(test_servers, config, test_shell)
25
+ deployer.restart_with_maintenance_page
26
+ expect(deployer.call_order).to eq(%w(
27
+ require_custom_tasks
28
+ enable_maintenance_page
29
+ restart
30
+ disable_maintenance_page
31
+ ))
32
+ end
33
+ end
34
+
35
+ describe "glassfish stack" do
36
+
37
+ it "requires a maintenance page" do
38
+ config = EY::Serverside::Deploy::Configuration.new('deploy_to' => deploy_dir, 'app' => 'app_name', 'stack' => 'glassfish')
39
+ deployer = TestRestartDeploy.realnew(test_servers, config, test_shell)
40
+ deployer.restart_with_maintenance_page
41
+ expect(deployer.call_order).to include('enable_maintenance_page')
42
+ end
43
+ end
@@ -0,0 +1,87 @@
1
+ require 'spec_helper'
2
+
3
+ describe "Rolling back" do
4
+ def setup_good_and_bad_deploy(repo)
5
+ deploy_test_application(repo, 'migrate' => nil)
6
+ @good_revision = deploy_dir.join('current', 'REVISION').read.strip
7
+ expect(deploy_dir.join('current', 'REVISION')).to exist
8
+ deploy_dir.join('current', 'restart').delete
9
+ deploy_test_application(repo, 'migrate' => nil)
10
+ expect(deploy_dir.join('current', 'REVISION')).to exist
11
+ deploy_dir.join('current', 'restart').delete
12
+
13
+ releases = @deployer.config.paths.all_releases
14
+ expect(releases.size).to eq(2)
15
+ @good_release = releases.first
16
+ @bad_release = releases.last
17
+ end
18
+
19
+ def rollback
20
+ argv = @adapter.rollback.commands.last.to_argv[2..-1]
21
+ with_mocked_commands do
22
+ capture do
23
+ EY::Serverside::CLI::App.start(argv)
24
+ end
25
+ end
26
+ end
27
+
28
+ context "without bundler" do
29
+ before(:all) do
30
+ setup_good_and_bad_deploy('not_bundled')
31
+ rollback
32
+ end
33
+
34
+ it "rolls back to the older deploy" do
35
+ out = read_output
36
+ expect(out).to match(/Rolling back to previous release.*#{@good_revision}/)
37
+ expect(out).to match(/Restarting with previous release./)
38
+ expect(out).to match(/Finished rollback/)
39
+
40
+ expect(deploy_dir.join('current', 'restart')).to exist
41
+ expect(@bad_release).not_to exist
42
+ expect(@good_release.join('restart')).to exist
43
+ end
44
+ end
45
+
46
+ context "with a problematic file in the releases dir" do
47
+ before(:all) do
48
+ setup_good_and_bad_deploy('not_bundled')
49
+ @deployer.config.paths.releases.join('tmp').mkpath
50
+ expect { rollback }.to raise_error
51
+ end
52
+
53
+ it "rolls back to the older deploy" do
54
+ out = read_output
55
+ expect(out).to include("Bad paths found in #{@deployer.config.paths.releases}:")
56
+ expect(out).to include(@deployer.config.paths.releases.join('tmp').to_s)
57
+ expect(out).to include("Storing files in this directory will disrupt latest_release, diff detection, rollback, and possibly other features.")
58
+ expect(out).to_not include("Restarting with previous release.")
59
+
60
+ expect(deploy_dir.join('current', 'restart')).not_to exist
61
+ expect(@bad_release).to exist
62
+ expect(@good_release).to exist
63
+ end
64
+ end
65
+
66
+ context "with complex config" do
67
+ before(:all) do
68
+ setup_good_and_bad_deploy('ey_yml')
69
+ rollback
70
+ end
71
+
72
+ it "rolls back to the older deploy" do
73
+ out = read_output
74
+ expect(out).to match(/Rolling back to previous release.*#{@good_revision}/)
75
+ expect(out).to match(/Restarting with previous release./)
76
+ expect(out).to match(/Finished rollback/)
77
+
78
+ expect(deploy_dir.join('current', 'restart')).to exist
79
+ expect(@bad_release).not_to exist
80
+ expect(@good_release.join('restart')).to exist
81
+ end
82
+
83
+ it "loads and uses ey.yml during rollback" do
84
+ expect(read_output).to match(/--without only test/)
85
+ end
86
+ end
87
+ end
@@ -0,0 +1,70 @@
1
+ require 'spec_helper'
2
+
3
+ describe EY::Serverside::Server do
4
+ it "starts off empty" do
5
+ expect(EY::Serverside::Servers.new([], test_shell)).to be_empty
6
+ end
7
+
8
+ it "loads from hashes" do
9
+ servers = EY::Serverside::Servers.from_hashes([{:hostname => 'otherhost', :roles => %w[fire water]}], test_shell)
10
+ expect(servers.size).to eq(1)
11
+ end
12
+
13
+ it "rejects duplicates" do
14
+ expect do
15
+ EY::Serverside::Servers.from_hashes([
16
+ {:hostname => 'otherhost', :roles => [:fire]},
17
+ {:hostname => 'otherhost', :roles => [:water]},
18
+ ], test_shell)
19
+ end.to raise_error(EY::Serverside::Servers::DuplicateHostname)
20
+ end
21
+
22
+ it "makes sure your roles are symbols at creation time" do
23
+ servers = EY::Serverside::Servers.from_hashes([{:hostname => 'otherhost', :roles => %w[fire water]}], test_shell)
24
+ servers.each { |server| expect(server.roles).to eq(Set[:fire, :water]) }
25
+ end
26
+
27
+ context "filtering" do
28
+ before(:each) do
29
+ @servers = EY::Serverside::Servers.from_hashes([
30
+ {:hostname => 'localhost', :roles => [:ice, :cold]},
31
+ {:hostname => 'firewater', :roles => [:fire, :water]},
32
+ {:hostname => 'icewater', :roles => [:ice, :water]},
33
+ ], test_shell)
34
+ end
35
+
36
+ it "#roles works with strings or symbols" do
37
+ expect(@servers.roles(:fire ).map{|s| s.hostname}).to eq(['firewater'])
38
+ expect(@servers.roles('fire').map{|s| s.hostname}).to eq(['firewater']) # hits the cache the second time
39
+ end
40
+
41
+ it "#roles finds all servers with the specified role" do
42
+ expect(@servers.roles(:ice).size).to eq(2)
43
+ expect(@servers.roles(:ice).map{|s| s.hostname}.sort).to eq(['icewater','localhost'])
44
+ end
45
+
46
+ it "#roles finds all servers with any of the specified roles" do
47
+ expect(@servers.roles(:ice, :water)).to eq(@servers)
48
+ end
49
+
50
+ it "#roles returns everything when asked for :all" do
51
+ expect(@servers.roles(:all)).to eq(@servers)
52
+ end
53
+
54
+ it "#roles also yields filtered server set" do
55
+ @servers.roles(:ice) do |servers|
56
+ expect(servers.size).to eq(2)
57
+ expect(servers.map{|s| s.hostname}.sort).to eq(['icewater','localhost'])
58
+ end
59
+ end
60
+
61
+ it "#localhost returns the localhost server" do
62
+ expect(@servers.localhost.hostname).to eq('localhost')
63
+ end
64
+
65
+ it "#remote returns non-localhost servers" do
66
+ expect(@servers.remote.size).to eq(2)
67
+ expect(@servers.remote.map {|s| s.hostname}.sort).to eq(['firewater','icewater'])
68
+ end
69
+ end
70
+ end