engineyard-serverside 2.7.0.pre → 2.7.8pre2

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 (252) hide show
  1. data/bin/engineyard-serverside +1 -1
  2. data/lib/engineyard-serverside/about.rb +8 -7
  3. data/lib/engineyard-serverside/cli.rb +225 -4
  4. data/lib/engineyard-serverside/cli_helpers.rb +53 -0
  5. data/lib/engineyard-serverside/configuration.rb +0 -1
  6. data/lib/engineyard-serverside/dependency_manager/bundler.rb +18 -46
  7. data/lib/engineyard-serverside/dependency_manager/npm.rb +1 -12
  8. data/lib/engineyard-serverside/deploy.rb +45 -7
  9. data/lib/engineyard-serverside/deploy_hook.rb +83 -20
  10. data/lib/engineyard-serverside/maintenance.rb +9 -1
  11. data/lib/engineyard-serverside/paths.rb +0 -11
  12. data/lib/engineyard-serverside/rails_assets.rb +1 -2
  13. data/lib/engineyard-serverside/version.rb +1 -1
  14. data/spec/archive_deploy_spec.rb +53 -0
  15. data/spec/basic_deploy_spec.rb +26 -0
  16. data/spec/bundler_deploy_spec.rb +139 -0
  17. data/spec/configuration_spec.rb +205 -0
  18. data/spec/custom_deploy_spec.rb +128 -0
  19. data/spec/deploy_hook_spec.rb +362 -0
  20. data/spec/deprecation_spec.rb +23 -0
  21. data/spec/ey_yml_customized_deploy_spec.rb +99 -0
  22. data/spec/fixtures/gitrepo.tar.gz +0 -0
  23. data/{lib/engineyard-serverside/callbacks/hooks.rb → spec/fixtures/gitrepo/bar} +0 -0
  24. data/spec/fixtures/gitrepo/foo +0 -0
  25. data/spec/fixtures/invalid_hook.rb +1 -0
  26. data/spec/fixtures/lockfiles/0.9-no-bundler +111 -0
  27. data/spec/fixtures/lockfiles/0.9-with-bundler +117 -0
  28. data/spec/fixtures/lockfiles/1.0-no-bundler +54 -0
  29. data/spec/fixtures/lockfiles/1.0.0.rc.1-with-bundler +162 -0
  30. data/spec/fixtures/lockfiles/1.0.18-do_mysql +88 -0
  31. data/spec/fixtures/lockfiles/1.0.18-do_postgres +79 -0
  32. data/spec/fixtures/lockfiles/1.0.18-mysql +43 -0
  33. data/spec/fixtures/lockfiles/1.0.18-mysql2 +43 -0
  34. data/spec/fixtures/lockfiles/1.0.18-pg +43 -0
  35. data/spec/fixtures/lockfiles/1.0.6-no-bundler +51 -0
  36. data/spec/fixtures/lockfiles/1.0.6-with-any-bundler +52 -0
  37. data/spec/fixtures/lockfiles/1.0.6-with-bundler +52 -0
  38. data/spec/fixtures/lockfiles/1.3.1-rails-3.2.13 +112 -0
  39. data/spec/fixtures/lockfiles/not-a-lockfile +1 -0
  40. data/spec/fixtures/repos/assets_detected/Gemfile +5 -0
  41. data/spec/fixtures/repos/assets_detected/Gemfile.lock +88 -0
  42. data/spec/fixtures/repos/assets_detected/README +1 -0
  43. data/spec/fixtures/repos/assets_detected/Rakefile +5 -0
  44. data/spec/fixtures/repos/assets_detected/app/assets/empty +0 -0
  45. data/spec/fixtures/repos/assets_detected/config/application.rb +5 -0
  46. data/spec/fixtures/repos/assets_detected/config/ey.yml +3 -0
  47. data/spec/fixtures/repos/assets_disabled/Gemfile +5 -0
  48. data/spec/fixtures/repos/assets_disabled/Gemfile.lock +88 -0
  49. data/spec/fixtures/repos/assets_disabled/README +1 -0
  50. data/spec/fixtures/repos/assets_disabled/Rakefile +6 -0
  51. data/spec/fixtures/repos/assets_disabled/app/assets/empty +0 -0
  52. data/spec/fixtures/repos/assets_disabled/config/application.rb +5 -0
  53. data/spec/fixtures/repos/assets_disabled/config/ey.yml +3 -0
  54. data/spec/fixtures/repos/assets_disabled_in_ey_yml/Gemfile +5 -0
  55. data/spec/fixtures/repos/assets_disabled_in_ey_yml/Gemfile.lock +88 -0
  56. data/spec/fixtures/repos/assets_disabled_in_ey_yml/README +1 -0
  57. data/spec/fixtures/repos/assets_disabled_in_ey_yml/Rakefile +6 -0
  58. data/spec/fixtures/repos/assets_disabled_in_ey_yml/app/assets/empty +0 -0
  59. data/spec/fixtures/repos/assets_disabled_in_ey_yml/config/application.rb +5 -0
  60. data/spec/fixtures/repos/assets_disabled_in_ey_yml/config/ey.yml +5 -0
  61. data/spec/fixtures/repos/assets_disabled_utf8/Gemfile +5 -0
  62. data/spec/fixtures/repos/assets_disabled_utf8/Gemfile.lock +88 -0
  63. data/spec/fixtures/repos/assets_disabled_utf8/README +3 -0
  64. data/spec/fixtures/repos/assets_disabled_utf8/Rakefile +5 -0
  65. data/spec/fixtures/repos/assets_disabled_utf8/app/assets/empty +0 -0
  66. data/spec/fixtures/repos/assets_disabled_utf8/config/application.rb +7 -0
  67. data/spec/fixtures/repos/assets_disabled_utf8/config/ey.yml +3 -0
  68. data/spec/fixtures/repos/assets_enabled_all/Gemfile +5 -0
  69. data/spec/fixtures/repos/assets_enabled_all/Gemfile.lock +88 -0
  70. data/spec/fixtures/repos/assets_enabled_all/README +1 -0
  71. data/spec/fixtures/repos/assets_enabled_all/app/assets/empty +0 -0
  72. data/spec/fixtures/repos/assets_enabled_all/config/application.rb +5 -0
  73. data/spec/fixtures/repos/assets_enabled_all/config/ey.yml +6 -0
  74. data/spec/fixtures/repos/assets_enabled_all/script/assets +5 -0
  75. data/spec/fixtures/repos/assets_enabled_all/tmp/obstruction +1 -0
  76. data/spec/fixtures/repos/assets_enabled_in_ey_yml/Gemfile +3 -0
  77. data/spec/fixtures/repos/assets_enabled_in_ey_yml/Gemfile.lock +10 -0
  78. data/spec/fixtures/repos/assets_enabled_in_ey_yml/README +1 -0
  79. data/spec/fixtures/repos/assets_enabled_in_ey_yml/Rakefile +8 -0
  80. data/spec/fixtures/repos/assets_enabled_in_ey_yml/config/ey.yml +4 -0
  81. data/spec/fixtures/repos/assets_enabled_util_only/Gemfile +5 -0
  82. data/spec/fixtures/repos/assets_enabled_util_only/Gemfile.lock +88 -0
  83. data/spec/fixtures/repos/assets_enabled_util_only/README +1 -0
  84. data/spec/fixtures/repos/assets_enabled_util_only/Rakefile +6 -0
  85. data/spec/fixtures/repos/assets_enabled_util_only/app/assets/empty +0 -0
  86. data/spec/fixtures/repos/assets_enabled_util_only/config/application.rb +5 -0
  87. data/spec/fixtures/repos/assets_enabled_util_only/config/ey.yml +6 -0
  88. data/spec/fixtures/repos/assets_in_hook/Gemfile +5 -0
  89. data/spec/fixtures/repos/assets_in_hook/Gemfile.lock +88 -0
  90. data/spec/fixtures/repos/assets_in_hook/README +2 -0
  91. data/spec/fixtures/repos/assets_in_hook/Rakefile +5 -0
  92. data/spec/fixtures/repos/assets_in_hook/app/assets/empty +0 -0
  93. data/spec/fixtures/repos/assets_in_hook/config/application.rb +5 -0
  94. data/spec/fixtures/repos/assets_in_hook/config/ey.yml +3 -0
  95. data/spec/fixtures/repos/assets_in_hook/deploy/before_compile_assets.rb +2 -0
  96. data/spec/fixtures/repos/bundle_fails/Gemfile +1 -0
  97. data/spec/fixtures/repos/bundle_fails/README +1 -0
  98. data/spec/fixtures/repos/bundle_fails/deploy/after_bundle.rb +1 -0
  99. data/spec/fixtures/repos/bundler_disabled/Gemfile +4 -0
  100. data/spec/fixtures/repos/bundler_disabled/Gemfile.lock +12 -0
  101. data/spec/fixtures/repos/bundler_disabled/README +1 -0
  102. data/spec/fixtures/repos/bundler_disabled/config/ey.yml +2 -0
  103. data/spec/fixtures/repos/bundler_disabled/deploy/after_bundle.rb +1 -0
  104. data/spec/fixtures/repos/bundler_disabled/deploy/before_bundle.rb +1 -0
  105. data/spec/fixtures/repos/default/Gemfile +4 -0
  106. data/spec/fixtures/repos/default/Gemfile.lock +12 -0
  107. data/spec/fixtures/repos/default/README +5 -0
  108. data/spec/fixtures/repos/default/ey.yml +3 -0
  109. data/spec/fixtures/repos/executable_hooks/README +1 -0
  110. data/spec/fixtures/repos/executable_hooks/deploy/before_restart +72 -0
  111. data/spec/fixtures/repos/executable_hooks_not_executable/README +3 -0
  112. data/spec/fixtures/repos/executable_hooks_not_executable/deploy/before_restart +3 -0
  113. data/spec/fixtures/repos/ey_yml/Gemfile +4 -0
  114. data/spec/fixtures/repos/ey_yml/Gemfile.lock +12 -0
  115. data/spec/fixtures/repos/ey_yml/README +1 -0
  116. data/spec/fixtures/repos/ey_yml/config/ey.yml +18 -0
  117. data/spec/fixtures/repos/ey_yml/deploy/before_migrate.rb +6 -0
  118. data/spec/fixtures/repos/ey_yml_alt/Gemfile +4 -0
  119. data/spec/fixtures/repos/ey_yml_alt/Gemfile.lock +12 -0
  120. data/spec/fixtures/repos/ey_yml_alt/README +1 -0
  121. data/spec/fixtures/repos/ey_yml_alt/deploy/before_migrate.rb +6 -0
  122. data/spec/fixtures/repos/ey_yml_alt/ey.yml +12 -0
  123. data/spec/fixtures/repos/hook_fails/README +1 -0
  124. data/spec/fixtures/repos/hook_fails/deploy/before_deploy.rb +1 -0
  125. data/spec/fixtures/repos/hooks/README +1 -0
  126. data/spec/fixtures/repos/hooks/deploy/after_bundle.rb +1 -0
  127. data/spec/fixtures/repos/hooks/deploy/after_compile_assets.rb +1 -0
  128. data/spec/fixtures/repos/hooks/deploy/after_deploy.rb +1 -0
  129. data/spec/fixtures/repos/hooks/deploy/after_migrate.rb +1 -0
  130. data/spec/fixtures/repos/hooks/deploy/after_restart.rb +1 -0
  131. data/spec/fixtures/repos/hooks/deploy/after_symlink.rb +1 -0
  132. data/spec/fixtures/repos/hooks/deploy/before_bundle.rb +1 -0
  133. data/spec/fixtures/repos/hooks/deploy/before_compile_assets.rb +1 -0
  134. data/spec/fixtures/repos/hooks/deploy/before_deploy.rb +1 -0
  135. data/spec/fixtures/repos/hooks/deploy/before_migrate.rb +1 -0
  136. data/spec/fixtures/repos/hooks/deploy/before_restart.rb +1 -0
  137. data/spec/fixtures/repos/hooks/deploy/before_symlink.rb +1 -0
  138. data/spec/fixtures/repos/multi_dep_manager/README +1 -0
  139. data/spec/fixtures/repos/multi_dep_manager/composer.json +5 -0
  140. data/spec/fixtures/repos/multi_dep_manager/composer.lock +462 -0
  141. data/spec/fixtures/repos/multi_dep_manager/package.json +7 -0
  142. data/spec/fixtures/repos/multi_dep_manager/public/index.php +4 -0
  143. data/spec/fixtures/repos/no_ey_config/Gemfile +3 -0
  144. data/spec/fixtures/repos/no_ey_config/Gemfile.lock +10 -0
  145. data/spec/fixtures/repos/no_ey_config/README +1 -0
  146. data/spec/fixtures/repos/no_ey_config/ey.yml +3 -0
  147. data/spec/fixtures/repos/no_gemfile_lock/Gemfile +4 -0
  148. data/spec/fixtures/repos/no_gemfile_lock/README +1 -0
  149. data/spec/fixtures/repos/no_gemfile_lock/ey.yml +3 -0
  150. data/spec/fixtures/repos/nodejs/README +1 -0
  151. data/spec/fixtures/repos/nodejs/package.json +7 -0
  152. data/spec/fixtures/repos/not_bundled/README +1 -0
  153. data/spec/fixtures/repos/npm_disabled/README +1 -0
  154. data/spec/fixtures/repos/npm_disabled/config/ey.yml +2 -0
  155. data/spec/fixtures/repos/npm_disabled/package.json +7 -0
  156. data/spec/fixtures/repos/php_composer_disabled/README +1 -0
  157. data/spec/fixtures/repos/php_composer_disabled/composer.json +5 -0
  158. data/spec/fixtures/repos/php_composer_disabled/composer.lock +462 -0
  159. data/spec/fixtures/repos/php_composer_disabled/config/ey.yml +2 -0
  160. data/spec/fixtures/repos/php_composer_disabled/public/index.php +4 -0
  161. data/spec/fixtures/repos/php_composer_lock/README +1 -0
  162. data/spec/fixtures/repos/php_composer_lock/composer.json +5 -0
  163. data/spec/fixtures/repos/php_composer_lock/composer.lock +462 -0
  164. data/spec/fixtures/repos/php_composer_lock/public/index.php +4 -0
  165. data/spec/fixtures/repos/php_no_composer_lock/README +1 -0
  166. data/spec/fixtures/repos/php_no_composer_lock/composer.json +21 -0
  167. data/spec/fixtures/repos/php_no_composer_lock/public/index.php +4 -0
  168. data/spec/fixtures/repos/public_system/Gemfile +4 -0
  169. data/spec/fixtures/repos/public_system/Gemfile.lock +12 -0
  170. data/spec/fixtures/repos/public_system/README +5 -0
  171. data/spec/fixtures/repos/public_system/ey.yml +3 -0
  172. data/spec/fixtures/repos/public_system/public/system/cant_touch_this.txt +3 -0
  173. data/spec/fixtures/repos/sqlite3/Gemfile +4 -0
  174. data/spec/fixtures/repos/sqlite3/Gemfile.lock +89 -0
  175. data/spec/fixtures/repos/sqlite3/README +1 -0
  176. data/spec/fixtures/retwisj.war +0 -0
  177. data/spec/fixtures/valid_hook.rb +1 -0
  178. data/spec/git_strategy_spec.rb +34 -0
  179. data/spec/lockfile_parser_spec.rb +122 -0
  180. data/spec/maintenance_spec.rb +44 -0
  181. data/spec/multi_dependency_manager_spec.rb +25 -0
  182. data/spec/nodejs_deploy_spec.rb +30 -0
  183. data/spec/php_deploy_spec.rb +81 -0
  184. data/spec/platform_configure_spec.rb +61 -0
  185. data/spec/rails31_deploy_spec.rb +164 -0
  186. data/spec/restart_spec.rb +43 -0
  187. data/spec/rollback_spec.rb +87 -0
  188. data/spec/server_spec.rb +70 -0
  189. data/spec/services_deploy_spec.rb +153 -0
  190. data/spec/shell_spec.rb +57 -0
  191. data/spec/source/archive_spec.rb +33 -0
  192. data/spec/source/git_spec.rb +44 -0
  193. data/spec/spec_helper.rb +355 -0
  194. data/spec/sqlite3_deploy_spec.rb +38 -0
  195. data/spec/support/integration.rb +103 -0
  196. data/spec/support/source_doubles.rb +28 -0
  197. data/spec/support/timecop.rb +5 -0
  198. data/spec/symlink_spec.rb +15 -0
  199. metadata +522 -184
  200. data/lib/engineyard-serverside/callbacks.rb +0 -11
  201. data/lib/engineyard-serverside/callbacks/collection.rb +0 -17
  202. data/lib/engineyard-serverside/callbacks/collection/base.rb +0 -94
  203. data/lib/engineyard-serverside/callbacks/collection/combined.rb +0 -45
  204. data/lib/engineyard-serverside/callbacks/collection/deploy_hooks.rb +0 -21
  205. data/lib/engineyard-serverside/callbacks/collection/service_hooks.rb +0 -17
  206. data/lib/engineyard-serverside/callbacks/collection/service_hooks/collection.rb +0 -24
  207. data/lib/engineyard-serverside/callbacks/collection/service_hooks/combined.rb +0 -40
  208. data/lib/engineyard-serverside/callbacks/distributor.rb +0 -23
  209. data/lib/engineyard-serverside/callbacks/distributor/base.rb +0 -38
  210. data/lib/engineyard-serverside/callbacks/distributor/executable.rb +0 -19
  211. data/lib/engineyard-serverside/callbacks/distributor/executable/runnable.rb +0 -41
  212. data/lib/engineyard-serverside/callbacks/distributor/executable/unrunnable.rb +0 -19
  213. data/lib/engineyard-serverside/callbacks/distributor/ruby.rb +0 -59
  214. data/lib/engineyard-serverside/callbacks/distributor/ruby/distributor.rb +0 -57
  215. data/lib/engineyard-serverside/callbacks/hooks/app.rb +0 -17
  216. data/lib/engineyard-serverside/callbacks/hooks/base.rb +0 -39
  217. data/lib/engineyard-serverside/callbacks/hooks/service.rb +0 -24
  218. data/lib/engineyard-serverside/callbacks/service_hook.rb +0 -20
  219. data/lib/engineyard-serverside/cli/app.rb +0 -136
  220. data/lib/engineyard-serverside/cli/helpers.rb +0 -58
  221. data/lib/engineyard-serverside/cli/server_hash_extractor.rb +0 -49
  222. data/lib/engineyard-serverside/cli/workflows.rb +0 -45
  223. data/lib/engineyard-serverside/cli/workflows/base.rb +0 -78
  224. data/lib/engineyard-serverside/cli/workflows/calling_deploy_hooks.rb +0 -31
  225. data/lib/engineyard-serverside/cli/workflows/deploying_applications.rb +0 -28
  226. data/lib/engineyard-serverside/cli/workflows/disabling_maintenance.rb +0 -29
  227. data/lib/engineyard-serverside/cli/workflows/enabling_maintenance.rb +0 -29
  228. data/lib/engineyard-serverside/cli/workflows/errors.rb +0 -13
  229. data/lib/engineyard-serverside/cli/workflows/helpers.rb +0 -21
  230. data/lib/engineyard-serverside/cli/workflows/integrating_servers.rb +0 -71
  231. data/lib/engineyard-serverside/cli/workflows/restarting_applications.rb +0 -36
  232. data/lib/engineyard-serverside/cli/workflows/rolling_back_applications.rb +0 -28
  233. data/lib/engineyard-serverside/cli/workflows/showing_maintenance_status.rb +0 -28
  234. data/lib/engineyard-serverside/deploy_hook/callback_context.rb +0 -77
  235. data/lib/engineyard-serverside/propagator.rb +0 -59
  236. data/lib/engineyard-serverside/slug.rb +0 -7
  237. data/lib/engineyard-serverside/slug/distributor.rb +0 -58
  238. data/lib/engineyard-serverside/slug/enabler.rb +0 -100
  239. data/lib/engineyard-serverside/slug/failure_handler.rb +0 -24
  240. data/lib/engineyard-serverside/slug/finalizer.rb +0 -86
  241. data/lib/engineyard-serverside/slug/generator.rb +0 -29
  242. data/lib/engineyard-serverside/slug/migrator.rb +0 -41
  243. data/lib/engineyard-serverside/slug/restarter.rb +0 -103
  244. data/lib/engineyard-serverside/slug/source.rb +0 -16
  245. data/lib/engineyard-serverside/slug/source/updater.rb +0 -194
  246. data/lib/railway.rb +0 -43
  247. data/lib/result.rb +0 -7
  248. data/lib/result/base.rb +0 -41
  249. data/lib/result/dsl.rb +0 -16
  250. data/lib/result/failure.rb +0 -29
  251. data/lib/result/success.rb +0 -24
  252. data/lib/runner.rb +0 -34
