engineyard-serverside 1.6.0.pre5 → 1.6.3

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 (34) hide show
  1. data/lib/engineyard-serverside.rb +1 -3
  2. data/lib/engineyard-serverside/cli.rb +38 -73
  3. data/lib/engineyard-serverside/configuration.rb +12 -38
  4. data/lib/engineyard-serverside/deploy.rb +54 -63
  5. data/lib/engineyard-serverside/deploy_hook.rb +18 -21
  6. data/lib/engineyard-serverside/deprecation.rb +17 -9
  7. data/lib/engineyard-serverside/lockfile_parser.rb +1 -1
  8. data/lib/engineyard-serverside/logged_output.rb +91 -0
  9. data/lib/engineyard-serverside/rails_asset_support.rb +5 -5
  10. data/lib/engineyard-serverside/server.rb +11 -8
  11. data/lib/engineyard-serverside/strategies/git.rb +15 -12
  12. data/lib/engineyard-serverside/task.rb +8 -29
  13. data/lib/engineyard-serverside/version.rb +1 -1
  14. data/lib/vendor/systemu/LICENSE +3 -0
  15. data/lib/vendor/systemu/lib/systemu.rb +363 -0
  16. data/lib/vendor/systemu/systemu.gemspec +45 -0
  17. data/spec/basic_deploy_spec.rb +9 -9
  18. data/spec/bundler_deploy_spec.rb +1 -1
  19. data/spec/custom_deploy_spec.rb +4 -63
  20. data/spec/deploy_hook_spec.rb +78 -77
  21. data/spec/deprecation_spec.rb +26 -4
  22. data/spec/git_strategy_spec.rb +2 -6
  23. data/spec/logged_output_spec.rb +55 -0
  24. data/spec/nodejs_deploy_spec.rb +2 -2
  25. data/spec/services_deploy_spec.rb +10 -11
  26. data/spec/spec_helper.rb +25 -48
  27. data/spec/sqlite3_deploy_spec.rb +2 -1
  28. data/spec/support/integration.rb +14 -2
  29. metadata +79 -94
  30. data/lib/engineyard-serverside/shell.rb +0 -102
  31. data/lib/engineyard-serverside/shell/formatter.rb +0 -73
  32. data/lib/engineyard-serverside/shell/helpers.rb +0 -29
  33. data/lib/vendor/open4/lib/open4.rb +0 -432
  34. data/spec/shell_spec.rb +0 -50
data/spec/spec_helper.rb CHANGED
@@ -17,10 +17,24 @@ module EY
17
17
  @node = nil
18
18
  end
19
19
 
20
- class Shell
21
- def spawn_process(cmd, cmd_stdout, cmd_stderr)
22
- cmd_stdout << `#{cmd} 2>&1`
23
- $? == 0
20
+ module LoggedOutput
21
+ def self.enable_actual_info!
22
+ @use_actual_info = true
23
+ end
24
+
25
+ def self.disable_actual_info!
26
+ @use_actual_info = false
27
+ end
28
+
29
+ def self.use_actual_info?
30
+ @use_actual_info
31
+ end
32
+
33
+ alias old_info info
34
+ def info(*args)
35
+ if EY::Serverside::LoggedOutput.use_actual_info?
36
+ old_info(*args)
37
+ end
24
38
  end
25
39
  end
26
40
 
@@ -37,7 +51,8 @@ FileUtils.rm_rf GITREPO_DIR if File.exists? GITREPO_DIR
37
51
  Kernel.system "tar xzf #{GITREPO_DIR}.tar.gz -C #{FIXTURES_DIR}"
38
52
 
39
53
  Spec::Runner.configure do |config|
40
- $NPM_INSTALLED = system('which npm 2>&1')
54
+ `which npm 2>&1`
55
+ $NPM_INSTALLED = ($? == 0)
41
56
  unless $NPM_INSTALLED
42
57
  $stderr.puts "npm not found; skipping Node.js specs."
43
58
  end
@@ -48,46 +63,10 @@ Spec::Runner.configure do |config|
48
63
  EY::Serverside.dna_json = {}.to_json
49
64
  end
50
65
 
