eventhub-command 0.3.11 → 0.3.12
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 +4 -4
- data/.gitignore +17 -17
- data/Gemfile +2 -2
- data/README.md +91 -91
- data/Rakefile +44 -44
- data/bin/eh +35 -35
- data/eh.gemspec +29 -29
- data/eh.rdoc +4 -4
- data/lib/deployer/base_deployer.rb +149 -149
- data/lib/deployer/executor.rb +113 -113
- data/lib/deployer/mule_deployer.rb +85 -85
- data/lib/deployer/net_ssh_extension.rb +45 -45
- data/lib/deployer/ruby_deployer.rb +114 -111
- data/lib/deployer/stage.rb +36 -36
- data/lib/deployer.rb +12 -12
- data/lib/eh/commands/deploy_mule.rb +23 -23
- data/lib/eh/commands/deploy_ruby.rb +25 -25
- data/lib/eh/commands/generate_processor.rb +90 -90
- data/lib/eh/commands/package_ruby.rb +113 -113
- data/lib/eh/commands/repository.rb +81 -81
- data/lib/eh/settings.rb +131 -131
- data/lib/eh/version.rb +3 -3
- data/lib/eh-commands.rb +21 -21
- data/lib/eh.rb +11 -11
- data/test/default_test.rb +14 -14
- data/test/test_helper.rb +9 -9
- data/todo.txt +8 -8
- metadata +3 -4
@@ -1,149 +1,149 @@
|
|
1
|
-
class Deployer::BaseDeployer
|
2
|
-
attr_reader :options, :stage_path, :stage
|
3
|
-
|
4
|
-
def initialize(options)
|
5
|
-
@options = options
|
6
|
-
|
7
|
-
@stage_path = File.join(Eh::Settings.current.stages_dir, "#{options[:stage]}.yml")
|
8
|
-
@stage = Deployer::Stage.load(options[:stage], stage_path)
|
9
|
-
end
|
10
|
-
|
11
|
-
private
|
12
|
-
|
13
|
-
def config_source_dir(*extra_paths)
|
14
|
-
File.join(base_dir, 'config', *extra_paths)
|
15
|
-
end
|
16
|
-
|
17
|
-
def log_deployment(executor, message)
|
18
|
-
executor.execute("echo $(date): #{message} - #{ENV['USER']} >> #{deploy_log_file}")
|
19
|
-
end
|
20
|
-
|
21
|
-
def base_dir
|
22
|
-
"~/apps/event_hub"
|
23
|
-
end
|
24
|
-
|
25
|
-
def deploy_log_file
|
26
|
-
File.join(shared_dir, 'logs', 'deploy.log')
|
27
|
-
end
|
28
|
-
|
29
|
-
def deploy_via
|
30
|
-
options[:deploy_via]
|
31
|
-
end
|
32
|
-
|
33
|
-
def verbose?
|
34
|
-
options[:verbose]
|
35
|
-
end
|
36
|
-
|
37
|
-
def via_scp?
|
38
|
-
deploy_via == 'scp'
|
39
|
-
end
|
40
|
-
|
41
|
-
def shared_dir
|
42
|
-
File.join(base_dir, 'shared')
|
43
|
-
end
|
44
|
-
|
45
|
-
def cached_copy_scp_dir
|
46
|
-
File.join(shared_dir, 'cached_copy_scp')
|
47
|
-
end
|
48
|
-
|
49
|
-
def cached_copy_svn_dir
|
50
|
-
File.join(shared_dir, 'cached_copy_svn')
|
51
|
-
end
|
52
|
-
|
53
|
-
def cached_copy_dir(*extra_paths)
|
54
|
-
dir = if via_scp?
|
55
|
-
cached_copy_scp_dir
|
56
|
-
else
|
57
|
-
if options[:tag]
|
58
|
-
File.join(cached_copy_svn_dir, 'tags', options[:tag], 'releases')
|
59
|
-
elsif options[:branch]
|
60
|
-
File.join(cached_copy_svn_dir, 'branches', options[:branch], 'releases')
|
61
|
-
else
|
62
|
-
File.join(cached_copy_svn_dir, 'branches', 'master', 'releases')
|
63
|
-
end
|
64
|
-
end
|
65
|
-
File.join(dir, *extra_paths)
|
66
|
-
end
|
67
|
-
|
68
|
-
def scm_username
|
69
|
-
Eh::Settings.current.repository.deploy_username
|
70
|
-
end
|
71
|
-
|
72
|
-
def scm_password
|
73
|
-
Eh::Settings.current.repository.deploy_password
|
74
|
-
end
|
75
|
-
|
76
|
-
def scm_base_url
|
77
|
-
Eh::Settings.current.repository.url
|
78
|
-
end
|
79
|
-
|
80
|
-
def repository
|
81
|
-
"#{scm_base_url}/branches/master/releases"
|
82
|
-
end
|
83
|
-
|
84
|
-
|
85
|
-
def create_base_dirs(executor)
|
86
|
-
dirs = [
|
87
|
-
File.join(base_dir, 'config'),
|
88
|
-
File.join(base_dir, 'ruby'),
|
89
|
-
File.join(base_dir, 'mule'),
|
90
|
-
File.join(base_dir, 'rails'),
|
91
|
-
shared_dir,
|
92
|
-
File.join(shared_dir, 'pids'),
|
93
|
-
File.join(shared_dir, 'logs'),
|
94
|
-
cached_copy_scp_dir
|
95
|
-
]
|
96
|
-
cmds = dirs.map do |dir|
|
97
|
-
"mkdir -p #{dir}"
|
98
|
-
end
|
99
|
-
executor.execute(cmds.join(" && "))
|
100
|
-
end
|
101
|
-
|
102
|
-
def update_scm(executor)
|
103
|
-
dir = cached_copy_svn_dir
|
104
|
-
cmd = <<-EOS
|
105
|
-
if [[ -d #{dir} ]]
|
106
|
-
then
|
107
|
-
cd #{dir}
|
108
|
-
svn up --trust-server-cert --non-interactive --username #{scm_username} --password #{scm_password}
|
109
|
-
else
|
110
|
-
svn co --trust-server-cert --non-interactive --username #{scm_username} --password #{scm_password} #{scm_base_url} #{dir}
|
111
|
-
fi
|
112
|
-
EOS
|
113
|
-
executor.execute(cmd)
|
114
|
-
end
|
115
|
-
|
116
|
-
private
|
117
|
-
|
118
|
-
|
119
|
-
# Executes an ls on all hosts and returns the combined
|
120
|
-
# list of files or dirs.
|
121
|
-
def remote_ls(executor, options, pattern)
|
122
|
-
results = executor.execute("ls #{pattern}", options)
|
123
|
-
results.map do |result|
|
124
|
-
if result[:stdout]
|
125
|
-
result[:stdout].split("\n")
|
126
|
-
end
|
127
|
-
end.flatten.compact.uniq
|
128
|
-
end
|
129
|
-
|
130
|
-
def verify_deployment_list!(requested, available)
|
131
|
-
# remove requested that are not available
|
132
|
-
puts 'Deployment List'.light_blue.on_blue
|
133
|
-
abort = false
|
134
|
-
requested.each do |name|
|
135
|
-
if available.include?(name)
|
136
|
-
puts "#{name}: AVAILABLE".green
|
137
|
-
else
|
138
|
-
abort = true
|
139
|
-
puts "#{name}: UNAVAILABLE".red
|
140
|
-
end
|
141
|
-
end
|
142
|
-
if abort
|
143
|
-
puts "Not all requested components are available in #{cached_copy_dir}. Will abort.".red
|
144
|
-
raise
|
145
|
-
end
|
146
|
-
|
147
|
-
end
|
148
|
-
|
149
|
-
end
|
1
|
+
class Deployer::BaseDeployer
|
2
|
+
attr_reader :options, :stage_path, :stage
|
3
|
+
|
4
|
+
def initialize(options)
|
5
|
+
@options = options
|
6
|
+
|
7
|
+
@stage_path = File.join(Eh::Settings.current.stages_dir, "#{options[:stage]}.yml")
|
8
|
+
@stage = Deployer::Stage.load(options[:stage], stage_path)
|
9
|
+
end
|
10
|
+
|
11
|
+
private
|
12
|
+
|
13
|
+
def config_source_dir(*extra_paths)
|
14
|
+
File.join(base_dir, 'config', *extra_paths)
|
15
|
+
end
|
16
|
+
|
17
|
+
def log_deployment(executor, message)
|
18
|
+
executor.execute("echo $(date): #{message} - #{ENV['USER']} >> #{deploy_log_file}")
|
19
|
+
end
|
20
|
+
|
21
|
+
def base_dir
|
22
|
+
"~/apps/event_hub"
|
23
|
+
end
|
24
|
+
|
25
|
+
def deploy_log_file
|
26
|
+
File.join(shared_dir, 'logs', 'deploy.log')
|
27
|
+
end
|
28
|
+
|
29
|
+
def deploy_via
|
30
|
+
options[:deploy_via]
|
31
|
+
end
|
32
|
+
|
33
|
+
def verbose?
|
34
|
+
options[:verbose]
|
35
|
+
end
|
36
|
+
|
37
|
+
def via_scp?
|
38
|
+
deploy_via == 'scp'
|
39
|
+
end
|
40
|
+
|
41
|
+
def shared_dir
|
42
|
+
File.join(base_dir, 'shared')
|
43
|
+
end
|
44
|
+
|
45
|
+
def cached_copy_scp_dir
|
46
|
+
File.join(shared_dir, 'cached_copy_scp')
|
47
|
+
end
|
48
|
+
|
49
|
+
def cached_copy_svn_dir
|
50
|
+
File.join(shared_dir, 'cached_copy_svn')
|
51
|
+
end
|
52
|
+
|
53
|
+
def cached_copy_dir(*extra_paths)
|
54
|
+
dir = if via_scp?
|
55
|
+
cached_copy_scp_dir
|
56
|
+
else
|
57
|
+
if options[:tag]
|
58
|
+
File.join(cached_copy_svn_dir, 'tags', options[:tag], 'releases')
|
59
|
+
elsif options[:branch]
|
60
|
+
File.join(cached_copy_svn_dir, 'branches', options[:branch], 'releases')
|
61
|
+
else
|
62
|
+
File.join(cached_copy_svn_dir, 'branches', 'master', 'releases')
|
63
|
+
end
|
64
|
+
end
|
65
|
+
File.join(dir, *extra_paths)
|
66
|
+
end
|
67
|
+
|
68
|
+
def scm_username
|
69
|
+
Eh::Settings.current.repository.deploy_username
|
70
|
+
end
|
71
|
+
|
72
|
+
def scm_password
|
73
|
+
Eh::Settings.current.repository.deploy_password
|
74
|
+
end
|
75
|
+
|
76
|
+
def scm_base_url
|
77
|
+
Eh::Settings.current.repository.url
|
78
|
+
end
|
79
|
+
|
80
|
+
def repository
|
81
|
+
"#{scm_base_url}/branches/master/releases"
|
82
|
+
end
|
83
|
+
|
84
|
+
|
85
|
+
def create_base_dirs(executor)
|
86
|
+
dirs = [
|
87
|
+
File.join(base_dir, 'config'),
|
88
|
+
File.join(base_dir, 'ruby'),
|
89
|
+
File.join(base_dir, 'mule'),
|
90
|
+
File.join(base_dir, 'rails'),
|
91
|
+
shared_dir,
|
92
|
+
File.join(shared_dir, 'pids'),
|
93
|
+
File.join(shared_dir, 'logs'),
|
94
|
+
cached_copy_scp_dir
|
95
|
+
]
|
96
|
+
cmds = dirs.map do |dir|
|
97
|
+
"mkdir -p #{dir}"
|
98
|
+
end
|
99
|
+
executor.execute(cmds.join(" && "))
|
100
|
+
end
|
101
|
+
|
102
|
+
def update_scm(executor)
|
103
|
+
dir = cached_copy_svn_dir
|
104
|
+
cmd = <<-EOS
|
105
|
+
if [[ -d #{dir} ]]
|
106
|
+
then
|
107
|
+
cd #{dir}
|
108
|
+
svn up --trust-server-cert --non-interactive --username #{scm_username} --password #{scm_password}
|
109
|
+
else
|
110
|
+
svn co --trust-server-cert --non-interactive --username #{scm_username} --password #{scm_password} #{scm_base_url} #{dir}
|
111
|
+
fi
|
112
|
+
EOS
|
113
|
+
executor.execute(cmd)
|
114
|
+
end
|
115
|
+
|
116
|
+
private
|
117
|
+
|
118
|
+
|
119
|
+
# Executes an ls on all hosts and returns the combined
|
120
|
+
# list of files or dirs.
|
121
|
+
def remote_ls(executor, options, pattern)
|
122
|
+
results = executor.execute("ls #{pattern}", options)
|
123
|
+
results.map do |result|
|
124
|
+
if result[:stdout]
|
125
|
+
result[:stdout].split("\n")
|
126
|
+
end
|
127
|
+
end.flatten.compact.uniq
|
128
|
+
end
|
129
|
+
|
130
|
+
def verify_deployment_list!(requested, available)
|
131
|
+
# remove requested that are not available
|
132
|
+
puts 'Deployment List'.light_blue.on_blue
|
133
|
+
abort = false
|
134
|
+
requested.each do |name|
|
135
|
+
if available.include?(name)
|
136
|
+
puts "#{name}: AVAILABLE".green
|
137
|
+
else
|
138
|
+
abort = true
|
139
|
+
puts "#{name}: UNAVAILABLE".red
|
140
|
+
end
|
141
|
+
end
|
142
|
+
if abort
|
143
|
+
puts "Not all requested components are available in #{cached_copy_dir}. Will abort.".red
|
144
|
+
raise
|
145
|
+
end
|
146
|
+
|
147
|
+
end
|
148
|
+
|
149
|
+
end
|
data/lib/deployer/executor.rb
CHANGED
@@ -1,113 +1,113 @@
|
|
1
|
-
require 'net/ssh'
|
2
|
-
require 'colorize'
|
3
|
-
|
4
|
-
class Deployer::Executor
|
5
|
-
attr_reader :stage
|
6
|
-
|
7
|
-
def initialize(stage, options = {})
|
8
|
-
@stage = stage
|
9
|
-
@options = options
|
10
|
-
yield(self) if block_given?
|
11
|
-
end
|
12
|
-
|
13
|
-
# execute a command on all hosts of a stage
|
14
|
-
# commands are expanded with :hostname, :port and :stagename
|
15
|
-
def execute(command, options = {})
|
16
|
-
log_command("Execute: '#{command.strip}'", options[:comment])
|
17
|
-
stage.hosts.each_with_index.map do |host, index|
|
18
|
-
expand_options = {hostname: host[:host], stagename: stage.name, port: host[:port]}
|
19
|
-
|
20
|
-
expanded_command = command % expand_options
|
21
|
-
if expanded_command != command
|
22
|
-
log_command("Expanded command to #{expanded_command}")
|
23
|
-
end
|
24
|
-
log_host(host, index)
|
25
|
-
result = execute_on(host, expanded_command)
|
26
|
-
log_result(result)
|
27
|
-
result
|
28
|
-
end
|
29
|
-
|
30
|
-
rescue => e
|
31
|
-
handle_exception(e, options)
|
32
|
-
end
|
33
|
-
|
34
|
-
|
35
|
-
def execute_on(host, command)
|
36
|
-
Net::SSH.start(host[:host], host[:user], port: host[:port]) do |ssh|
|
37
|
-
ssh.exec_sc!(command, verbose?)
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
def upload(source, target, options = {})
|
42
|
-
log_command("Execute: scp #{source} to #{target}", options[:comment])
|
43
|
-
stage.hosts.each_with_index do |host, index|
|
44
|
-
log_host(host, index)
|
45
|
-
result = upload_on(host, source, target)
|
46
|
-
log_result(result)
|
47
|
-
result
|
48
|
-
end
|
49
|
-
|
50
|
-
rescue => e
|
51
|
-
handle_exception(e, options)
|
52
|
-
end
|
53
|
-
|
54
|
-
private
|
55
|
-
def handle_exception(e, options)
|
56
|
-
if options[:abort_on_error] == false
|
57
|
-
puts "warning".black.on_yellow
|
58
|
-
puts " #{e.message}".yellow
|
59
|
-
else
|
60
|
-
puts "failure".black.on_red
|
61
|
-
puts " #{e.message}".red
|
62
|
-
end
|
63
|
-
raise unless options[:abort_on_error] == false
|
64
|
-
|
65
|
-
end
|
66
|
-
|
67
|
-
def verbose?
|
68
|
-
@options[:verbose]
|
69
|
-
end
|
70
|
-
|
71
|
-
def log_result(result)
|
72
|
-
puts "success".black.on_green
|
73
|
-
if verbose? && result[:stdout] && result[:stdout].length > 0
|
74
|
-
puts " -> #{result[:stdout].chomp}".light_blue
|
75
|
-
end
|
76
|
-
end
|
77
|
-
|
78
|
-
def log_host(host, index)
|
79
|
-
print " #{host[:host]} (#{index + 1}/#{stage.hosts.size}): "
|
80
|
-
end
|
81
|
-
|
82
|
-
def log_command(cmd, comment = nil)
|
83
|
-
puts cmd.blue
|
84
|
-
puts " (#{comment})" if verbose? && comment
|
85
|
-
end
|
86
|
-
|
87
|
-
def upload_on(host, source, target)
|
88
|
-
execute_local "scp -P #{host[:port]} #{source} #{host[:user]}@#{host[:host]}:#{target}"
|
89
|
-
end
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
def execute_local(command)
|
94
|
-
output = nil
|
95
|
-
exit_code = nil
|
96
|
-
|
97
|
-
Bundler.with_clean_env do
|
98
|
-
output = `#{command}`
|
99
|
-
exit_code = $?
|
100
|
-
end
|
101
|
-
|
102
|
-
raise "Command \"#{command}\" returned exit code #{exit_code}" unless exit_code.success?
|
103
|
-
|
104
|
-
result = {
|
105
|
-
stdout: output,
|
106
|
-
stderr: '',
|
107
|
-
exit_code: 0,
|
108
|
-
}
|
109
|
-
|
110
|
-
result
|
111
|
-
end
|
112
|
-
|
113
|
-
end
|
1
|
+
require 'net/ssh'
|
2
|
+
require 'colorize'
|
3
|
+
|
4
|
+
class Deployer::Executor
|
5
|
+
attr_reader :stage
|
6
|
+
|
7
|
+
def initialize(stage, options = {})
|
8
|
+
@stage = stage
|
9
|
+
@options = options
|
10
|
+
yield(self) if block_given?
|
11
|
+
end
|
12
|
+
|
13
|
+
# execute a command on all hosts of a stage
|
14
|
+
# commands are expanded with :hostname, :port and :stagename
|
15
|
+
def execute(command, options = {})
|
16
|
+
log_command("Execute: '#{command.strip}'", options[:comment])
|
17
|
+
stage.hosts.each_with_index.map do |host, index|
|
18
|
+
expand_options = {hostname: host[:host], stagename: stage.name, port: host[:port]}
|
19
|
+
|
20
|
+
expanded_command = command % expand_options
|
21
|
+
if expanded_command != command
|
22
|
+
log_command("Expanded command to #{expanded_command}")
|
23
|
+
end
|
24
|
+
log_host(host, index)
|
25
|
+
result = execute_on(host, expanded_command)
|
26
|
+
log_result(result)
|
27
|
+
result
|
28
|
+
end
|
29
|
+
|
30
|
+
rescue => e
|
31
|
+
handle_exception(e, options)
|
32
|
+
end
|
33
|
+
|
34
|
+
|
35
|
+
def execute_on(host, command)
|
36
|
+
Net::SSH.start(host[:host], host[:user], port: host[:port]) do |ssh|
|
37
|
+
ssh.exec_sc!(command, verbose?)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def upload(source, target, options = {})
|
42
|
+
log_command("Execute: scp #{source} to #{target}", options[:comment])
|
43
|
+
stage.hosts.each_with_index do |host, index|
|
44
|
+
log_host(host, index)
|
45
|
+
result = upload_on(host, source, target)
|
46
|
+
log_result(result)
|
47
|
+
result
|
48
|
+
end
|
49
|
+
|
50
|
+
rescue => e
|
51
|
+
handle_exception(e, options)
|
52
|
+
end
|
53
|
+
|
54
|
+
private
|
55
|
+
def handle_exception(e, options)
|
56
|
+
if options[:abort_on_error] == false
|
57
|
+
puts "warning".black.on_yellow
|
58
|
+
puts " #{e.message}".yellow
|
59
|
+
else
|
60
|
+
puts "failure".black.on_red
|
61
|
+
puts " #{e.message}".red
|
62
|
+
end
|
63
|
+
raise unless options[:abort_on_error] == false
|
64
|
+
|
65
|
+
end
|
66
|
+
|
67
|
+
def verbose?
|
68
|
+
@options[:verbose]
|
69
|
+
end
|
70
|
+
|
71
|
+
def log_result(result)
|
72
|
+
puts "success".black.on_green
|
73
|
+
if verbose? && result[:stdout] && result[:stdout].length > 0
|
74
|
+
puts " -> #{result[:stdout].chomp}".light_blue
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
def log_host(host, index)
|
79
|
+
print " #{host[:host]} (#{index + 1}/#{stage.hosts.size}): "
|
80
|
+
end
|
81
|
+
|
82
|
+
def log_command(cmd, comment = nil)
|
83
|
+
puts cmd.blue
|
84
|
+
puts " (#{comment})" if verbose? && comment
|
85
|
+
end
|
86
|
+
|
87
|
+
def upload_on(host, source, target)
|
88
|
+
execute_local "scp -P #{host[:port]} #{source} #{host[:user]}@#{host[:host]}:#{target}"
|
89
|
+
end
|
90
|
+
|
91
|
+
|
92
|
+
|
93
|
+
def execute_local(command)
|
94
|
+
output = nil
|
95
|
+
exit_code = nil
|
96
|
+
|
97
|
+
Bundler.with_clean_env do
|
98
|
+
output = `#{command}`
|
99
|
+
exit_code = $?
|
100
|
+
end
|
101
|
+
|
102
|
+
raise "Command \"#{command}\" returned exit code #{exit_code}" unless exit_code.success?
|
103
|
+
|
104
|
+
result = {
|
105
|
+
stdout: output,
|
106
|
+
stderr: '',
|
107
|
+
exit_code: 0,
|
108
|
+
}
|
109
|
+
|
110
|
+
result
|
111
|
+
end
|
112
|
+
|
113
|
+
end
|