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.
- checksums.yaml +13 -5
- data/bin/engineyard-serverside +1 -1
- data/lib/engineyard-serverside/cli.rb +4 -225
- data/lib/engineyard-serverside/cli/app.rb +136 -0
- data/lib/engineyard-serverside/cli/helpers.rb +58 -0
- data/lib/engineyard-serverside/cli/server_hash_extractor.rb +49 -0
- data/lib/engineyard-serverside/cli/workflows.rb +45 -0
- data/lib/engineyard-serverside/cli/workflows/base.rb +78 -0
- data/lib/engineyard-serverside/cli/workflows/calling_deploy_hooks.rb +31 -0
- data/lib/engineyard-serverside/cli/workflows/deploying_applications.rb +28 -0
- data/lib/engineyard-serverside/cli/workflows/disabling_maintenance.rb +29 -0
- data/lib/engineyard-serverside/cli/workflows/enabling_maintenance.rb +29 -0
- data/lib/engineyard-serverside/cli/workflows/errors.rb +13 -0
- data/lib/engineyard-serverside/cli/workflows/helpers.rb +21 -0
- data/lib/engineyard-serverside/cli/workflows/integrating_servers.rb +63 -0
- data/lib/engineyard-serverside/cli/workflows/restarting_applications.rb +36 -0
- data/lib/engineyard-serverside/cli/workflows/rolling_back_applications.rb +28 -0
- data/lib/engineyard-serverside/cli/workflows/showing_maintenance_status.rb +28 -0
- data/lib/engineyard-serverside/dependency_manager/bundler.rb +43 -14
- data/lib/engineyard-serverside/propagator.rb +59 -0
- data/lib/engineyard-serverside/rails_assets.rb +5 -2
- data/lib/engineyard-serverside/version.rb +1 -1
- metadata +66 -394
- data/lib/engineyard-serverside/cli_helpers.rb +0 -53
- data/spec/archive_deploy_spec.rb +0 -53
- data/spec/basic_deploy_spec.rb +0 -26
- data/spec/bundler_deploy_spec.rb +0 -139
- data/spec/configuration_spec.rb +0 -205
- data/spec/custom_deploy_spec.rb +0 -128
- data/spec/deploy_hook_spec.rb +0 -362
- data/spec/deprecation_spec.rb +0 -23
- data/spec/ey_yml_customized_deploy_spec.rb +0 -99
- data/spec/fixtures/gitrepo.tar.gz +0 -0
- data/spec/fixtures/gitrepo/bar +0 -0
- data/spec/fixtures/gitrepo/foo +0 -0
- data/spec/fixtures/invalid_hook.rb +0 -1
- data/spec/fixtures/lockfiles/0.9-no-bundler +0 -111
- data/spec/fixtures/lockfiles/0.9-with-bundler +0 -117
- data/spec/fixtures/lockfiles/1.0-no-bundler +0 -54
- data/spec/fixtures/lockfiles/1.0.0.rc.1-with-bundler +0 -162
- data/spec/fixtures/lockfiles/1.0.18-do_mysql +0 -88
- data/spec/fixtures/lockfiles/1.0.18-do_postgres +0 -79
- data/spec/fixtures/lockfiles/1.0.18-mysql +0 -43
- data/spec/fixtures/lockfiles/1.0.18-mysql2 +0 -43
- data/spec/fixtures/lockfiles/1.0.18-pg +0 -43
- data/spec/fixtures/lockfiles/1.0.6-no-bundler +0 -51
- data/spec/fixtures/lockfiles/1.0.6-with-any-bundler +0 -52
- data/spec/fixtures/lockfiles/1.0.6-with-bundler +0 -52
- data/spec/fixtures/lockfiles/1.3.1-rails-3.2.13 +0 -112
- data/spec/fixtures/lockfiles/not-a-lockfile +0 -1
- data/spec/fixtures/repos/assets_detected/Gemfile +0 -5
- data/spec/fixtures/repos/assets_detected/Gemfile.lock +0 -88
- data/spec/fixtures/repos/assets_detected/README +0 -1
- data/spec/fixtures/repos/assets_detected/Rakefile +0 -5
- data/spec/fixtures/repos/assets_detected/app/assets/empty +0 -0
- data/spec/fixtures/repos/assets_detected/config/application.rb +0 -5
- data/spec/fixtures/repos/assets_detected/config/ey.yml +0 -3
- data/spec/fixtures/repos/assets_disabled/Gemfile +0 -5
- data/spec/fixtures/repos/assets_disabled/Gemfile.lock +0 -88
- data/spec/fixtures/repos/assets_disabled/README +0 -1
- data/spec/fixtures/repos/assets_disabled/Rakefile +0 -6
- data/spec/fixtures/repos/assets_disabled/app/assets/empty +0 -0
- data/spec/fixtures/repos/assets_disabled/config/application.rb +0 -5
- data/spec/fixtures/repos/assets_disabled/config/ey.yml +0 -3
- data/spec/fixtures/repos/assets_disabled_in_ey_yml/Gemfile +0 -5
- data/spec/fixtures/repos/assets_disabled_in_ey_yml/Gemfile.lock +0 -88
- data/spec/fixtures/repos/assets_disabled_in_ey_yml/README +0 -1
- data/spec/fixtures/repos/assets_disabled_in_ey_yml/Rakefile +0 -6
- data/spec/fixtures/repos/assets_disabled_in_ey_yml/app/assets/empty +0 -0
- data/spec/fixtures/repos/assets_disabled_in_ey_yml/config/application.rb +0 -5
- data/spec/fixtures/repos/assets_disabled_in_ey_yml/config/ey.yml +0 -5
- data/spec/fixtures/repos/assets_disabled_utf8/Gemfile +0 -5
- data/spec/fixtures/repos/assets_disabled_utf8/Gemfile.lock +0 -88
- data/spec/fixtures/repos/assets_disabled_utf8/README +0 -3
- data/spec/fixtures/repos/assets_disabled_utf8/Rakefile +0 -5
- data/spec/fixtures/repos/assets_disabled_utf8/app/assets/empty +0 -0
- data/spec/fixtures/repos/assets_disabled_utf8/config/application.rb +0 -7
- data/spec/fixtures/repos/assets_disabled_utf8/config/ey.yml +0 -3
- data/spec/fixtures/repos/assets_enabled_all/Gemfile +0 -5
- data/spec/fixtures/repos/assets_enabled_all/Gemfile.lock +0 -88
- data/spec/fixtures/repos/assets_enabled_all/README +0 -1
- data/spec/fixtures/repos/assets_enabled_all/app/assets/empty +0 -0
- data/spec/fixtures/repos/assets_enabled_all/config/application.rb +0 -5
- data/spec/fixtures/repos/assets_enabled_all/config/ey.yml +0 -6
- data/spec/fixtures/repos/assets_enabled_all/script/assets +0 -5
- data/spec/fixtures/repos/assets_enabled_all/tmp/obstruction +0 -1
- data/spec/fixtures/repos/assets_enabled_in_ey_yml/Gemfile +0 -3
- data/spec/fixtures/repos/assets_enabled_in_ey_yml/Gemfile.lock +0 -10
- data/spec/fixtures/repos/assets_enabled_in_ey_yml/README +0 -1
- data/spec/fixtures/repos/assets_enabled_in_ey_yml/Rakefile +0 -8
- data/spec/fixtures/repos/assets_enabled_in_ey_yml/config/ey.yml +0 -4
- data/spec/fixtures/repos/assets_enabled_util_only/Gemfile +0 -5
- data/spec/fixtures/repos/assets_enabled_util_only/Gemfile.lock +0 -88
- data/spec/fixtures/repos/assets_enabled_util_only/README +0 -1
- data/spec/fixtures/repos/assets_enabled_util_only/Rakefile +0 -6
- data/spec/fixtures/repos/assets_enabled_util_only/app/assets/empty +0 -0
- data/spec/fixtures/repos/assets_enabled_util_only/config/application.rb +0 -5
- data/spec/fixtures/repos/assets_enabled_util_only/config/ey.yml +0 -6
- data/spec/fixtures/repos/assets_in_hook/Gemfile +0 -5
- data/spec/fixtures/repos/assets_in_hook/Gemfile.lock +0 -88
- data/spec/fixtures/repos/assets_in_hook/README +0 -2
- data/spec/fixtures/repos/assets_in_hook/Rakefile +0 -5
- data/spec/fixtures/repos/assets_in_hook/app/assets/empty +0 -0
- data/spec/fixtures/repos/assets_in_hook/config/application.rb +0 -5
- data/spec/fixtures/repos/assets_in_hook/config/ey.yml +0 -3
- data/spec/fixtures/repos/assets_in_hook/deploy/before_compile_assets.rb +0 -2
- data/spec/fixtures/repos/bundle_fails/Gemfile +0 -1
- data/spec/fixtures/repos/bundle_fails/README +0 -1
- data/spec/fixtures/repos/bundle_fails/deploy/after_bundle.rb +0 -1
- data/spec/fixtures/repos/bundler_disabled/Gemfile +0 -4
- data/spec/fixtures/repos/bundler_disabled/Gemfile.lock +0 -12
- data/spec/fixtures/repos/bundler_disabled/README +0 -1
- data/spec/fixtures/repos/bundler_disabled/config/ey.yml +0 -2
- data/spec/fixtures/repos/bundler_disabled/deploy/after_bundle.rb +0 -1
- data/spec/fixtures/repos/bundler_disabled/deploy/before_bundle.rb +0 -1
- data/spec/fixtures/repos/default/Gemfile +0 -4
- data/spec/fixtures/repos/default/Gemfile.lock +0 -12
- data/spec/fixtures/repos/default/README +0 -5
- data/spec/fixtures/repos/default/ey.yml +0 -3
- data/spec/fixtures/repos/executable_hooks/README +0 -1
- data/spec/fixtures/repos/executable_hooks/deploy/before_restart +0 -72
- data/spec/fixtures/repos/executable_hooks_not_executable/README +0 -3
- data/spec/fixtures/repos/executable_hooks_not_executable/deploy/before_restart +0 -3
- data/spec/fixtures/repos/ey_yml/Gemfile +0 -4
- data/spec/fixtures/repos/ey_yml/Gemfile.lock +0 -12
- data/spec/fixtures/repos/ey_yml/README +0 -1
- data/spec/fixtures/repos/ey_yml/config/ey.yml +0 -18
- data/spec/fixtures/repos/ey_yml/deploy/before_migrate.rb +0 -6
- data/spec/fixtures/repos/ey_yml_alt/Gemfile +0 -4
- data/spec/fixtures/repos/ey_yml_alt/Gemfile.lock +0 -12
- data/spec/fixtures/repos/ey_yml_alt/README +0 -1
- data/spec/fixtures/repos/ey_yml_alt/deploy/before_migrate.rb +0 -6
- data/spec/fixtures/repos/ey_yml_alt/ey.yml +0 -12
- data/spec/fixtures/repos/hook_fails/README +0 -1
- data/spec/fixtures/repos/hook_fails/deploy/before_deploy.rb +0 -1
- data/spec/fixtures/repos/hooks/README +0 -1
- data/spec/fixtures/repos/hooks/deploy/after_bundle.rb +0 -1
- data/spec/fixtures/repos/hooks/deploy/after_compile_assets.rb +0 -1
- data/spec/fixtures/repos/hooks/deploy/after_deploy.rb +0 -1
- data/spec/fixtures/repos/hooks/deploy/after_migrate.rb +0 -1
- data/spec/fixtures/repos/hooks/deploy/after_restart.rb +0 -1
- data/spec/fixtures/repos/hooks/deploy/after_symlink.rb +0 -1
- data/spec/fixtures/repos/hooks/deploy/before_bundle.rb +0 -1
- data/spec/fixtures/repos/hooks/deploy/before_compile_assets.rb +0 -1
- data/spec/fixtures/repos/hooks/deploy/before_deploy.rb +0 -1
- data/spec/fixtures/repos/hooks/deploy/before_migrate.rb +0 -1
- data/spec/fixtures/repos/hooks/deploy/before_restart.rb +0 -1
- data/spec/fixtures/repos/hooks/deploy/before_symlink.rb +0 -1
- data/spec/fixtures/repos/multi_dep_manager/README +0 -1
- data/spec/fixtures/repos/multi_dep_manager/composer.json +0 -5
- data/spec/fixtures/repos/multi_dep_manager/composer.lock +0 -462
- data/spec/fixtures/repos/multi_dep_manager/package.json +0 -7
- data/spec/fixtures/repos/multi_dep_manager/public/index.php +0 -4
- data/spec/fixtures/repos/no_ey_config/Gemfile +0 -3
- data/spec/fixtures/repos/no_ey_config/Gemfile.lock +0 -10
- data/spec/fixtures/repos/no_ey_config/README +0 -1
- data/spec/fixtures/repos/no_ey_config/ey.yml +0 -3
- data/spec/fixtures/repos/no_gemfile_lock/Gemfile +0 -4
- data/spec/fixtures/repos/no_gemfile_lock/README +0 -1
- data/spec/fixtures/repos/no_gemfile_lock/ey.yml +0 -3
- data/spec/fixtures/repos/nodejs/README +0 -1
- data/spec/fixtures/repos/nodejs/package.json +0 -7
- data/spec/fixtures/repos/not_bundled/README +0 -1
- data/spec/fixtures/repos/npm_disabled/README +0 -1
- data/spec/fixtures/repos/npm_disabled/config/ey.yml +0 -2
- data/spec/fixtures/repos/npm_disabled/package.json +0 -7
- data/spec/fixtures/repos/php_composer_disabled/README +0 -1
- data/spec/fixtures/repos/php_composer_disabled/composer.json +0 -5
- data/spec/fixtures/repos/php_composer_disabled/composer.lock +0 -462
- data/spec/fixtures/repos/php_composer_disabled/config/ey.yml +0 -2
- data/spec/fixtures/repos/php_composer_disabled/public/index.php +0 -4
- data/spec/fixtures/repos/php_composer_lock/README +0 -1
- data/spec/fixtures/repos/php_composer_lock/composer.json +0 -5
- data/spec/fixtures/repos/php_composer_lock/composer.lock +0 -462
- data/spec/fixtures/repos/php_composer_lock/public/index.php +0 -4
- data/spec/fixtures/repos/php_no_composer_lock/README +0 -1
- data/spec/fixtures/repos/php_no_composer_lock/composer.json +0 -21
- data/spec/fixtures/repos/php_no_composer_lock/public/index.php +0 -4
- data/spec/fixtures/repos/public_system/Gemfile +0 -4
- data/spec/fixtures/repos/public_system/Gemfile.lock +0 -12
- data/spec/fixtures/repos/public_system/README +0 -5
- data/spec/fixtures/repos/public_system/ey.yml +0 -3
- data/spec/fixtures/repos/public_system/public/system/cant_touch_this.txt +0 -3
- data/spec/fixtures/repos/sqlite3/Gemfile +0 -4
- data/spec/fixtures/repos/sqlite3/Gemfile.lock +0 -89
- data/spec/fixtures/repos/sqlite3/README +0 -1
- data/spec/fixtures/retwisj.war +0 -0
- data/spec/fixtures/valid_hook.rb +0 -1
- data/spec/git_strategy_spec.rb +0 -34
- data/spec/lockfile_parser_spec.rb +0 -122
- data/spec/maintenance_spec.rb +0 -44
- data/spec/multi_dependency_manager_spec.rb +0 -25
- data/spec/nodejs_deploy_spec.rb +0 -30
- data/spec/php_deploy_spec.rb +0 -81
- data/spec/platform_configure_spec.rb +0 -61
- data/spec/rails31_deploy_spec.rb +0 -164
- data/spec/restart_spec.rb +0 -43
- data/spec/rollback_spec.rb +0 -87
- data/spec/server_spec.rb +0 -70
- data/spec/services_deploy_spec.rb +0 -153
- data/spec/shell_spec.rb +0 -57
- data/spec/source/archive_spec.rb +0 -33
- data/spec/source/git_spec.rb +0 -44
- data/spec/spec_helper.rb +0 -355
- data/spec/sqlite3_deploy_spec.rb +0 -38
- data/spec/support/integration.rb +0 -103
- data/spec/support/source_doubles.rb +0 -28
- data/spec/support/timecop.rb +0 -5
- data/spec/symlink_spec.rb +0 -15
data/spec/custom_deploy_spec.rb
DELETED
|
@@ -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
|
data/spec/deploy_hook_spec.rb
DELETED
|
@@ -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
|