engineyard-serverside 2.6.14 → 2.6.15.alpha1

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 (209) hide show
  1. checksums.yaml +13 -5
  2. data/bin/engineyard-serverside +1 -1
  3. data/lib/engineyard-serverside/cli.rb +4 -225
  4. data/lib/engineyard-serverside/cli/app.rb +136 -0
  5. data/lib/engineyard-serverside/cli/helpers.rb +58 -0
  6. data/lib/engineyard-serverside/cli/server_hash_extractor.rb +49 -0
  7. data/lib/engineyard-serverside/cli/workflows.rb +45 -0
  8. data/lib/engineyard-serverside/cli/workflows/base.rb +78 -0
  9. data/lib/engineyard-serverside/cli/workflows/calling_deploy_hooks.rb +31 -0
  10. data/lib/engineyard-serverside/cli/workflows/deploying_applications.rb +28 -0
  11. data/lib/engineyard-serverside/cli/workflows/disabling_maintenance.rb +29 -0
  12. data/lib/engineyard-serverside/cli/workflows/enabling_maintenance.rb +29 -0
  13. data/lib/engineyard-serverside/cli/workflows/errors.rb +13 -0
  14. data/lib/engineyard-serverside/cli/workflows/helpers.rb +21 -0
  15. data/lib/engineyard-serverside/cli/workflows/integrating_servers.rb +63 -0
  16. data/lib/engineyard-serverside/cli/workflows/restarting_applications.rb +36 -0
  17. data/lib/engineyard-serverside/cli/workflows/rolling_back_applications.rb +28 -0
  18. data/lib/engineyard-serverside/cli/workflows/showing_maintenance_status.rb +28 -0
  19. data/lib/engineyard-serverside/dependency_manager/bundler.rb +43 -14
  20. data/lib/engineyard-serverside/propagator.rb +59 -0
  21. data/lib/engineyard-serverside/rails_assets.rb +5 -2
  22. data/lib/engineyard-serverside/version.rb +1 -1
  23. metadata +66 -394
  24. data/lib/engineyard-serverside/cli_helpers.rb +0 -53
  25. data/spec/archive_deploy_spec.rb +0 -53
  26. data/spec/basic_deploy_spec.rb +0 -26
  27. data/spec/bundler_deploy_spec.rb +0 -139
  28. data/spec/configuration_spec.rb +0 -205
  29. data/spec/custom_deploy_spec.rb +0 -128
  30. data/spec/deploy_hook_spec.rb +0 -362
  31. data/spec/deprecation_spec.rb +0 -23
  32. data/spec/ey_yml_customized_deploy_spec.rb +0 -99
  33. data/spec/fixtures/gitrepo.tar.gz +0 -0
  34. data/spec/fixtures/gitrepo/bar +0 -0
  35. data/spec/fixtures/gitrepo/foo +0 -0
  36. data/spec/fixtures/invalid_hook.rb +0 -1
  37. data/spec/fixtures/lockfiles/0.9-no-bundler +0 -111
  38. data/spec/fixtures/lockfiles/0.9-with-bundler +0 -117
  39. data/spec/fixtures/lockfiles/1.0-no-bundler +0 -54
  40. data/spec/fixtures/lockfiles/1.0.0.rc.1-with-bundler +0 -162
  41. data/spec/fixtures/lockfiles/1.0.18-do_mysql +0 -88
  42. data/spec/fixtures/lockfiles/1.0.18-do_postgres +0 -79
  43. data/spec/fixtures/lockfiles/1.0.18-mysql +0 -43
  44. data/spec/fixtures/lockfiles/1.0.18-mysql2 +0 -43
  45. data/spec/fixtures/lockfiles/1.0.18-pg +0 -43
  46. data/spec/fixtures/lockfiles/1.0.6-no-bundler +0 -51
  47. data/spec/fixtures/lockfiles/1.0.6-with-any-bundler +0 -52
  48. data/spec/fixtures/lockfiles/1.0.6-with-bundler +0 -52
  49. data/spec/fixtures/lockfiles/1.3.1-rails-3.2.13 +0 -112
  50. data/spec/fixtures/lockfiles/not-a-lockfile +0 -1
  51. data/spec/fixtures/repos/assets_detected/Gemfile +0 -5
  52. data/spec/fixtures/repos/assets_detected/Gemfile.lock +0 -88
  53. data/spec/fixtures/repos/assets_detected/README +0 -1
  54. data/spec/fixtures/repos/assets_detected/Rakefile +0 -5
  55. data/spec/fixtures/repos/assets_detected/app/assets/empty +0 -0
  56. data/spec/fixtures/repos/assets_detected/config/application.rb +0 -5
  57. data/spec/fixtures/repos/assets_detected/config/ey.yml +0 -3
  58. data/spec/fixtures/repos/assets_disabled/Gemfile +0 -5
  59. data/spec/fixtures/repos/assets_disabled/Gemfile.lock +0 -88
  60. data/spec/fixtures/repos/assets_disabled/README +0 -1
  61. data/spec/fixtures/repos/assets_disabled/Rakefile +0 -6
  62. data/spec/fixtures/repos/assets_disabled/app/assets/empty +0 -0
  63. data/spec/fixtures/repos/assets_disabled/config/application.rb +0 -5
  64. data/spec/fixtures/repos/assets_disabled/config/ey.yml +0 -3
  65. data/spec/fixtures/repos/assets_disabled_in_ey_yml/Gemfile +0 -5
  66. data/spec/fixtures/repos/assets_disabled_in_ey_yml/Gemfile.lock +0 -88
  67. data/spec/fixtures/repos/assets_disabled_in_ey_yml/README +0 -1
  68. data/spec/fixtures/repos/assets_disabled_in_ey_yml/Rakefile +0 -6
  69. data/spec/fixtures/repos/assets_disabled_in_ey_yml/app/assets/empty +0 -0
  70. data/spec/fixtures/repos/assets_disabled_in_ey_yml/config/application.rb +0 -5
  71. data/spec/fixtures/repos/assets_disabled_in_ey_yml/config/ey.yml +0 -5
  72. data/spec/fixtures/repos/assets_disabled_utf8/Gemfile +0 -5
  73. data/spec/fixtures/repos/assets_disabled_utf8/Gemfile.lock +0 -88
  74. data/spec/fixtures/repos/assets_disabled_utf8/README +0 -3
  75. data/spec/fixtures/repos/assets_disabled_utf8/Rakefile +0 -5
  76. data/spec/fixtures/repos/assets_disabled_utf8/app/assets/empty +0 -0
  77. data/spec/fixtures/repos/assets_disabled_utf8/config/application.rb +0 -7
  78. data/spec/fixtures/repos/assets_disabled_utf8/config/ey.yml +0 -3
  79. data/spec/fixtures/repos/assets_enabled_all/Gemfile +0 -5
  80. data/spec/fixtures/repos/assets_enabled_all/Gemfile.lock +0 -88
  81. data/spec/fixtures/repos/assets_enabled_all/README +0 -1
  82. data/spec/fixtures/repos/assets_enabled_all/app/assets/empty +0 -0
  83. data/spec/fixtures/repos/assets_enabled_all/config/application.rb +0 -5
  84. data/spec/fixtures/repos/assets_enabled_all/config/ey.yml +0 -6
  85. data/spec/fixtures/repos/assets_enabled_all/script/assets +0 -5
  86. data/spec/fixtures/repos/assets_enabled_all/tmp/obstruction +0 -1
  87. data/spec/fixtures/repos/assets_enabled_in_ey_yml/Gemfile +0 -3
  88. data/spec/fixtures/repos/assets_enabled_in_ey_yml/Gemfile.lock +0 -10
  89. data/spec/fixtures/repos/assets_enabled_in_ey_yml/README +0 -1
  90. data/spec/fixtures/repos/assets_enabled_in_ey_yml/Rakefile +0 -8
  91. data/spec/fixtures/repos/assets_enabled_in_ey_yml/config/ey.yml +0 -4
  92. data/spec/fixtures/repos/assets_enabled_util_only/Gemfile +0 -5
  93. data/spec/fixtures/repos/assets_enabled_util_only/Gemfile.lock +0 -88
  94. data/spec/fixtures/repos/assets_enabled_util_only/README +0 -1
  95. data/spec/fixtures/repos/assets_enabled_util_only/Rakefile +0 -6
  96. data/spec/fixtures/repos/assets_enabled_util_only/app/assets/empty +0 -0
  97. data/spec/fixtures/repos/assets_enabled_util_only/config/application.rb +0 -5
  98. data/spec/fixtures/repos/assets_enabled_util_only/config/ey.yml +0 -6
  99. data/spec/fixtures/repos/assets_in_hook/Gemfile +0 -5
  100. data/spec/fixtures/repos/assets_in_hook/Gemfile.lock +0 -88
  101. data/spec/fixtures/repos/assets_in_hook/README +0 -2
  102. data/spec/fixtures/repos/assets_in_hook/Rakefile +0 -5
  103. data/spec/fixtures/repos/assets_in_hook/app/assets/empty +0 -0
  104. data/spec/fixtures/repos/assets_in_hook/config/application.rb +0 -5
  105. data/spec/fixtures/repos/assets_in_hook/config/ey.yml +0 -3
  106. data/spec/fixtures/repos/assets_in_hook/deploy/before_compile_assets.rb +0 -2
  107. data/spec/fixtures/repos/bundle_fails/Gemfile +0 -1
  108. data/spec/fixtures/repos/bundle_fails/README +0 -1
  109. data/spec/fixtures/repos/bundle_fails/deploy/after_bundle.rb +0 -1
  110. data/spec/fixtures/repos/bundler_disabled/Gemfile +0 -4
  111. data/spec/fixtures/repos/bundler_disabled/Gemfile.lock +0 -12
  112. data/spec/fixtures/repos/bundler_disabled/README +0 -1
  113. data/spec/fixtures/repos/bundler_disabled/config/ey.yml +0 -2
  114. data/spec/fixtures/repos/bundler_disabled/deploy/after_bundle.rb +0 -1
  115. data/spec/fixtures/repos/bundler_disabled/deploy/before_bundle.rb +0 -1
  116. data/spec/fixtures/repos/default/Gemfile +0 -4
  117. data/spec/fixtures/repos/default/Gemfile.lock +0 -12
  118. data/spec/fixtures/repos/default/README +0 -5
  119. data/spec/fixtures/repos/default/ey.yml +0 -3
  120. data/spec/fixtures/repos/executable_hooks/README +0 -1
  121. data/spec/fixtures/repos/executable_hooks/deploy/before_restart +0 -72
  122. data/spec/fixtures/repos/executable_hooks_not_executable/README +0 -3
  123. data/spec/fixtures/repos/executable_hooks_not_executable/deploy/before_restart +0 -3
  124. data/spec/fixtures/repos/ey_yml/Gemfile +0 -4
  125. data/spec/fixtures/repos/ey_yml/Gemfile.lock +0 -12
  126. data/spec/fixtures/repos/ey_yml/README +0 -1
  127. data/spec/fixtures/repos/ey_yml/config/ey.yml +0 -18
  128. data/spec/fixtures/repos/ey_yml/deploy/before_migrate.rb +0 -6
  129. data/spec/fixtures/repos/ey_yml_alt/Gemfile +0 -4
  130. data/spec/fixtures/repos/ey_yml_alt/Gemfile.lock +0 -12
  131. data/spec/fixtures/repos/ey_yml_alt/README +0 -1
  132. data/spec/fixtures/repos/ey_yml_alt/deploy/before_migrate.rb +0 -6
  133. data/spec/fixtures/repos/ey_yml_alt/ey.yml +0 -12
  134. data/spec/fixtures/repos/hook_fails/README +0 -1
  135. data/spec/fixtures/repos/hook_fails/deploy/before_deploy.rb +0 -1
  136. data/spec/fixtures/repos/hooks/README +0 -1
  137. data/spec/fixtures/repos/hooks/deploy/after_bundle.rb +0 -1
  138. data/spec/fixtures/repos/hooks/deploy/after_compile_assets.rb +0 -1
  139. data/spec/fixtures/repos/hooks/deploy/after_deploy.rb +0 -1
  140. data/spec/fixtures/repos/hooks/deploy/after_migrate.rb +0 -1
  141. data/spec/fixtures/repos/hooks/deploy/after_restart.rb +0 -1
  142. data/spec/fixtures/repos/hooks/deploy/after_symlink.rb +0 -1
  143. data/spec/fixtures/repos/hooks/deploy/before_bundle.rb +0 -1
  144. data/spec/fixtures/repos/hooks/deploy/before_compile_assets.rb +0 -1
  145. data/spec/fixtures/repos/hooks/deploy/before_deploy.rb +0 -1
  146. data/spec/fixtures/repos/hooks/deploy/before_migrate.rb +0 -1
  147. data/spec/fixtures/repos/hooks/deploy/before_restart.rb +0 -1
  148. data/spec/fixtures/repos/hooks/deploy/before_symlink.rb +0 -1
  149. data/spec/fixtures/repos/multi_dep_manager/README +0 -1
  150. data/spec/fixtures/repos/multi_dep_manager/composer.json +0 -5
  151. data/spec/fixtures/repos/multi_dep_manager/composer.lock +0 -462
  152. data/spec/fixtures/repos/multi_dep_manager/package.json +0 -7
  153. data/spec/fixtures/repos/multi_dep_manager/public/index.php +0 -4
  154. data/spec/fixtures/repos/no_ey_config/Gemfile +0 -3
  155. data/spec/fixtures/repos/no_ey_config/Gemfile.lock +0 -10
  156. data/spec/fixtures/repos/no_ey_config/README +0 -1
  157. data/spec/fixtures/repos/no_ey_config/ey.yml +0 -3
  158. data/spec/fixtures/repos/no_gemfile_lock/Gemfile +0 -4
  159. data/spec/fixtures/repos/no_gemfile_lock/README +0 -1
  160. data/spec/fixtures/repos/no_gemfile_lock/ey.yml +0 -3
  161. data/spec/fixtures/repos/nodejs/README +0 -1
  162. data/spec/fixtures/repos/nodejs/package.json +0 -7
  163. data/spec/fixtures/repos/not_bundled/README +0 -1
  164. data/spec/fixtures/repos/npm_disabled/README +0 -1
  165. data/spec/fixtures/repos/npm_disabled/config/ey.yml +0 -2
  166. data/spec/fixtures/repos/npm_disabled/package.json +0 -7
  167. data/spec/fixtures/repos/php_composer_disabled/README +0 -1
  168. data/spec/fixtures/repos/php_composer_disabled/composer.json +0 -5
  169. data/spec/fixtures/repos/php_composer_disabled/composer.lock +0 -462
  170. data/spec/fixtures/repos/php_composer_disabled/config/ey.yml +0 -2
  171. data/spec/fixtures/repos/php_composer_disabled/public/index.php +0 -4
  172. data/spec/fixtures/repos/php_composer_lock/README +0 -1
  173. data/spec/fixtures/repos/php_composer_lock/composer.json +0 -5
  174. data/spec/fixtures/repos/php_composer_lock/composer.lock +0 -462
  175. data/spec/fixtures/repos/php_composer_lock/public/index.php +0 -4
  176. data/spec/fixtures/repos/php_no_composer_lock/README +0 -1
  177. data/spec/fixtures/repos/php_no_composer_lock/composer.json +0 -21
  178. data/spec/fixtures/repos/php_no_composer_lock/public/index.php +0 -4
  179. data/spec/fixtures/repos/public_system/Gemfile +0 -4
  180. data/spec/fixtures/repos/public_system/Gemfile.lock +0 -12
  181. data/spec/fixtures/repos/public_system/README +0 -5
  182. data/spec/fixtures/repos/public_system/ey.yml +0 -3
  183. data/spec/fixtures/repos/public_system/public/system/cant_touch_this.txt +0 -3
  184. data/spec/fixtures/repos/sqlite3/Gemfile +0 -4
  185. data/spec/fixtures/repos/sqlite3/Gemfile.lock +0 -89
  186. data/spec/fixtures/repos/sqlite3/README +0 -1
  187. data/spec/fixtures/retwisj.war +0 -0
  188. data/spec/fixtures/valid_hook.rb +0 -1
  189. data/spec/git_strategy_spec.rb +0 -34
  190. data/spec/lockfile_parser_spec.rb +0 -122
  191. data/spec/maintenance_spec.rb +0 -44
  192. data/spec/multi_dependency_manager_spec.rb +0 -25
  193. data/spec/nodejs_deploy_spec.rb +0 -30
  194. data/spec/php_deploy_spec.rb +0 -81
  195. data/spec/platform_configure_spec.rb +0 -61
  196. data/spec/rails31_deploy_spec.rb +0 -164
  197. data/spec/restart_spec.rb +0 -43
  198. data/spec/rollback_spec.rb +0 -87
  199. data/spec/server_spec.rb +0 -70
  200. data/spec/services_deploy_spec.rb +0 -153
  201. data/spec/shell_spec.rb +0 -57
  202. data/spec/source/archive_spec.rb +0 -33
  203. data/spec/source/git_spec.rb +0 -44
  204. data/spec/spec_helper.rb +0 -355
  205. data/spec/sqlite3_deploy_spec.rb +0 -38
  206. data/spec/support/integration.rb +0 -103
  207. data/spec/support/source_doubles.rb +0 -28
  208. data/spec/support/timecop.rb +0 -5
  209. data/spec/symlink_spec.rb +0 -15