51
- class VerboseStringIO < StringIO
52
- def <<(str)
53
- if ENV['VERBOSE'] || ENV['DEBUG']
54
- $stderr << str
55
- end
56
- super
57
- end
58
- end
59
-
60
- def stdout
61
- @stdout ||= VerboseStringIO.new
62
- end
63
-
64
- def stderr
65
- @stderr ||= VerboseStringIO.new
66
- end
67
-
68
- def read_stdout
69
- stdout.rewind
70
- stdout.read
71
- end
72
-
73
- def read_stderr
74
- stderr.rewind
75
- stderr.read
76
- end
77
-
78
- def read_output
79
- read_stdout + "\n" + read_stderr
80
- end
81
-
82
- def test_shell
83
- log_path = Pathname.new(Dir.tmpdir).join("serverside-deploy-#{Time.now.to_i}-#{$$}.log")
84
- EY::Serverside::Shell.new(:verbose => true, :log_path => log_path, :stdout => stdout, :stderr => stderr)
85
- end
86
-
87
66
  def deploy_test_application(assets_enabled = true, &block)
88
67
  $DISABLE_GEMFILE = false
89
68
  $DISABLE_LOCKFILE = false
90
- @deploy_dir = Pathname.new(Dir.tmpdir).join("serverside-deploy-#{Time.now.to_i}-#{$$}")
69
+ @deploy_dir = File.join(Dir.tmpdir, "serverside-deploy-#{Time.now.to_i}-#{$$}")
91
70
 
92
71
  # set up EY::Serverside::Server like we're on a solo
93
72
  EY::Serverside::Server.reset
@@ -96,27 +75,25 @@ Spec::Runner.configure do |config|
96
75
  # run a deploy
97
76
  @config = EY::Serverside::Deploy::Configuration.new({
98
77
  "strategy" => "IntegrationSpec",
99
- "deploy_to" => @deploy_dir.to_s,
78
+ "deploy_to" => @deploy_dir,
100
79
  "group" => `id -gn`.strip,
101
80
  "stack" => 'nginx_passenger',
102
81
  "migrate" => "ruby -e 'puts ENV[\"PATH\"]' > #{@deploy_dir}/path-when-migrating",
103
82
  'app' => 'rails31',
104
- 'environment' => 'env',
105
- 'account' => 'acc',
106
83
  'framework_env' => 'staging'
107
84
  })
108
85
 
109
86
  # pretend there is a shared bundled_gems directory
110
- @deploy_dir.join('shared', 'bundled_gems').mkpath
87
+ FileUtils.mkdir_p(File.join(@deploy_dir, 'shared', 'bundled_gems'))
111
88
  %w(RUBY_VERSION SYSTEM_VERSION).each do |name|
112
- @deploy_dir.join('shared', 'bundled_gems', name).open("w") { |f| f.write("old\n") }
89
+ File.open(File.join(@deploy_dir, 'shared', 'bundled_gems', name), "w") { |f| f.write("old\n") }
113
90
  end
114
91
 
115
92
  # Set up the application directory to have the requested asset options.
116
93
  prepare_rails31_app(assets_enabled)
117
94
 
118
95
  @binpath = File.expand_path(File.join(File.dirname(__FILE__), '..', 'bin', 'engineyard-serverside'))
119
- @deployer = FullTestDeploy.new(@config, test_shell)
96
+ @deployer = FullTestDeploy.new(@config)
120
97
  @deployer.deploy(&block)
121
98
  end
122
99
 
@@ -1,7 +1,7 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe "Deploying an application with sqlite3 as the only DB adapter in the Gemfile.lock" do
4
- before(:all) do
4
+ before do
5
5
  @release_path = nil
6
6
  @shared_path = nil
7
7
  @framework_env = nil
@@ -17,6 +17,7 @@ describe "Deploying an application with sqlite3 as the only DB adapter in the Ge
17
17
  @framework_env = deployer.framework_env
18
18
  end
19
19
  end
20
+
20
21
 
21
22
  it 'should symlink database.sqlite3.yml' do
22
23
  File.exist?(File.join(@release_path, 'config', 'database.yml')).should be_true
@@ -1,13 +1,25 @@
1
1
  class FullTestDeploy < EY::Serverside::Deploy
2
- attr_reader :commands
2
+ attr_reader :infos, :debugs, :commands
3
3
 
4
4
  def initialize(*)
5
5
  super
