engineyard-serverside 1.5.29.pre.timestamps2 → 1.5.30
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/engineyard-serverside.rb +0 -2
- data/lib/engineyard-serverside/cli.rb +24 -29
- data/lib/engineyard-serverside/configuration.rb +0 -4
- data/lib/engineyard-serverside/deploy.rb +35 -42
- data/lib/engineyard-serverside/deploy_hook.rb +2 -2
- data/lib/engineyard-serverside/deprecation.rb +17 -7
- data/lib/engineyard-serverside/lockfile_parser.rb +1 -1
- data/lib/engineyard-serverside/logged_output.rb +90 -0
- data/lib/engineyard-serverside/rails_asset_support.rb +5 -5
- data/lib/engineyard-serverside/server.rb +11 -8
- data/lib/engineyard-serverside/strategies/git.rb +15 -12
- data/lib/engineyard-serverside/task.rb +4 -8
- data/lib/engineyard-serverside/version.rb +1 -1
- data/spec/basic_deploy_spec.rb +9 -9
- data/spec/bundler_deploy_spec.rb +1 -1
- data/spec/custom_deploy_spec.rb +3 -3
- data/spec/deprecation_spec.rb +26 -4
- data/spec/git_strategy_spec.rb +2 -6
- data/spec/logged_output_spec.rb +55 -0
- data/spec/nodejs_deploy_spec.rb +2 -2
- data/spec/services_deploy_spec.rb +10 -9
- data/spec/spec_helper.rb +27 -35
- data/spec/sqlite3_deploy_spec.rb +1 -0
- data/spec/support/integration.rb +13 -1
- metadata +24 -27
- data/lib/engineyard-serverside/shell.rb +0 -151
- data/spec/shell_spec.rb +0 -46
data/spec/spec_helper.rb
CHANGED
@@ -17,9 +17,27 @@ module EY
|
|
17
17
|
@node = nil
|
18
18
|
end
|
19
19
|
|
20
|
-
|
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
|
38
|
+
end
|
39
|
+
|
21
40
|
def logged_system(cmd)
|
22
|
-
running(cmd)
|
23
41
|
output = `#{cmd} 2>&1`
|
24
42
|
successful = ($? == 0)
|
25
43
|
if ENV['VERBOSE']
|
@@ -46,7 +64,8 @@ FileUtils.rm_rf GITREPO_DIR if File.exists? GITREPO_DIR
|
|
46
64
|
Kernel.system "tar xzf #{GITREPO_DIR}.tar.gz -C #{FIXTURES_DIR}"
|
47
65
|
|
48
66
|
Spec::Runner.configure do |config|
|
49
|
-
|
67
|
+
`which npm 2>&1`
|
68
|
+
$NPM_INSTALLED = ($? == 0)
|
50
69
|
unless $NPM_INSTALLED
|
51
70
|
$stderr.puts "npm not found; skipping Node.js specs."
|
52
71
|
end
|
@@ -57,37 +76,10 @@ Spec::Runner.configure do |config|
|
|
57
76
|
EY::Serverside.dna_json = {}.to_json
|
58
77
|
end
|
59
78
|
|
60
|
-
def stdout
|
61
|
-
@stdout ||= StringIO.new
|
62
|
-
end
|
63
|
-
|
64
|
-
def stderr
|
65
|
-
@stderr ||= StringIO.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
79
|
def deploy_test_application(assets_enabled = true, &block)
|
88
80
|
$DISABLE_GEMFILE = false
|
89
81
|
$DISABLE_LOCKFILE = false
|
90
|
-
@deploy_dir =
|
82
|
+
@deploy_dir = File.join(Dir.tmpdir, "serverside-deploy-#{Time.now.to_i}-#{$$}")
|
91
83
|
|
92
84
|
# set up EY::Serverside::Server like we're on a solo
|
93
85
|
EY::Serverside::Server.reset
|
@@ -96,7 +88,7 @@ Spec::Runner.configure do |config|
|
|
96
88
|
# run a deploy
|
97
89
|
@config = EY::Serverside::Deploy::Configuration.new({
|
98
90
|
"strategy" => "IntegrationSpec",
|
99
|
-
"deploy_to" => @deploy_dir
|
91
|
+
"deploy_to" => @deploy_dir,
|
100
92
|
"group" => `id -gn`.strip,
|
101
93
|
"stack" => 'nginx_passenger',
|
102
94
|
"migrate" => "ruby -e 'puts ENV[\"PATH\"]' > #{@deploy_dir}/path-when-migrating",
|
@@ -105,16 +97,16 @@ Spec::Runner.configure do |config|
|
|
105
97
|
})
|
106
98
|
|
107
99
|
# pretend there is a shared bundled_gems directory
|
108
|
-
|
100
|
+
FileUtils.mkdir_p(File.join(@deploy_dir, 'shared', 'bundled_gems'))
|
109
101
|
%w(RUBY_VERSION SYSTEM_VERSION).each do |name|
|
110
|
-
|
102
|
+
File.open(File.join(@deploy_dir, 'shared', 'bundled_gems', name), "w") { |f| f.write("old\n") }
|
111
103
|
end
|
112
104
|
|
113
105
|
# Set up the application directory to have the requested asset options.
|
114
106
|
prepare_rails31_app(assets_enabled)
|
115
107
|
|
116
108
|
@binpath = File.expand_path(File.join(File.dirname(__FILE__), '..', 'bin', 'engineyard-serverside'))
|
117
|
-
@deployer = FullTestDeploy.new(@config
|
109
|
+
@deployer = FullTestDeploy.new(@config)
|
118
110
|
@deployer.deploy(&block)
|
119
111
|
end
|
120
112
|
|
data/spec/sqlite3_deploy_spec.rb
CHANGED
@@ -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
|
data/spec/support/integration.rb
CHANGED
@@ -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)
|
metadata
CHANGED
@@ -1,16 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: engineyard-serverside
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
5
|
-
prerelease:
|
4
|
+
hash: 63
|
5
|
+
prerelease:
|
6
6
|
segments:
|
7
7
|
- 1
|
8
8
|
- 5
|
9
|
-
-
|
10
|
-
|
11
|
-
- timestamps
|
12
|
-
- 2
|
13
|
-
version: 1.5.29.pre.timestamps2
|
9
|
+
- 30
|
10
|
+
version: 1.5.30
|
14
11
|
platform: ruby
|
15
12
|
authors:
|
16
13
|
- EY Cloud Team
|
@@ -18,12 +15,10 @@ autorequire:
|
|
18
15
|
bindir: bin
|
19
16
|
cert_chain: []
|
20
17
|
|
21
|
-
date: 2012-02-
|
18
|
+
date: 2012-02-29 00:00:00 Z
|
22
19
|
dependencies:
|
23
20
|
- !ruby/object:Gem::Dependency
|
24
|
-
|
25
|
-
prerelease: false
|
26
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
21
|
+
version_requirements: &id001 !ruby/object:Gem::Requirement
|
27
22
|
none: false
|
28
23
|
requirements:
|
29
24
|
- - "="
|
@@ -34,12 +29,12 @@ dependencies:
|
|
34
29
|
- 3
|
35
30
|
- 2
|
36
31
|
version: 1.3.2
|
32
|
+
prerelease: false
|
33
|
+
requirement: *id001
|
37
34
|
type: :development
|
38
|
-
|
35
|
+
name: rspec
|
39
36
|
- !ruby/object:Gem::Dependency
|
40
|
-
|
41
|
-
prerelease: false
|
42
|
-
requirement: &id002 !ruby/object:Gem::Requirement
|
37
|
+
version_requirements: &id002 !ruby/object:Gem::Requirement
|
43
38
|
none: false
|
44
39
|
requirements:
|
45
40
|
- - ">="
|
@@ -51,12 +46,12 @@ dependencies:
|
|
51
46
|
- 2
|
52
47
|
- 2
|
53
48
|
version: 0.9.2.2
|
49
|
+
prerelease: false
|
50
|
+
requirement: *id002
|
54
51
|
type: :development
|
55
|
-
|
52
|
+
name: rake
|
56
53
|
- !ruby/object:Gem::Dependency
|
57
|
-
|
58
|
-
prerelease: false
|
59
|
-
requirement: &id003 !ruby/object:Gem::Requirement
|
54
|
+
version_requirements: &id003 !ruby/object:Gem::Requirement
|
60
55
|
none: false
|
61
56
|
requirements:
|
62
57
|
- - ">="
|
@@ -65,12 +60,12 @@ dependencies:
|
|
65
60
|
segments:
|
66
61
|
- 0
|
67
62
|
version: "0"
|
63
|
+
prerelease: false
|
64
|
+
requirement: *id003
|
68
65
|
type: :development
|
69
|
-
|
66
|
+
name: rdoc
|
70
67
|
- !ruby/object:Gem::Dependency
|
71
|
-
|
72
|
-
prerelease: false
|
73
|
-
requirement: &id004 !ruby/object:Gem::Requirement
|
68
|
+
version_requirements: &id004 !ruby/object:Gem::Requirement
|
74
69
|
none: false
|
75
70
|
requirements:
|
76
71
|
- - ">="
|
@@ -79,8 +74,10 @@ dependencies:
|
|
79
74
|
segments:
|
80
75
|
- 0
|
81
76
|
version: "0"
|
77
|
+
prerelease: false
|
78
|
+
requirement: *id004
|
82
79
|
type: :development
|
83
|
-
|
80
|
+
name: timecop
|
84
81
|
description:
|
85
82
|
email: cloud@engineyard.com
|
86
83
|
executables:
|
@@ -101,9 +98,9 @@ files:
|
|
101
98
|
- lib/engineyard-serverside/futures/celluloid.rb
|
102
99
|
- lib/engineyard-serverside/futures/dataflow.rb
|
103
100
|
- lib/engineyard-serverside/lockfile_parser.rb
|
101
|
+
- lib/engineyard-serverside/logged_output.rb
|
104
102
|
- lib/engineyard-serverside/rails_asset_support.rb
|
105
103
|
- lib/engineyard-serverside/server.rb
|
106
|
-
- lib/engineyard-serverside/shell.rb
|
107
104
|
- lib/engineyard-serverside/strategies/git.rb
|
108
105
|
- lib/engineyard-serverside/task.rb
|
109
106
|
- lib/engineyard-serverside/version.rb
|
@@ -350,12 +347,12 @@ files:
|
|
350
347
|
- spec/fixtures/valid_hook.rb
|
351
348
|
- spec/git_strategy_spec.rb
|
352
349
|
- spec/lockfile_parser_spec.rb
|
350
|
+
- spec/logged_output_spec.rb
|
353
351
|
- spec/nodejs_deploy_spec.rb
|
354
352
|
- spec/rails31_deploy_spec.rb
|
355
353
|
- spec/restart_spec.rb
|
356
354
|
- spec/server_spec.rb
|
357
355
|
- spec/services_deploy_spec.rb
|
358
|
-
- spec/shell_spec.rb
|
359
356
|
- spec/spec_helper.rb
|
360
357
|
- spec/sqlite3_deploy_spec.rb
|
361
358
|
- spec/support/integration.rb
|
@@ -422,12 +419,12 @@ test_files:
|
|
422
419
|
- spec/fixtures/valid_hook.rb
|
423
420
|
- spec/git_strategy_spec.rb
|
424
421
|
- spec/lockfile_parser_spec.rb
|
422
|
+
- spec/logged_output_spec.rb
|
425
423
|
- spec/nodejs_deploy_spec.rb
|
426
424
|
- spec/rails31_deploy_spec.rb
|
427
425
|
- spec/restart_spec.rb
|
428
426
|
- spec/server_spec.rb
|
429
427
|
- spec/services_deploy_spec.rb
|
430
|
-
- spec/shell_spec.rb
|
431
428
|
- spec/spec_helper.rb
|
432
429
|
- spec/sqlite3_deploy_spec.rb
|
433
430
|
- spec/support/integration.rb
|
@@ -1,151 +0,0 @@
|
|
1
|
-
require 'logger'
|
2
|
-
require 'open4'
|
3
|
-
|
4
|
-
module EY
|
5
|
-
module Serverside
|
6
|
-
# FileIO
|
7
|
-
|
8
|
-
class Shell
|
9
|
-
# Compatibility with old LoggedOutput where the module was included into the class.
|
10
|
-
module Helpers
|
11
|
-
def verbose?
|
12
|
-
shell.verbose?
|
13
|
-
end
|
14
|
-
|
15
|
-
def warning(*a)
|
16
|
-
shell.warning(*a)
|
17
|
-
end
|
18
|
-
|
19
|
-
def info(*a)
|
20
|
-
shell.info(*a)
|
21
|
-
end
|
22
|
-
|
23
|
-
def debug(*a)
|
24
|
-
shell.debug(*a)
|
25
|
-
end
|
26
|
-
|
27
|
-
def logged_system(*a)
|
28
|
-
shell.logged_system(*a)
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
class Formatter
|
33
|
-
|
34
|
-
def initialize(stdout, stderr, start_time, verbose)
|
35
|
-
@stdout, @stderr = stdout, stderr
|
36
|
-
@start = start_time.to_i
|
37
|
-
@verbose = verbose
|
38
|
-
end
|
39
|
-
|
40
|
-
def call(severity, time, _, message)
|
41
|
-
if %w[WARN ERROR FATAL].include?(severity)
|
42
|
-
msg = prepend("#{timestamp(time)}!> ", "#{severity_name(severity)}#{message}")
|
43
|
-
else
|
44
|
-
msg = prepend(timestamp(time), message)
|
45
|
-
end
|
46
|
-
|
47
|
-
put_to_io(severity, msg)
|
48
|
-
msg
|
49
|
-
end
|
50
|
-
|
51
|
-
def prepend(pre, str)
|
52
|
-
str.gsub(/^/, pre).sub(/\n?\z/m,"\n")
|
53
|
-
end
|
54
|
-
|
55
|
-
def put_to_io(severity, msg)
|
56
|
-
if severity == "DEBUG" && !@verbose
|
57
|
-
# quiet
|
58
|
-
elsif severity == "INFO"
|
59
|
-
@stdout << msg
|
60
|
-
@stdout.flush
|
61
|
-
else
|
62
|
-
@stderr << msg
|
63
|
-
@stderr.flush
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
def timestamp(datetime)
|
68
|
-
diff = datetime.to_i - @start
|
69
|
-
diff = 0 if diff < 0
|
70
|
-
"+%2dm %02ds\t" % diff.divmod(60)
|
71
|
-
end
|
72
|
-
|
73
|
-
def severity_name(severity)
|
74
|
-
if %w[INFO DEBUG ANY].include?(severity)
|
75
|
-
""
|
76
|
-
elsif severity =='WARN'
|
77
|
-
"WARNING: "
|
78
|
-
else
|
79
|
-
"#{severity}: "
|
80
|
-
end
|
81
|
-
end
|
82
|
-
end
|
83
|
-
|
84
|
-
class YieldIO
|
85
|
-
def initialize(&block)
|
86
|
-
@block = block
|
87
|
-
end
|
88
|
-
|
89
|
-
def <<(str)
|
90
|
-
@block.call str
|
91
|
-
end
|
92
|
-
end
|
93
|
-
|
94
|
-
attr_reader :logger
|
95
|
-
|
96
|
-
def initialize(options)
|
97
|
-
@start_time = options[:start_time]
|
98
|
-
@verbose = options[:verbose]
|
99
|
-
|
100
|
-
@log_pathname = Pathname.new(options[:log_path])
|
101
|
-
@log_pathname.unlink if @log_pathname.exist? # start fresh
|
102
|
-
|
103
|
-
@stdout = options[:stdout] || $stdout
|
104
|
-
@stderr = options[:stderr] || $stderr
|
105
|
-
|
106
|
-
@logger = Logger.new(@log_pathname.to_s)
|
107
|
-
@logger.level = Logger::DEBUG # Always log to the file at debug, formatter hides debug for non-verbose
|
108
|
-
@logger.formatter = Formatter.new(@stdout, @stderr, start_time, @verbose)
|
109
|
-
end
|
110
|
-
|
111
|
-
def start_time
|
112
|
-
@start_time ||= Time.now
|
113
|
-
end
|
114
|
-
|
115
|
-
# a nice info outputter that prepends spermy operators for some reason.
|
116
|
-
def status(msg)
|
117
|
-
info msg.gsub(/^/, '~> ')
|
118
|
-
end
|
119
|
-
|
120
|
-
# a debug outputter that displays a command being run
|
121
|
-
def running(cmd)
|
122
|
-
debug ":: running #{cmd}"
|
123
|
-
end
|
124
|
-
|
125
|
-
def fatal(msg) logger.fatal msg end
|
126
|
-
def error(msg) logger.error msg end
|
127
|
-
def warning(msg) logger.warn msg end
|
128
|
-
def info(msg) logger.info msg end
|
129
|
-
def debug(msg) logger.debug msg end
|
130
|
-
|
131
|
-
def logged_system(cmd)
|
132
|
-
running(cmd)
|
133
|
-
# :quiet means don't raise an error on nonzero exit status
|
134
|
-
status = Open4.spawn cmd, 0 => '', 1 => out, 2 => err, :quiet => true
|
135
|
-
status.exitstatus == 0
|
136
|
-
end
|
137
|
-
|
138
|
-
# Return an IO that outputs to stdout or not according to the verbosity settings
|
139
|
-
# debug is hidden in non-verbose mode
|
140
|
-
def out
|
141
|
-
YieldIO.new { |msg| logger.debug(msg) }
|
142
|
-
end
|
143
|
-
|
144
|
-
# Return an IO that outputs to stderr
|
145
|
-
# unknown always shows, but without a severity title
|
146
|
-
def err
|
147
|
-
YieldIO.new { |msg| logger.unknown(msg) }
|
148
|
-
end
|
149
|
-
end
|
150
|
-
end
|
151
|
-
end
|
data/spec/shell_spec.rb
DELETED
@@ -1,46 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
require 'tempfile'
|
3
|
-
require 'timecop'
|
4
|
-
|
5
|
-
describe EY::Serverside::Shell do
|
6
|
-
it "has a timestamp before each line" do
|
7
|
-
time1 = Time.local(2008, 9, 1, 12, 0, 0)
|
8
|
-
time2 = Time.local(2008, 9, 1, 12, 3, 5)
|
9
|
-
time3 = Time.local(2008, 9, 1, 12, 10, 25)
|
10
|
-
|
11
|
-
@output = StringIO.new
|
12
|
-
@shell = EY::Serverside::Shell.new(:verbose => true, :stdout => @output, :stderr => @output, :log_path => Pathname.new(Dir.tmpdir).join("engineyard-serverside-#{Time.now.to_i}-${$$}.log"), :start_time => time1)
|
13
|
-
|
14
|
-
Timecop.freeze(time1) do
|
15
|
-
@shell.debug('test1')
|
16
|
-
@shell.warning('test2')
|
17
|
-
end
|
18
|
-
Timecop.freeze(time2) do
|
19
|
-
@shell.info('test3')
|
20
|
-
@shell.debug("test11\ntest12\ntest13")
|
21
|
-
@shell.warning("test21\ntest22\ntest23")
|
22
|
-
end
|
23
|
-
Timecop.freeze(time3) do
|
24
|
-
@shell.info("test31\ntest32\ntest33")
|
25
|
-
end
|
26
|
-
|
27
|
-
timestamp_1 = "+ 0m 00s "
|
28
|
-
timestamp_2 = "+ 3m 05s "
|
29
|
-
timestamp_3 = "+10m 25s "
|
30
|
-
@output.rewind
|
31
|
-
@output.read.should == <<-OUTPUT
|
32
|
-
#{timestamp_1}test1
|
33
|
-
#{timestamp_1}!> WARNING: test2
|
34
|
-
#{timestamp_2}test3
|
35
|
-
#{timestamp_2}test11
|
36
|
-
#{timestamp_2}test12
|
37
|
-
#{timestamp_2}test13
|
38
|
-
#{timestamp_2}!> WARNING: test21
|
39
|
-
#{timestamp_2}!> test22
|
40
|
-
#{timestamp_2}!> test23
|
41
|
-
#{timestamp_3}test31
|
42
|
-
#{timestamp_3}test32
|
43
|
-
#{timestamp_3}test33
|
44
|
-
OUTPUT
|
45
|
-
end
|
46
|
-
end
|