@@ -10,18 +10,7 @@ module EY
10
10
 
11
11
  def install
12
12
  shell.status "Installing npm packages (package.json detected)"
13
- run "mkdir -p #{paths.shared_node_modules} && ln -nfs #{paths.shared_node_modules} #{paths.active_node_modules}"
14
- run %{cd #{paths.active_release} && export GIT_SSH="#{ENV['GIT_SSH']}" && npm install #{npm_install_options.join(" ")}}
15
- end
16
-
17
- def npm_install_options
18
- options = []
19
- options += ['--production'] if npm_production?
20
- options
21
- end
22
-
23
- def npm_production?
24
- ENV['NODE_ENV'] == 'production'
13
+ run %{cd #{paths.active_release} && export GIT_SSH="#{ENV['GIT_SSH']}" && npm install}
25
14
  end
26
15
  end
27
16
  end
@@ -5,7 +5,6 @@ require 'engineyard-serverside/rails_assets'
5
5
  require 'engineyard-serverside/maintenance'
6
6
  require 'engineyard-serverside/dependency_manager'
7
7
  require 'engineyard-serverside/dependency_manager/legacy_helpers'
8
- require 'engineyard-serverside/callbacks'
9
8
 
10
9
  module EY
11
10
  module Serverside
@@ -451,9 +450,27 @@ defaults:
451
450
  end
452
451
 
453
452
  def callback(what)
454
- load_callbacks
455
453
  @callbacks_reached ||= true
456
- @callbacks_collection.distribute(self, what)
454
+
455
+ if paths.deploy_hook(what).exist?
456
+ shell.status "Running deploy hook: deploy/#{what}.rb"
457
+ run Escape.shell_command(base_callback_command_for(what)) do |server, cmd|
458
+ per_instance_args = []
459
+ per_instance_args << '--current-roles' << server.roles.to_a.join(' ')
460
+ per_instance_args << '--current-name' << server.name.to_s if server.name
461
+ per_instance_args << '--config' << config.to_json
462
+ cmd << " " << Escape.shell_command(per_instance_args)
463
+ end
464
+ elsif paths.executable_deploy_hook(what).executable?
465
+ shell.status "Running deploy hook: deploy/#{what}"
466
+ run [About.hook_executor, what.to_s].join(' ') do |server, cmd|
467
+ cmd = hook_env_vars(server).reject{|k,v| v.nil?}.map{|k,v|
468
+ "#{k}=#{Escape.shell_command([v])}"
469
+ }.join(' ') + ' ' + config.framework_envs + ' ' + cmd
470
+ end
471
+ elsif paths.executable_deploy_hook(what).exist?
472
+ shell.warning "Skipping possible deploy hook deploy/#{what} because it is not executable."
473
+ end
457
474
  end
458
475
 
459
476
  def source
@@ -463,6 +480,31 @@ defaults:
463
480
 
464
481
  protected
465
482
 
483
+ def base_callback_command_for(what)
484
+ cmd = [About.binary, 'hook', what.to_s]
485
+ cmd << '--app' << config.app
486
+ cmd << '--environment-name' << config.environment_name
487
+ cmd << '--account-name' << config.account_name
488
+ cmd << '--release-path' << paths.active_release.to_s
489
+ cmd << '--framework-env' << config.framework_env.to_s
490
+ cmd << '--verbose' if config.verbose
491
+ cmd
492
+ end
493
+
494
+ def hook_env_vars(server)
495
+ {
496
+ 'EY_DEPLOY_ACCOUNT_NAME' => config.account_name,
497
+ 'EY_DEPLOY_APP' => config.app,
498
+ 'EY_DEPLOY_CONFIG' => config.to_json,
499
+ 'EY_DEPLOY_CURRENT_ROLES' => server.roles.to_a.join(' '),
500
+ 'EY_DEPLOY_CURRENT_NAME' => server.name ? server.name.to_s : nil,
501
+ 'EY_DEPLOY_ENVIRONMENT_NAME' => config.environment_name,
502
+ 'EY_DEPLOY_FRAMEWORK_ENV' => config.framework_env.to_s,
503
+ 'EY_DEPLOY_RELEASE_PATH' => paths.active_release.to_s,
504
+ 'EY_DEPLOY_VERBOSE' => (config.verbose ? '1' : '0'),
505
+ }
506
+ end
507
+
466
508
  # FIXME: Legacy method, warn and remove.
467
509
  def serverside_bin
468
510
  About.binary
@@ -512,10 +554,6 @@ defaults:
512
554
  def compile_assets
513
555
  RailsAssets.detect_and_compile(config, shell, self)
514
556
  end
515
-
516
- def load_callbacks
517
- @callbacks_collection ||= Callbacks.load(paths)
518
- end
519
557
  end # DeployBase
520
558
 
521
559
  class Deploy < DeployBase
@@ -1,6 +1,4 @@
1
1
  require 'engineyard-serverside/shell/helpers'
2
- require 'engineyard-serverside/deploy_hook/callback_context'
3
- require 'engineyard-serverside/callbacks'
4
2
  require 'rbconfig'
5
3
 
6
4
  module EY
@@ -12,32 +10,36 @@ module EY
12
10
  @config, @shell, @hook_name = config, shell, hook_name
13
11
  end
14
12
 
13
+ def hook_path
14
+ config.paths.deploy_hook(hook_name)
15
+ end
16
+
17
+ def callback_context
18
+ @context ||= CallbackContext.new(config, shell, hook_path)
19
+ end
20
+
15
21
  def call
16
- hooks.each do |hook|
22
+ if hook_path.exist?
17
23
  Dir.chdir(config.paths.active_release.to_s) do
18
- if desc = syntax_error(hook.path)
19
- hook_name = hook.path.basename
24
+ if desc = syntax_error(hook_path)
25
+ hook_name = hook_path.basename
20
26
  abort "*** [Error] Invalid Ruby syntax in hook: #{hook_name} ***\n*** #{desc.chomp} ***"
21
27
  else
22
- eval_hook(hook.read, hook.path)
28
+ eval_hook(hook_path.read)
23
29
  end
24
30
  end
25
31
  end
26
32
  end
27
33
 
28
- def eval_hook(code, hook_path = nil)
29
- hook_path ||= config.paths.deploy_hook(hook_name)
30
- shell.info "Executing #{hook_path} ..."
31
- display_deprecation_warnings(code, hook_path)
32
- CallbackContext.
33
- new(config, shell, hook_path).
34
- instance_eval(code)
34
+ def eval_hook(code)
35
+ display_deprecation_warnings(code)
36
+ callback_context.instance_eval(code)
35
37
  rescue Exception => exception
36
38
  display_hook_error(exception, code, hook_path)
37
39
  raise exception
38
40
  end
39
41
 
40
- def display_deprecation_warnings(code, hook_path)
42
+ def display_deprecation_warnings(code)
41
43
  if code =~ /@configuration/
42
44
  shell.warning("Use of `@configuration` in deploy hooks is deprecated.\nPlease use `config`, which provides access to the same object.\n\tin #{hook_path}")
43
45
  end
@@ -66,12 +68,73 @@ Please fix this error before retrying.
66
68
  output unless output =~ /Syntax OK/
67
69
  end
68
70
 
69
- private
70
- def hooks
71
- @hooks ||= Callbacks.
72
- load(config.paths).
73
- matching(hook_name.to_s).
74
- select {|hook| hook.flavor == :ruby}
71
+ class CallbackContext
72
+ include EY::Serverside::Shell::Helpers
73
+
74
+ attr_reader :shell, :hook_path
75
+
76
+ def initialize(config, shell, hook_path)
77
+ @configuration = config
78
+ @configuration.set_framework_envs
79
+ @shell = shell
80
+ @node = config.node
81
+ @hook_path = hook_path
82
+ end
83
+
84
+ def config
85
+ @configuration
86
+ end
87
+
88
+ def inspect
89
+ "#<DeployHook::CallbackContext #{hook_path.inspect}>"
90
+ end
91
+
92
+ def method_missing(meth, *args, &blk)
93
+ if @configuration.respond_to?(meth)
94
+ shell.warning "Use of `#{meth}` (via method_missing) is deprecated in favor of `config.#{meth}` for improved error messages and compatibility.\n\tin #{hook_path}"
95
+ @configuration.send(meth, *args, &blk)
96
+ else
97
+ super
98
+ end
99
+ end
100
+
101
+ def respond_to?(*a)
102
+ @configuration.respond_to?(*a) || super
103
+ end
104
+
105
+ def run(cmd)
106
+ shell.logged_system(Escape.shell_command(["sh", "-l", "-c", cmd])).success?
107
+ end
108
+
109
+ def run!(cmd)
110
+ run(cmd) or raise("run!: Command failed. #{cmd}")
111
+ end
112
+
113
+ def sudo(cmd)
114
+ shell.logged_system(Escape.shell_command(["sudo", "sh", "-l", "-c", cmd])).success?
115
+ end
116
+
117
+ def sudo!(cmd)
118
+ sudo(cmd) or raise("sudo!: Command failed. #{cmd}")
119
+ end
120
+
121
+ # convenience functions for running on certain instance types
122
+ def on_app_master(&blk) on_roles(%w[solo app_master], &blk) end
123
+ def on_app_servers(&blk) on_roles(%w[solo app_master app], &blk) end
124
+ def on_app_servers_and_utilities(&blk) on_roles(%w[solo app_master app util], &blk) end
125
+
126
+ def on_utilities(*names, &blk)
127
+ names.flatten!
128
+ on_roles(%w[util]) do
129
+ blk.call if names.empty? || names.include?(config.current_name)
130
+ end
131
+ end
132
+
133
+ private
134
+ def on_roles(desired_roles)
135
+ yield if desired_roles.any? { |role| config.current_roles.include?(role) }
136
+ end
137
+
75
138
  end
76
139
 
77
140
  end
@@ -70,7 +70,15 @@ module EY
70
70
  run "mkdir -p #{maintenance_page_dirname}"
71
71
  public_system_symlink_warning
72
72
  @up = true
73
- run "cp #{source_path} #{enabled_maintenance_page_pathname}"
73
+ maintenance_page_html = File.read(source_path)
74
+ if source_path == EY::Serverside::Paths::DEFAULT_MAINTENANCE_PAGE
75
+ #run fans out to all app servers but the serverside version is only isntalled on the server being used to deploy
76
+ #so if the serveside version being used isn't installed on a given app server the cp command would fail, but this echo will still work
77
+ run "echo '#{maintenance_page_html}' > #{enabled_maintenance_page_pathname}"
78
+ else
79
+ #since other possible paths are in your app, cp should work
80
+ run "cp #{source_path} #{enabled_maintenance_page_pathname}"
81
+ end
74
82
  end
75
83
 
76
84
  def disable
@@ -68,8 +68,6 @@ module EY
68
68
  def_path :shared_log, [:shared, 'log']
69
69
  def_path :shared_tmp, [:shared, 'tmp']
70
70
  def_path :shared_config, [:shared, 'config']
71
- def_path :shared_hooks, [:shared, 'hooks']
72
- def_path :shared_node_modules, [:shared, 'node_modules']
73
71
  def_path :shared_system, [:shared, 'system']
74
72
  def_path :default_repository_cache, [:shared, 'cached-copy']
75
73
  def_path :enabled_maintenance_page, [:shared_system, 'maintenance.html']
@@ -92,7 +90,6 @@ module EY
92
90
  def_path :composer_lock, [:active_release, 'composer.lock']
93
91
  def_path :active_release_config, [:active_release, 'config']
94
92
  def_path :active_log, [:active_release, 'log']
95
- def_path :active_node_modules, [:active_release, 'node_modules']
96
93
  def_path :active_tmp, [:active_release, 'tmp']
97
94
 
98
95
  def initialize(opts)
@@ -131,18 +128,10 @@ module EY
131
128
  path(:deploy_hooks, "#{hook_name}.rb")
132
129
  end
133
130
 
134
- def service_hook(service_name, hook_name)
135
- path(:shared_hooks, service_name, "#{hook_name}.rb")
136
- end
137
-
138
131
  def executable_deploy_hook(hook_name)
139
132
  path(:deploy_hooks, "#{hook_name}")
140
133
  end
141
134
 
142
- def executable_service_hook(service_name, hook_name)
143
- path(:shared_hooks, service_name, "#{hook_name}")
144
- end
145
-
146
135
  def repository_cache
147
136
  @repository_cache ||= default_repository_cache
148
137
  end
@@ -58,8 +58,7 @@ module EY
58
58
  # This is a hack right now, but I haven't iterated over it enough for a good solution yet.
59
59
  if config.experimental_sync_assets?
60
60
  shell.status "Compiling assets once on localhost (experimental_sync_assets: true)"
61
- compilation_result = shell.logged_system("sh -l -c '#{cd} && #{task}'")
62
- raise "Assets compilation error" unless compilation_result.success?
61
+ shell.logged_system("sh -l -c '#{cd} && #{task}'")
63
62
 
64
63
  shell.status "Syncing assets to other remote servers (experimental_sync_assets: true)"
65
64
  runner.servers.remote.run_for_each do |server|
@@ -1,5 +1,5 @@
1
1
  module EY
2
2
  module Serverside
3
- VERSION = '2.7.0.pre'
3
+ VERSION = '2.7.8pre2'
4
4
  end
5
5
  end
@@ -0,0 +1,53 @@
1
+ require 'spec_helper'
2
+
3
+ class EY::Serverside::Source::Archive
4
+ def fetch_command
5
+ "cp #{uri} #{source_cache}"
6
+ end
7
+ end
8
+
9
+ describe "Deploying a simple application" do
10
+
11
+ before(:all) do
12
+ adapter = EY::Serverside::Adapter.new do |args|
13
+ args.account_name = "account"
14
+ args.app = "application_name"
15
+ args.stack = "nginx_unicorn"
16
+ args.environment_name = "environment_name"
17
+ args.framework_env = "production"
18
+ args.archive = FIXTURES_DIR.join('retwisj.war')
19
+ args.verbose = true
20
+ args.instances = [{ :hostname => "localhost", :roles => ["solo"], :name => "single" }]
21
+ args.serverside_version = Gem::Version.create(EY::Serverside::VERSION.dup).release
22
+ args.config = {
23
+ "deploy_to" => deploy_dir.to_s,
24
+ "group" => GROUP
25
+ }
26
+ end
27
+ argv = adapter.deploy.commands.last.to_argv[2..-1]
28
+ with_mocked_commands do
29
+ capture do
30
+ EY::Serverside::CLI.start(argv)
31
+ end
32
+ end
33
+ end
34
+
35
+ it "exploded the war" do
36
+ %w(META-INF WEB-INF).each {|dir|
37
+ File.exists?(deploy_dir.join('current', dir))
38
+ }
39
+ end
40
+
41
+ it "creates a REVISION file" do
42
+ path = deploy_dir.join('current', 'REVISION')
43
+ expect(path).to exist
44
+ checksum = File.read(path).strip
45
+ expect(checksum).to match(/7400dc058376745c11a98f768b799c6651428857\s+.*retwisj.war$/)
46
+ end
47
+
48
+ it "restarts the app servers" do
49
+ restart = deploy_dir.join('current', 'restart')
50
+ expect(restart).to exist
51
+ expect(restart.read.chomp).to eq(%|LANG="en_US.UTF-8" /engineyard/bin/app_application_name deploy|)
52
+ end
53
+ end
@@ -0,0 +1,26 @@
1
+ require 'spec_helper'
2
+
3
+ describe "Deploying a simple application" do
4
+ before(:all) do
5
+ deploy_test_application('not_bundled')
6
+ end
7
+
8
+ it "creates a REVISION file" do
9
+ expect(deploy_dir.join('current', 'REVISION')).to exist
10
+ end
11
+
12
+ it "restarts the app servers" do
13
+ restart = deploy_dir.join('current', 'restart')
14
+ expect(restart).to exist
15
+ expect(restart.read.chomp).to eq(%|LANG="en_US.UTF-8" /engineyard/bin/app_rails31 deploy|)
16
+ end
17
+
18
+ it "reuses the same active_release directory if a release_path is specified (such as in integrate)" do
19
+ path = @config.paths.active_release
20
+ expect(path.parent.children.size).to eq(1)
21
+
22
+ redeploy_test_application('config' => {'release_path' => path.to_s})
23
+
24
+ expect(path.parent.children.size).to eq(1)
25
+ end
26
+ end
@@ -0,0 +1,139 @@
1
+ require 'spec_helper'
2
+
3
+ describe "Deploying an application that uses Bundler" do
4
+ VERSION_PATTERN = Regexp.quote(::EY::Serverside::DependencyManager::Bundler.default_version)
5
+
6
+ context "with a Gemfile.lock" do
7
+ before(:all) do
8
+ deploy_test_application('ey_yml')
9
+ @install_bundler_command = @deployer.commands.grep(/gem install bundler/).first
10
+ @bundle_install_command = @deployer.commands.grep(/bundle _#{VERSION_PATTERN}_ install/).first
11
+ end
12
+
13
+ it "runs the right bundler command" do
14
+ expect(@install_bundler_command).not_to be_nil
15
+ expect(@install_bundler_command).to match(/install bundler .* -v "#{VERSION_PATTERN}"/)
16
+ end
17
+
18
+ it "runs 'bundle install' with --deployment" do
19
+ expect(@bundle_install_command).not_to be_nil
20
+ expect(@bundle_install_command).to include('--deployment')
21
+ end
22
+
23
+ it "removes bundled_gems directory if the ruby or system version changed" do
24
+ should_run_clear_bundle_cmd = @deployer.commands.grep(/diff/).first
25
+ expect(should_run_clear_bundle_cmd).not_to be_nil
26
+ clear_bundle_cmd = @deployer.commands.grep(/rm -Rf \S+\/bundled_gems/).first
27
+ expect(clear_bundle_cmd).not_to be_nil
28
+ end
29
+
30
+ it "has the binstubs in the path when migrating" do
31
+ expect(deploy_dir.join('path-when-migrating').read).to include('ey_bundler_binstubs')
32
+ end
33
+
34
+ it "creates a ruby version file" do
35
+ expect(deploy_dir.join('shared', 'bundled_gems', 'RUBY_VERSION')).to exist
36
+ end
37
+
38
+ it "creates a system version file" do
39
+ expect(deploy_dir.join('shared', 'bundled_gems', 'SYSTEM_VERSION')).to exist
40
+ end
41
+
42
+ it "generates bundler binstubs" do
43
+ pending "doesn't work with mocked bundler"
44
+ expect(deploy_dir.join('current', 'ey_bundler_binstubs', 'rake')).to exist
45
+ end
46
+ end
47
+
48
+ context "with clean option" do
49
+ before(:all) do
50
+ deploy_test_application('ey_yml', 'clean' => true)
51
+ end
52
+
53
+ it "removes bundled_gems directory if the ruby or system version changed" do
54
+ should_run_clear_bundle_cmd = @deployer.commands.grep(/diff/).first
55
+ expect(should_run_clear_bundle_cmd).to be_nil
56
+ clear_bundle_cmd = @deployer.commands.grep(/rm -Rf \S+\/bundled_gems/).first
57
+ expect(clear_bundle_cmd).not_to be_nil
58
+ end
59
+
60
+ end
61
+
62
+ context "with bundler disabled in ey.yml" do
63
+ before(:all) do
64
+ deploy_test_application('bundler_disabled')
65
+ end
66
+
67
+ it "does not run bundler commands" do
68
+ expect(@deployer.commands.grep(/gem install bundler/)).to be_empty
69
+ expect(@deployer.commands.grep(/bundle _.*_ install/)).to be_empty
70
+ end
71
+
72
+ it "still runs the hooks" do
73
+ expect(deploy_dir.join('current', 'before_bundle.ran' )).to exist
74
+ expect(deploy_dir.join('current', 'after_bundle.ran' )).to exist
75
+ end
76
+ end
77
+
78
+ context "without a Gemfile.lock" do
79
+ before(:all) do
80
+ deploy_test_application('no_gemfile_lock')
81
+ @install_bundler_command = @deployer.commands.grep(/gem install bundler/).first
82
+ @bundle_install_command = @deployer.commands.grep(/bundle _#{VERSION_PATTERN}_ install/).first
83
+ end
84
+
85
+ it "installs the proper Bundler version" do
86
+ expect(@install_bundler_command).not_to be_nil
87
+ expect(@install_bundler_command).to match(/unset RUBYOPT && gem list bundler | grep "bundler " | egrep -q "#{VERSION_PATTERN}[,)]" || gem install bundler -q --no-rdoc --no-ri -v "#{VERSION_PATTERN}"/)
88
+ end
89
+
90
+ it "runs 'bundle install' without --deployment" do
91
+ expect(@bundle_install_command).not_to be_nil
92
+ expect(@bundle_install_command).not_to match(/--deployment/)
93
+ end
94
+
95
+ it "exports GIT_SSH for the bundle install" do
96
+ expect(@bundle_install_command).to match(/export GIT_SSH/)
97
+ end
98
+
99
+ it "puts down RUBY_VERSION and SYSTEM_VERSION" do
100
+ expect(deploy_dir.join('shared', 'bundled_gems', 'RUBY_VERSION')).to exist
101
+ expect(deploy_dir.join('shared', 'bundled_gems', 'SYSTEM_VERSION')).to exist
102
+ end
103
+
104
+ it "warns that using a lockfile is idiomatic" do
105
+ out = read_output
106
+ expect(out).to match(/WARNING: Gemfile found but Gemfile.lock is missing!/)
107
+ end
108
+ end
109
+
110
+ context "without a Gemfile.lock and ignoring the warning" do
111
+ before(:all) do
112
+ deploy_test_application('no_gemfile_lock', 'config' => {'ignore_gemfile_lock_warning' => true})
113
+ expect(@config.ignore_gemfile_lock_warning).to be_truthy
114
+ @install_bundler_command = @deployer.commands.grep(/gem install bundler/).first
115
+ @bundle_install_command = @deployer.commands.grep(/bundle _#{VERSION_PATTERN}_ install/).first
116
+ end
117
+
118
+ it "should not warn" do
119
+ out = read_output
120
+ expect(out).not_to match(/WARNING/)
121
+ end
122
+ end
123
+
124
+ context "with a failing Gemfile" do
125
+ before(:all) do
126
+ begin
127
+ deploy_test_application('bundle_fails', 'bundle_install_fails' => true, 'verbose' => false)
128
+ rescue EY::Serverside::RemoteFailure
129
+ end
130
+ end
131
+
132
+ it "prints the failure to the log" do
133
+ out = read_output
134
+ expect(out).to match(%r|bundle install failure|)
135
+ expect(deploy_dir.join('current', 'after_bundle.ran' )).not_to exist
136
+ end
137
+ end
138
+ end
139
+