6
+ @infos = []
7
+ @debugs = []
6
8
  @commands = []
7
9
  @gemfile_contents = nil
8
10
  @lockfile_contents = nil
9
11
  end
10
12
 
13
+ # stfu
14
+ def info(msg)
15
+ @infos << msg
16
+ end
17
+
18
+ # no really, stfu
19
+ def debug(msg)
20
+ @debugs << msg
21
+ end
22
+
11
23
  # passwordless sudo is neither guaranteed nor desired
12
24
  def sudo(cmd)
13
25
  run(cmd)
@@ -201,7 +213,7 @@ module EY::Serverside::Strategies::NodeIntegrationSpec
201
213
  "name": "node-example",
202
214
  "version": "0.0.1",
203
215
  "dependencies": {
204
- "express": "2.2.0"
216
+ "express": "2.5.8"
205
217
  }
206
218
  }
207
219
  EOF
metadata CHANGED
@@ -1,94 +1,87 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: engineyard-serverside
3
- version: !ruby/object:Gem::Version
4
- hash: -2759328146
5
- prerelease: 6
6
- segments:
7
- - 1
8
- - 6
9
- - 0
10
- - pre
11
- - 5
12
- version: 1.6.0.pre5
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.6.3
5
+ prerelease:
13
6
  platform: ruby
14
- authors:
7
+ authors:
15
8
  - EY Cloud Team
16
9
  autorequire:
17
10
  bindir: bin
18
11
  cert_chain: []
19
-
20
- date: 2012-02-29 00:00:00 Z
21
- dependencies:
22
- - !ruby/object:Gem::Dependency
12
+ date: 2012-03-26 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
23
15
  name: rspec
24
- prerelease: false
25
- requirement: &id001 !ruby/object:Gem::Requirement
16
+ requirement: !ruby/object:Gem::Requirement
26
17
  none: false
27
- requirements:
28
- - - "="
29
- - !ruby/object:Gem::Version
30
- hash: 31
31
- segments:
32
- - 1
33
- - 3
34
- - 2
18
+ requirements:
19
+ - - '='
20
+ - !ruby/object:Gem::Version
35
21
  version: 1.3.2
36
22
  type: :development
37
- version_requirements: *id001
38
- - !ruby/object:Gem::Dependency
39
- name: rake
40
23
  prerelease: false
41
- requirement: &id002 !ruby/object:Gem::Requirement
24
+ version_requirements: !ruby/object:Gem::Requirement
42
25
  none: false
43
- requirements:
44
- - - ">="
45
- - !ruby/object:Gem::Version
46
- hash: 11
47
- segments:
48
- - 0
49
- - 9
50
- - 2
51
- - 2
26
+ requirements:
27
+ - - '='
28
+ - !ruby/object:Gem::Version
29
+ version: 1.3.2
30
+ - !ruby/object:Gem::Dependency
31
+ name: rake
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
52
37
  version: 0.9.2.2
53
38
  type: :development
54
- version_requirements: *id002
55
- - !ruby/object:Gem::Dependency
56
- name: rdoc
57
39
  prerelease: false
58
- requirement: &id003 !ruby/object:Gem::Requirement
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: 0.9.2.2
46
+ - !ruby/object:Gem::Dependency
47
+ name: rdoc
48
+ requirement: !ruby/object:Gem::Requirement
59
49
  none: false
60
- requirements:
61
- - - ">="
62
- - !ruby/object:Gem::Version
63
- hash: 3
64
- segments:
65
- - 0
66
- version: "0"
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
67
54
  type: :development
68
- version_requirements: *id003
69
- - !ruby/object:Gem::Dependency
70
- name: timecop
71
55
  prerelease: false
72
- requirement: &id004 !ruby/object:Gem::Requirement
56
+ version_requirements: !ruby/object:Gem::Requirement
73
57
  none: false
74
- requirements:
75
- - - ">="
76
- - !ruby/object:Gem::Version
77
- hash: 3
78
- segments:
79
- - 0
80
- version: "0"
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: timecop
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
81
70
  type: :development
82
- version_requirements: *id004
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
83
78
  description:
84
79
  email: cloud@engineyard.com
85
- executables:
80
+ executables:
86
81
  - engineyard-serverside
87
82
  extensions: []
