eventhub-command 0.2.2 → 0.2.3
Sign up to get free protection for your applications and to get access to all the features.
- 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 +37 -37
- data/lib/deployer/ruby_deployer.rb +111 -111
- data/lib/deployer/stage.rb +27 -27
- data/lib/deployer.rb +11 -11
- data/lib/eh/commands/copy_config.rb +51 -51
- 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 +104 -104
- data/lib/eh/commands/repository.rb +81 -71
- data/lib/eh/settings.rb +114 -113
- data/lib/eh/version.rb +3 -3
- data/lib/eh-commands.rb +16 -17
- 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 -5
- data/lib/eh/commands/deploy.rb +0 -38
@@ -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(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/compoundbank/s_cme/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(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/compoundbank/s_cme/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)
|
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)
|
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
|