@@ -1,128 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe "the EY::Serverside::Deploy API" do
4
- it "calls tasks in the right order" do
5
- class TestDeploy < FullTestDeploy
6
- attr_reader :call_order
7
- def initialize(*a)
8
- super
9
- @call_order = []
10
- end
11
-
12
- def push_code() @call_order << 'push_code' ; super end
13
- def copy_repository_cache() @call_order << 'copy_repository_cache' ; super end
14
- def create_revision_file() @call_order << 'create_revision_file' ; super end
15
- def bundle() @call_order << 'bundle' ; super end
16
- def setup_services() @call_order << 'setup_services' ; super end
17
- def symlink_configs() @call_order << 'symlink_configs' ; super end
18
- def migrate() @call_order << 'migrate' ; super end
19
- def compile_assets() @call_order << 'compile_assets' ; super end
20
- def symlink() @call_order << 'symlink' ; super end
21
- def restart() @call_order << 'restart' ; super end
22
- def cleanup_old_releases() @call_order << 'cleanup_old_releases' ; super end
23
- def enable_maintenance_page() @call_order << 'enable_maintenance_page' ; super end
24
- def disable_maintenance_page() @call_order << 'disable_maintenance_page'; super end
25
- def gc_repository_cache() @call_order << 'gc_repository_cache' ; super end
26
- end
27
-
28
- config = EY::Serverside::Deploy::Configuration.new(default_configuration)
29
-
30
- td = TestDeploy.realnew(test_servers, config, test_shell)
31
- mock_bundler
32
- with_mocked_commands do
33
- capture do
34
- td.deploy
35
- end
36
- end
37
-
38
- ############################# IMPORTANT ####################################
39
- #
40
- # Call order is referenced in the engineyard gem eydeploy.rb documentation.
41
- #
42
- # https://support.cloud.engineyard.com/entries/20996661-customize-your-deployment
43
- #
44
- # Changing call order or removing methods may adversely affect customers
45
- # that are using eydeploy.rb and relying on this documentation.
46
- #
47
- ############################################################################
48
- expect(td.call_order).to eq(%w(
49
- push_code
50
- copy_repository_cache
51
- create_revision_file
52
- bundle
53
- setup_services
54
- symlink_configs
55
- compile_assets
56
- enable_maintenance_page
57
- migrate
58
- symlink
59
- restart
60
- disable_maintenance_page
61
- cleanup_old_releases
62
- gc_repository_cache))
63
- end
64
-
65
- describe "task overrides" do
66
- before(:each) do
67
- @tempdir = Pathname.new(`mktemp -d -t custom_deploy_spec.XXXXX`.strip)
68
- end
69
-
70
- def write_eydeploy(relative_path, contents = "def got_new_methods() 'from the file on disk' end")
71
- path = @tempdir.join(relative_path)
72
- path.dirname.mkpath
73
- path.open('w') { |f| f << contents }
74
- end
75
-
76
- describe "eydeploy_rb disabled" do
77
- before do
78
- @config = EY::Serverside::Deploy::Configuration.new('app' => 'app_name', 'repository_cache' => @tempdir.to_s, 'eydeploy_rb' => 'false')
79
- @deploy = FullTestDeploy.realnew(test_servers, @config, test_shell)
80
- end
81
-
82
- it "doesn't load eydeploy_rb file" do
83
- write_eydeploy 'eydeploy.rb'
84
- @deploy.require_custom_tasks
85
- expect(@deploy).not_to respond_to(:got_new_methods)
86
- end
87
- end
88
-
89
- describe "eydeploy_rb detect or enabled" do
90
- before do
91
- @config = EY::Serverside::Deploy::Configuration.new('app' => 'app_name', 'repository_cache' => @tempdir.to_s, 'eydeploy_rb' => 'true')
92
- @deploy = FullTestDeploy.realnew(test_servers, @config, test_shell)
93
- end
94
-
95
- it "requires 'eydeploy.rb' and adds any defined methods to the deploy" do
96
- write_eydeploy 'eydeploy.rb'
97
- @deploy.require_custom_tasks
98
- expect(@deploy.got_new_methods).to eq('from the file on disk')
99
- end
100
-
101
- it "falls back to 'config/eydeploy.rb'" do
102
- write_eydeploy 'config/eydeploy.rb'
103
- @deploy.require_custom_tasks
104
- expect(@deploy.got_new_methods).to eq('from the file on disk')
105
- end
106
-
107
- it "lets you super up from any defined methods" do
108
- write_eydeploy 'eydeploy.rb', "def value() super << ' + derived' end"
109
-
110
- class TestDeploySuper < FullTestDeploy
111
- def value() 'base' end
112
- end
113
-
114
- deploy = TestDeploySuper.realnew(test_servers, @config, test_shell)
115
- deploy.require_custom_tasks
116
- expect(deploy.value).to eq("base + derived")
117
- end
118
-
119
- it "records exceptions raised from the instance eval in the log" do
120
- write_eydeploy 'eydeploy.rb', "raise 'Imma blow up'"
121
- expect { @deploy.require_custom_tasks }.to raise_error
122
- log = @log_path.read
123
- expect(log).to match(/Exception while loading .*eydeploy\.rb/)
124
- expect(log).to include('Imma blow up')
125
- end
126
- end
127
- end
128
- end
@@ -1,362 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe "deploy hooks" do
4
- context "successful deploy with all hooks" do
5
- before(:all) do
6
- deploy_test_application('hooks')
7
- end
8
-
9
- it "runs all the hooks" do
10
- expect(deploy_dir.join('current', 'before_deploy.ran' )).to exist
11
- expect(deploy_dir.join('current', 'before_bundle.ran' )).to exist
12
- expect(deploy_dir.join('current', 'after_bundle.ran' )).to exist
13
- expect(deploy_dir.join('current', 'before_migrate.ran')).to exist
14
- expect(deploy_dir.join('current', 'after_migrate.ran' )).to exist
15
- expect(deploy_dir.join('current', 'before_compile_assets.ran')).to exist
16
- expect(deploy_dir.join('current', 'after_compile_assets.ran' )).to exist
17
- expect(deploy_dir.join('current', 'before_symlink.ran')).to exist
18
- expect(deploy_dir.join('current', 'after_symlink.ran' )).to exist
19
- expect(deploy_dir.join('current', 'before_restart.ran')).to exist
20
- expect(deploy_dir.join('current', 'after_restart.ran' )).to exist
21
- expect(deploy_dir.join('current', 'after_deploy.ran' )).to exist
22
- end
23
- end
24
-
25
- context "with failing deploy hook" do
26
- before(:all) do
27
- begin
28
- deploy_test_application('hook_fails', :verbose => false)
29
- rescue EY::Serverside::RemoteFailure
30
- end
31
- end
32
-
33
- it "prints the failure to the log even when non-verbose" do
34
- out = read_output
35
- expect(out).to match(%r|FATAL: Exception raised in deploy hook .*/deploy/before_deploy.rb.|)
36
- expect(out).to match(%r|RuntimeError:.*Hook failing in \(eval\)|)
37
- expect(out).to match(%r|Please fix this error before retrying.|)
38
- end
39
-
40
- it "retains the failed release" do
41
- release_name = @config.paths.active_release.basename
42
- expect(deploy_dir.join('releases_failed', release_name)).to be_directory
43
- end
44
- end
45
-
46
- context "with an executable for a deploy hook" do
47
- before(:all) do
48
- deploy_test_application('executable_hooks')
49
- end
50
-
51
- it 'runs the hook' do
52
- expect(deploy_dir.join('current', 'before_restart.ran')).to exist
53
- end
54
- end
55
-
56
- context "with a non-executable, but correctly named deploy hook" do
57
- before(:all) do
58
- deploy_test_application('executable_hooks_not_executable')
59
- end
60
-
61
- it 'does not run the hook' do
62
- expect(deploy_dir.join('current', 'before_restart.ran')).not_to exist
63
- end
64
-
65
- it 'outputs a message about the hook not being executable' do
66
- expect(read_output).to match(%r|Skipping.*deploy hook.*not executable|)
67
- end
68
- end
69
-
70
- context "deploy hook API" do
71
- def deploy_hook(options={})
72
- config = EY::Serverside::Deploy::Configuration.new({
73
- 'app' => 'app_name',
74
- 'framework_env' => 'staging',
75
- 'current_roles' => ['solo'],
76
- 'deploy_to' => deploy_dir.to_s,
77
- }.merge(options))
78
- # setup to run hooks since a deploy hasn't happened
79
- config.paths.new_release!
80
- config.paths.active_release.mkpath
81
- EY::Serverside::DeployHook.new(config, test_shell, 'fake_test_hook')
82
- end
83
-
84
- context "#run" do
85
- it "is available" do
86
- expect(deploy_hook.eval_hook('respond_to?(:run)')).to be_truthy
87
- end
88
-
89
- it "runs commands like the shell does" do
90
- ENV['COUNT'] = 'Chocula'
91
- File.unlink("/tmp/deploy_hook_spec.the_count") rescue nil
92
-
93
- deploy_hook.eval_hook('run("echo $COUNT > /tmp/deploy_hook_spec.the_count")')
94
-
95
- expect(IO.read("/tmp/deploy_hook_spec.the_count").strip).to eq("Chocula")
96
- end
97
-
98
- it "returns true/false to indicate the command's success" do
99
- expect(deploy_hook.eval_hook('run("true")')).to be_truthy
100
- expect(deploy_hook.eval_hook('run("false")')).to be_falsey
101
- end
102
-
103
- it "raises when the bang method alternative is used" do
104
- expect {
105
- deploy_hook.eval_hook('run!("false")')
106
- }.to raise_error(RuntimeError)
107
- out = read_output
108
- expect(out).to match(%r|FATAL: Exception raised in deploy hook .*/deploy/fake_test_hook.rb.|)
109
- expect(out).to match(%r|RuntimeError: .*run!.*Command failed. false|)
110
- expect(out).to match(%r|Please fix this error before retrying.|)
111
- end
112
- end
113
-
114
- context "#sudo" do
115
- it "is available" do
116
- expect(deploy_hook.eval_hook('respond_to?(:sudo)')).to be_truthy
117
- end
118
-
119
- it "runs things with sudo" do
120
- hook = deploy_hook
121
- mock_sudo do
122
- hook.eval_hook('sudo("true") || raise("failed")')
123
- end
124
- end
125
-
126
- it "raises when the bang method alternative is used" do
127
- hook = deploy_hook
128
- mock_sudo do
129
- expect {
130
- hook.eval_hook('sudo!("false")')
131
- }.to raise_error(RuntimeError)
132
- end
133
- out = read_output
134
- expect(out).to match(%r|FATAL: Exception raised in deploy hook .*/deploy/fake_test_hook.rb.|)
135
- expect(out).to match(%r|RuntimeError: .*sudo!.*Command failed. false|)
136
- expect(out).to match(%r|Please fix this error before retrying.|)
137
- end
138
- end
139
-
140
- context "capistrano-ish methods" do
141
- it "has them" do
142
- expect(deploy_hook.eval_hook('respond_to?(:latest_release) ')).to be_truthy
143
- expect(deploy_hook.eval_hook('respond_to?(:previous_release) ')).to be_truthy
144
- expect(deploy_hook.eval_hook('respond_to?(:all_releases) ')).to be_truthy
145
- expect(deploy_hook.eval_hook('respond_to?(:current_path) ')).to be_truthy
146
- expect(deploy_hook.eval_hook('respond_to?(:shared_path) ')).to be_truthy
147
- expect(deploy_hook.eval_hook('respond_to?(:release_dir) ')).to be_truthy
148
- expect(deploy_hook.eval_hook('respond_to?(:failed_release_dir)')).to be_truthy
149
- expect(deploy_hook.eval_hook('respond_to?(:release_path) ')).to be_truthy
150
- end
151
-
152
- it "shows a deprecation warning that asks you to use config to access these variables" do
153
- expect(deploy_hook.eval_hook('shared_path.nil?')).to be_falsey
154
- out = read_output
155
- expect(out).to include("Use of `shared_path` (via method_missing) is deprecated in favor of `config.shared_path` for improved error messages and compatibility.")
156
- expect(out).to match(%r|in .*/deploy/fake_test_hook.rb|)
157
- end
158
- end
159
-
160
- context "access to command line options that should be handed through to the config" do
161
- before do
162
- @hook = deploy_hook({'app' => 'app', 'environment_name' => 'env', 'account_name' => 'acc'})
163
- end
164
-
165
- it "has account_name" do
166
- expect(@hook.eval_hook('account_name')).to eq('acc')
167
- end
168
-
169
- it "has environment_name" do
170
- expect(@hook.eval_hook('environment_name')).to eq('env')
171
- end
172
-
173
- it "has app_name" do
174
- expect(@hook.eval_hook('app_name')).to eq('app')
175
- end
176
- end
177
-
178
- context "node" do
179
- before(:each) do
180
- EY::Serverside.dna_json = MultiJson.dump({
181
- 'instance_role' => 'solo',
182
- 'applications' => {
183
- 'myapp' => {
184
- 'type' => 'rails',
185
- 'branch' => 'master',
186
- }
187
- }
188
- })
189
- end
190
-
191
- it "is deprecated through the @node ivar" do
192
- expect(deploy_hook.eval_hook('@node.nil?')).to be_falsey
193
- out = read_output
194
- expect(out).to match(%r|Use of `@node` in deploy hooks is deprecated.|)
195
- expect(out).to match(%r|Please use `config.node`, which provides access to the same object.|)
196
- expect(out).to match(%r|.*/deploy/fake_test_hook.rb|)
197
- end
198
-
199
- it "is available" do
200
- expect(deploy_hook.eval_hook('config.node.nil?')).to be_falsey
201
- end
202
-
203
- it "has indifferent access" do
204
- expect(deploy_hook.eval_hook('config.node[:instance_role] ')).to eq('solo')
205
- expect(deploy_hook.eval_hook('config.node["instance_role"]')).to eq('solo')
206
- end
207
-
208
- it "has deep indifferent access" do
209
- expect(deploy_hook.eval_hook('config.node["applications"]["myapp"]["type"]')).to eq('rails')
210
- expect(deploy_hook.eval_hook('config.node[:applications]["myapp"][:type] ')).to eq('rails')
211
- expect(deploy_hook.eval_hook('config.node[:applications][:myapp][:type] ')).to eq('rails')
212
- end
213
- end
214
-
215
- context "config" do
216
- it "is available" do
217
- expect(deploy_hook.eval_hook('config.nil?')).to be_falsey
218
- end
219
-
220
- it "is deprecated through the @configuration ivar" do
221
- expect(deploy_hook.eval_hook('@configuration.nil?')).to be_falsey
222
- out = read_output
223
- expect(out).to match(%r|Use of `@configuration` in deploy hooks is deprecated.|)
224
- expect(out).to match(%r|Please use `config`, which provides access to the same object.|)
225
- expect(out).to match(%r|.*/deploy/fake_test_hook.rb|)
226
- end
227
-
228
- it "has the configuration in it" do
229
- expect(deploy_hook('bert' => 'ernie').eval_hook('config.bert')).to eq('ernie')
230
- end
231
-
232
- it "can be accessed with method calls, with [:symbols], or ['strings']" do
233
- expect(deploy_hook('bert' => 'ernie').eval_hook('config.bert ')).to eq('ernie')
234
- expect(deploy_hook('bert' => 'ernie').eval_hook('config[:bert] ')).to eq('ernie')
235
- expect(deploy_hook('bert' => 'ernie').eval_hook('config["bert"]')).to eq('ernie')
236
- end
237
-
238
- [:repository_cache,
239
- :release_path,
240
- :branch,
241
- :shared_path,
242
- :deploy_to,
243
- :user,
244
- :revision,
245
- :environment].each do |attribute|
246
- it "has the #{attribute.inspect} attribute for compatibility with chef-deploy" do
247
- expect(deploy_hook.eval_hook("config.has_key?(#{attribute.inspect})")).to be_truthy
248
- end
249
- end
250
- end
251
-
252
- context "environment variables" do
253
- it "sets the framework env variables" do
254
- expect(deploy_hook('framework_env' => 'production').eval_hook("ENV['RAILS_ENV']")).to eq('production')
255
- expect(deploy_hook('framework_env' => 'production').eval_hook("ENV['RACK_ENV'] ")).to eq('production')
256
- expect(deploy_hook('framework_env' => 'production').eval_hook("ENV['MERB_ENV'] ")).to eq('production')
257
- expect(deploy_hook('framework_env' => 'production').eval_hook("ENV['NODE_ENV'] ")).to eq('production')
258
- end
259
- end
260
-
261
- context "has methods to run code only on certain instances" do
262
- def scenarios
263
- [
264
- ['solo' ],
265
- ['app_master' ],
266
- ['app' ],
267
- ['db_master' ],
268
- ['db_slave' ],
269
- ['multi_role,app'],
270
- ['multi,util' ],
271
- ['util', 'alpha' ],
272
- ['util', 'beta' ],
273
- ['util', 'gamma' ],
274
- ]
275
- end
276
-
277
- def where_code_runs_with(code)
278
- scenarios.select do |role, name|
279
- hook = deploy_hook('current_roles' => role.split(','), 'current_name' => name)
280
- hook.eval_hook("#{code} { 'ran' } == 'ran'")
281
- end.map do |scenario|
282
- scenario.compact.join("_")
283
- end.compact
284
- end
285
-
286
- it "#on_app_master runs on app masters and solos" do
287
- expect(where_code_runs_with("on_app_master")).to eq(%w(solo app_master))
288
- end
289
-
290
- it "#on_app_servers runs on app masters, app slaves, and solos" do
291
- expect(where_code_runs_with("on_app_servers")).to eq(%w(solo app_master app multi_role,app))
292
- end
293
-
294
- it "#on_app_servers_and_utilities does what it says on the tin" do
295
- expect(where_code_runs_with("on_app_servers_and_utilities")).to eq(
296
- %w(solo app_master app multi_role,app multi,util util_alpha util_beta util_gamma)
297
- )
298
- end
299
-
300
- it "#on_utilities() runs on all utility instances" do
301
- expect(where_code_runs_with("on_utilities")).to eq(
302
- %w(multi,util util_alpha util_beta util_gamma)
303
- )
304
- end
305
-
306
- it "#on_utilities('sometype') runs on only utilities of type 'sometype'" do
307
- expect(where_code_runs_with("on_utilities('alpha')")).to eq(%w(util_alpha))
308
- end
309
-
310
- it "#on_utilities('type1', 'type2') runs on utilities of both types" do
311
- expect(where_code_runs_with("on_utilities('alpha', 'beta')")).to eq(
312
- %w(util_alpha util_beta)
313
- )
314
- end
315
-
316
- it "#on_utilities can be invoked with (['a', 'b']) or ('a', 'b')" do
317
- expect(where_code_runs_with("on_utilities(%w[alpha beta])")).to eq(
318
- where_code_runs_with("on_utilities('alpha', 'beta')")
319
- )
320
- end
321
- end
322
-
323
- context "#syntax_error" do
324
- it "returns nil for hook files containing valid Ruby syntax" do
325
- hook_path = File.expand_path('../fixtures/valid_hook.rb', __FILE__)
326
- expect(deploy_hook.syntax_error(hook_path)).to be_nil
327
- end
328
-
329
- it "returns a brief problem description for hook files containing valid Ruby syntax" do
330
- hook_path = File.expand_path('../fixtures/invalid_hook.rb', __FILE__)
331
- error = Regexp.escape("spec/fixtures/invalid_hook.rb:1: syntax error, unexpected '^'")
332
- expect(deploy_hook.syntax_error(hook_path)).to match(/#{error}/)
333
- end
334
- end
335
-
336
- context "errors in hooks" do
337
- it "shows the error in a helpful way" do
338
- expect {
339
- deploy_hook.eval_hook('methedo_no_existo')
340
- }.to raise_error(NameError)
341
- out = read_output
342
- expect(out).to match(%r|FATAL: Exception raised in deploy hook .*/deploy/fake_test_hook.rb.|)
343
- expect(out).to match(%r|NameError: undefined local variable or method `methedo_no_existo' for|)
344
- expect(out).to match(%r|Please fix this error before retrying.|)
345
- end
346
- end
347
-
348
- context "is compatible with older deploy hook scripts" do
349
- it "#current_role returns the first role" do
350
- expect(deploy_hook('current_roles' => %w(a b)).eval_hook('current_role')).to eq('a')
351
- end
352
-
353
- it "has info, warning, debug, logged_system, and access to shell" do
354
- expect(deploy_hook.eval_hook('respond_to?(:info) ')).to be_truthy
355
- expect(deploy_hook.eval_hook('respond_to?(:warning) ')).to be_truthy
356
- expect(deploy_hook.eval_hook('respond_to?(:debug) ')).to be_truthy
357
- expect(deploy_hook.eval_hook('respond_to?(:logged_system)')).to be_truthy
358
- expect(deploy_hook.eval_hook('respond_to?(:shell) ')).to be_truthy
359
- end
360
- end
361
- end
362
- end