88
-
89
83
  extra_rdoc_files: []
90
-
91
- files:
84
+ files:
92
85
  - bin/engineyard-serverside
93
86
  - lib/engineyard-serverside/cli.rb
94
87
  - lib/engineyard-serverside/configuration.rb
@@ -100,11 +93,9 @@ files:
100
93
  - lib/engineyard-serverside/futures/celluloid.rb
101
94
  - lib/engineyard-serverside/futures/dataflow.rb
102
95
  - lib/engineyard-serverside/lockfile_parser.rb
96
+ - lib/engineyard-serverside/logged_output.rb
103
97
  - lib/engineyard-serverside/rails_asset_support.rb
104
98
  - lib/engineyard-serverside/server.rb
105
- - lib/engineyard-serverside/shell/formatter.rb
106
- - lib/engineyard-serverside/shell/helpers.rb
107
- - lib/engineyard-serverside/shell.rb
108
99
  - lib/engineyard-serverside/strategies/git.rb
109
100
  - lib/engineyard-serverside/task.rb
110
101
  - lib/engineyard-serverside/version.rb
@@ -288,7 +279,9 @@ files:
288
279
  - lib/vendor/json_pure/tools/fuzz.rb
289
280
  - lib/vendor/json_pure/tools/server.rb
290
281
  - lib/vendor/json_pure/VERSION
291
- - lib/vendor/open4/lib/open4.rb
282
+ - lib/vendor/systemu/lib/systemu.rb
283
+ - lib/vendor/systemu/LICENSE
284
+ - lib/vendor/systemu/systemu.gemspec
292
285
  - lib/vendor/thor/bin/rake2thor
293
286
  - lib/vendor/thor/bin/thor
294
287
  - lib/vendor/thor/CHANGELOG.rdoc
@@ -351,51 +344,43 @@ files:
351
344
  - spec/fixtures/valid_hook.rb
352
345
  - spec/git_strategy_spec.rb
353
346
  - spec/lockfile_parser_spec.rb
347
+ - spec/logged_output_spec.rb
354
348
  - spec/nodejs_deploy_spec.rb
355
349
  - spec/rails31_deploy_spec.rb
356
350
  - spec/restart_spec.rb
357
351
  - spec/server_spec.rb
358
352
  - spec/services_deploy_spec.rb
359
- - spec/shell_spec.rb
360
353
  - spec/spec_helper.rb
361
354
  - spec/sqlite3_deploy_spec.rb
362
355
  - spec/support/integration.rb
363
356
  homepage: http://github.com/engineyard/engineyard-serverside
364
357
  licenses: []
365
-
366
358
  post_install_message:
367
359
  rdoc_options: []
368
-
369
- require_paths:
360
+ require_paths:
370
361
  - lib
371
- required_ruby_version: !ruby/object:Gem::Requirement
362
+ required_ruby_version: !ruby/object:Gem::Requirement
372
363
  none: false
373
- requirements:
374
- - - ">="
375
- - !ruby/object:Gem::Version
376
- hash: 3
377
- segments:
364
+ requirements:
365
+ - - ! '>='
366
+ - !ruby/object:Gem::Version
367
+ version: '0'
368
+ segments:
378
369
  - 0
379
- version: "0"
380
- required_rubygems_version: !ruby/object:Gem::Requirement
370
+ hash: -2108879952767088363
371
+ required_rubygems_version: !ruby/object:Gem::Requirement
381
372
  none: false
382
- requirements:
383
- - - ">="
384
- - !ruby/object:Gem::Version
385
- hash: 23
386
- segments:
387
- - 1
388
- - 3
389
- - 6
373
+ requirements:
374
+ - - ! '>='
375
+ - !ruby/object:Gem::Version
390
376
  version: 1.3.6
391
377
  requirements: []
392
-
393
378
  rubyforge_project:
394
- rubygems_version: 1.8.15
379
+ rubygems_version: 1.8.19
395
380
  signing_key:
396
381
  specification_version: 3
397
382
  summary: A gem that deploys ruby applications on EY Cloud instances
398
- test_files:
383
+ test_files:
399
384
  - spec/basic_deploy_spec.rb
400
385
  - spec/bundler_deploy_spec.rb
401
386
  - spec/custom_deploy_spec.rb
