engineyard-serverside 1.6.0.pre5 → 1.6.3

Sign up to get free protection for your applications and to get access to all the features.
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