@@ -423,12 +408,12 @@ test_files:
423
408
  - spec/fixtures/valid_hook.rb
424
409
  - spec/git_strategy_spec.rb
425
410
  - spec/lockfile_parser_spec.rb
411
+ - spec/logged_output_spec.rb
426
412
  - spec/nodejs_deploy_spec.rb
427
413
  - spec/rails31_deploy_spec.rb
428
414
  - spec/restart_spec.rb
429
415
  - spec/server_spec.rb
430
416
  - spec/services_deploy_spec.rb
431
- - spec/shell_spec.rb
432
417
  - spec/spec_helper.rb
433
418
  - spec/sqlite3_deploy_spec.rb
434
419
  - spec/support/integration.rb
@@ -1,102 +0,0 @@
1
- require 'logger'
2
- require 'pathname'
3
- require 'open4'
4
- require 'engineyard-serverside/shell/formatter'
5
-
6
- module EY
7
- module Serverside
8
- class Shell
9
- class YieldIO
10
- def initialize(&block)
11
- @block = block
12
- end
13
- def <<(str)
14
- @block.call str
15
- end
16
- end
17
-
18
- attr_reader :logger
19
-
20
- def initialize(options)
21
- @start_time = options[:start_time]
22
- @verbose = options[:verbose]
23
-
24
-
25
- @stdout = options[:stdout] || $stdout
26
- @stderr = options[:stderr] || $stderr
27
-
28
- log_pathname = Pathname.new(options[:log_path])
29
- log_pathname.unlink if log_pathname.exist? # start fresh
30
- @logger = Logger.new(log_pathname.to_s)
31
- @logger.level = Logger::DEBUG # Always log to the file at debug, formatter hides debug for non-verbose
32
- @logger.formatter = EY::Serverside::Shell::Formatter.new(@stdout, @stderr, start_time, @verbose)
33
- end
34
-
35
- def start_time
36
- @start_time ||= Time.now
37
- end
38
-
39
- # a nice info outputter that prepends spermy operators for some reason.
40
- def status(msg)
41
- info msg.gsub(/^/, '~> ')
42
- end
43
-
44
- def substatus(msg)
45
- debug msg.gsub(/^/, ' ~ ')
46
- end
47
-
48
- # a debug outputter that displays a command being run
49
- # Formatis like this:
50
- # $ cmd blah do \
51
- # > something more
52
- # > end
53
- def show_command(cmd)
54
- debug cmd.gsub(/^/, ' > ').sub(/>/, '$')
55
- end
56
-
57
- def command_stdout(msg)
58
- debug msg.gsub(/^/,' ')
59
- end
60
-
61
- def command_stderr(msg)
62
- unknown msg.gsub(/^/,' ')
63
- end
64
-
65
- def fatal(msg) logger.fatal "FATAL: #{msg}" end
66
- def error(msg) logger.error "ERROR: #{msg}" end
67
- def warning(msg) logger.warn "WARNING: #{msg}" end
68
- def notice(msg) logger.warn msg end
69
- def info(msg) logger.info msg end
70
- def debug(msg) logger.debug msg end
71
- def unknown(msg) logger.unknown msg end
72
-
73
- # Return an IO that outputs to stdout or not according to the verbosity settings
74
- # debug is hidden in non-verbose mode
75
- def out
76
- YieldIO.new { |msg| command_stdout(msg) }
77
- end
78
-
79
- # Return an IO that outputs to stderr
80
- # unknown always shows, but without a severity title
81
- def err
82
- YieldIO.new { |msg| command_stderr(msg) }
83
- end
84
-
85
- def logged_system(cmd)
86
- show_command(cmd)
87
- spawn_process(cmd, out, err)
88
- end
89
-
90
- protected
91
-
92
- # spawn_process is a separate utility method so tests can override just the meat
93
- # of the process spawning and not couple the tests too tightly with the implementation.
94
- # we do this because Open4 LOVES to segfault in CI. FUN!
95
- def spawn_process(cmd, cmd_stdout, cmd_stderr)
96
- # :quiet means don't raise an error on nonzero exit status
97
- result = Open4.spawn cmd, 0 => '', 1 => cmd_stdout, 2 => cmd_stderr, :quiet => true
98
- result.exitstatus == 0
99
- end
100
- end
101
- end
102
- end