eventhub-command 0.1.1 → 0.2.0
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/README.md +51 -12
- data/bin/eh +2 -6
- data/lib/deployer.rb +5 -0
- data/lib/deployer/base_deployer.rb +136 -0
- data/lib/deployer/config_deployer.rb +29 -0
- data/lib/deployer/executor.rb +21 -10
- data/lib/deployer/mule_deployer.rb +85 -0
- data/lib/deployer/net_ssh_extension.rb +1 -1
- data/lib/deployer/ruby_deployer.rb +111 -0
- data/lib/deployer/stage.rb +3 -4
- data/lib/eh-commands.rb +16 -7
- data/lib/eh/commands/deploy.rb +1 -1
- data/lib/eh/commands/deploy_config.rb +18 -0
- data/lib/eh/commands/deploy_mule.rb +12 -57
- data/lib/eh/commands/deploy_ruby.rb +14 -76
- data/lib/eh/commands/list_stages.rb +17 -0
- data/lib/eh/commands/{package.rb → package_ruby.rb} +1 -1
- data/lib/eh/commands/repository.rb +71 -0
- data/lib/eh/settings.rb +58 -17
- data/lib/eh/version.rb +1 -1
- metadata +10 -7
- data/features/eh.feature +0 -8
- data/features/step_definitions/eh_steps.rb +0 -6
- data/features/support/env.rb +0 -15
- data/lib/eh/commands/package_rails.rb +0 -68
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5e59a6239b908a41811a317418219b8a4760792e
|
4
|
+
data.tar.gz: 1ed264c65607cfeed2698851870da30f7a1c99bf
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1733d17688b953e82fe07afa35d1c9a0fd304b78b451463a3217f34ce9c2fd62d7244c88fb2e7cccbd9fe700164cae18d4037298ff880529f479ddbbfbadb998
|
7
|
+
data.tar.gz: 322c3ddd44488f03cdd01095b6b95bc2a632930879e92c0007765b2c1e2586673dc103c05398214d0434cccbe3676fffaffb0c7e1a6245acbb4b6dee80cdf71e
|
data/README.md
CHANGED
@@ -19,34 +19,73 @@ $ rbenv rehash
|
|
19
19
|
First time running the command
|
20
20
|
~~~ sh
|
21
21
|
$ eh
|
22
|
-
|
23
|
-
Please specify the Eventhub SVN root directory (i.e. the directory which contains the 'src', 'release', ... directories
|
24
|
-
/Users/username/dev/event_hub
|
25
|
-
Config file written to /Users/username/.eh. Please try again.
|
22
|
+
Created empty config file. Please run 'eh repository add'
|
26
23
|
$
|
27
24
|
~~~
|
28
25
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
~/.eh-stages
|
26
|
+
Run again:
|
27
|
+
~~~ sh
|
28
|
+
$ eh repository add http://something.com/project/svn /Users/foo/eventhub/branches/master username password
|
29
|
+
$
|
34
30
|
~~~
|
35
31
|
|
32
|
+
NOTE: username and password you specify here are from the deploy user.
|
33
|
+
|
34
|
+
### Stages
|
35
|
+
|
36
|
+
Some commands (e.g. deploy commands) will use stages to determine where to deploy. Those stage files are now
|
37
|
+
stored in the eventhub SVN repository under config/ directory
|
38
|
+
|
36
39
|
The file name is the name of the stage, the content describes environments, hosts, ports and users to use.
|
37
40
|
Content looks like this:
|
38
41
|
|
39
42
|
~~~
|
40
43
|
localhost:
|
41
|
-
node_env: development
|
42
44
|
hosts:
|
43
45
|
- host: localhost
|
44
46
|
port: 2222
|
45
|
-
user:
|
47
|
+
user: some_user
|
46
48
|
~~~
|
47
49
|
|
48
50
|
|
51
|
+
## Usage
|
49
52
|
|
53
|
+
Help and description for the commands can be obtained through:
|
54
|
+
|
55
|
+
~~~
|
56
|
+
eh --help
|
57
|
+
~~~
|
58
|
+
and more specific for a single command
|
59
|
+
~~~
|
60
|
+
eh <COMMAND> --help
|
61
|
+
~~~
|
62
|
+
|
63
|
+
### Common options
|
64
|
+
|
65
|
+
Some common options are:
|
66
|
+
|
67
|
+
* --stage (one of the names that are listed from list_stages command)
|
68
|
+
* --deploy_via (use svn or scp for deployment. If scp, then the local release directory is used, otherwise svn)
|
69
|
+
* --branch/--tag (specify a branch or tag to use for "deploy_via scp")
|
70
|
+
* --verbose (enable verbose output)
|
71
|
+
|
72
|
+
### Commands
|
73
|
+
|
74
|
+
* deploy_ruby: deploy a ruby processor to a stage. You can specify:
|
75
|
+
* a processor name
|
76
|
+
* multiple processor names spearated via commas
|
77
|
+
* a pattern like something.*
|
78
|
+
* a combination of above
|
79
|
+
* deploy_mule: deploy a mule adapter to a stage
|
80
|
+
* a adapter name
|
81
|
+
* multiple adapter names spearated via commas
|
82
|
+
* a pattern like something.*
|
83
|
+
* a combination of above
|
84
|
+
* deploy_config: checkout the latest version of config on target stage and copy to the config folder on stage.
|
85
|
+
Those config files will be used uppon next deployment.
|
86
|
+
* list_stages: list stages that are available for deploy_* commands
|
87
|
+
* package_ruby: package ruby processors to zip files and copy to release directory on local machines. Those packages
|
88
|
+
will be used upon next "deploy_via scp" or if you commit them to SVN then upon next "deploy_via svn"
|
89
|
+
* generate_processor: generate a processor from a basic template
|
50
90
|
|
51
91
|
|
52
|
-
## Usage
|
data/bin/eh
CHANGED
@@ -14,14 +14,10 @@ if File.readable?(config_file)
|
|
14
14
|
settings = Eh::Settings.load(config_file)
|
15
15
|
Eh::Settings.current = settings
|
16
16
|
else
|
17
|
-
puts "Config file missing: ~/.eh, will create it now..."
|
18
|
-
puts "Please specify the Eventhub SVN root directory (i.e. the directory which contains the 'src', 'release', ... directories"
|
19
|
-
input = STDIN.gets.chomp
|
20
|
-
data = {'repository_root_dir' => input}
|
21
17
|
File.open(config_file, 'w') do |file|
|
22
|
-
file.write(JSON.dump(
|
18
|
+
file.write(JSON.dump({}))
|
23
19
|
end
|
24
|
-
puts "
|
20
|
+
puts "Created empty config file. Please run 'eh repository add'"
|
25
21
|
exit
|
26
22
|
end
|
27
23
|
|
data/lib/deployer.rb
CHANGED
@@ -4,3 +4,8 @@ end
|
|
4
4
|
require_relative 'deployer/executor'
|
5
5
|
require_relative 'deployer/net_ssh_extension'
|
6
6
|
require_relative 'deployer/stage'
|
7
|
+
|
8
|
+
require_relative 'deployer/base_deployer'
|
9
|
+
require_relative 'deployer/mule_deployer'
|
10
|
+
require_relative 'deployer/ruby_deployer'
|
11
|
+
require_relative 'deployer/config_deployer'
|
@@ -0,0 +1,136 @@
|
|
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(base_dir, 'shared', '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 cached_copy_dir(*extra_paths)
|
42
|
+
dir = if via_scp?
|
43
|
+
File.join(base_dir, 'shared', 'cached-copy-scp')
|
44
|
+
else
|
45
|
+
if options[:tag]
|
46
|
+
File.join(base_dir, 'shared', 'cached-copy-svn', 'tags', options[:tag], 'releases')
|
47
|
+
elsif options[:branch]
|
48
|
+
File.join(base_dir, 'shared', 'cached-copy-svn', 'branches', options[:branch], 'releases')
|
49
|
+
else
|
50
|
+
File.join(base_dir, 'shared', 'cached-copy-svn', 'branches', 'master', 'releases')
|
51
|
+
end
|
52
|
+
end
|
53
|
+
File.join(dir, *extra_paths)
|
54
|
+
end
|
55
|
+
|
56
|
+
def scm_username
|
57
|
+
'deploy'
|
58
|
+
end
|
59
|
+
|
60
|
+
def scm_password
|
61
|
+
'deploy2014!'
|
62
|
+
end
|
63
|
+
|
64
|
+
def scm_base_url
|
65
|
+
"https://whistler.plan.io/svn/eventhub"
|
66
|
+
end
|
67
|
+
|
68
|
+
def repository
|
69
|
+
"#{scm_base_url}/branches/master/releases"
|
70
|
+
end
|
71
|
+
|
72
|
+
|
73
|
+
def create_base_dirs(executor)
|
74
|
+
dirs = [
|
75
|
+
File.join(base_dir, 'config'),
|
76
|
+
File.join(base_dir, 'ruby'),
|
77
|
+
File.join(base_dir, 'mule'),
|
78
|
+
File.join(base_dir, 'rails'),
|
79
|
+
File.join(base_dir, 'shared'),
|
80
|
+
File.join(base_dir, 'shared', 'pids'),
|
81
|
+
File.join(base_dir, 'shared', 'logs'),
|
82
|
+
File.join(base_dir, 'shared', 'cached-copy-scp')
|
83
|
+
]
|
84
|
+
cmds = dirs.map do |dir|
|
85
|
+
"mkdir -p #{dir}"
|
86
|
+
end
|
87
|
+
executor.execute(cmds.join(" && "))
|
88
|
+
end
|
89
|
+
def update_scm(executor)
|
90
|
+
dir = File.join(base_dir, 'shared/cached-copy-svn')
|
91
|
+
cmd = <<-EOS
|
92
|
+
if [[ -d #{dir} ]]
|
93
|
+
then
|
94
|
+
cd #{dir}
|
95
|
+
svn up --trust-server-cert --non-interactive --username #{scm_username} --password #{scm_password}
|
96
|
+
else
|
97
|
+
svn co --trust-server-cert --non-interactive --username #{scm_username} --password #{scm_password} #{scm_base_url} #{dir}
|
98
|
+
fi
|
99
|
+
EOS
|
100
|
+
executor.execute(cmd)
|
101
|
+
end
|
102
|
+
|
103
|
+
private
|
104
|
+
|
105
|
+
|
106
|
+
# Executes an ls on all hosts and returns the combined
|
107
|
+
# list of files or dirs.
|
108
|
+
def remote_ls(executor, options, pattern)
|
109
|
+
results = executor.execute("ls #{pattern}", options)
|
110
|
+
results.map do |result|
|
111
|
+
if result[:stdout]
|
112
|
+
result[:stdout].split("\n")
|
113
|
+
end
|
114
|
+
end.flatten.compact.uniq
|
115
|
+
end
|
116
|
+
|
117
|
+
def verify_deployment_list!(requested, available)
|
118
|
+
# remove requested that are not available
|
119
|
+
puts 'Deployment List'.light_blue.on_blue
|
120
|
+
abort = false
|
121
|
+
requested.each do |name|
|
122
|
+
if available.include?(name)
|
123
|
+
puts "#{name}: AVAILABLE".green
|
124
|
+
else
|
125
|
+
abort = true
|
126
|
+
puts "#{name}: UNAVAILABLE".red
|
127
|
+
end
|
128
|
+
end
|
129
|
+
if abort
|
130
|
+
puts 'Not all requested components are available in #{cached_copy_dir}. Will abort.'.red
|
131
|
+
raise
|
132
|
+
end
|
133
|
+
|
134
|
+
end
|
135
|
+
|
136
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
class Deployer::ConfigDeployer < Deployer::BaseDeployer
|
2
|
+
def initialize(options = {})
|
3
|
+
options[:deploy_via] = 'svn'
|
4
|
+
super(options)
|
5
|
+
end
|
6
|
+
|
7
|
+
def deploy!
|
8
|
+
puts "deploying to #{stage.name} via #{deploy_via}".light_blue.on_blue
|
9
|
+
Deployer::Executor.new(stage, verbose: verbose?) do |executor|
|
10
|
+
create_base_dirs(executor)
|
11
|
+
update_scm(executor)
|
12
|
+
|
13
|
+
source = cached_copy_dir('..', 'config', "%{stagename}", "%{hostname}", '')
|
14
|
+
target = config_source_dir
|
15
|
+
|
16
|
+
cmd = "rsync -r --exclude=.svn #{source} #{target}"
|
17
|
+
executor.execute(cmd)
|
18
|
+
# stage.hosts.each do |host|
|
19
|
+
# hostname = host[:host]
|
20
|
+
# source = cached_copy_dir('..', 'config', stage.name, hostname, '')
|
21
|
+
# target = config_source_dir
|
22
|
+
|
23
|
+
# # we use rsync to copy without .svn folders
|
24
|
+
# cmd = "mkdir -p #{target} && rsync -r --exclude=.svn #{source} #{target}"
|
25
|
+
# executor.execute_on(host, cmd)
|
26
|
+
# end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
data/lib/deployer/executor.rb
CHANGED
@@ -10,32 +10,47 @@ class Deployer::Executor
|
|
10
10
|
yield(self) if block_given?
|
11
11
|
end
|
12
12
|
|
13
|
-
|
13
|
+
# execute a command on all hosts of a stage
|
14
|
+
# commands are expanded with :hostname, :port and :stagename
|
14
15
|
def execute(command, options = {})
|
15
|
-
log_command("Execute: '#{command}'", options[:comment])
|
16
|
-
stage.hosts.each_with_index do |host, index|
|
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
|
17
24
|
log_host(host, index)
|
18
|
-
result = execute_on(host,
|
25
|
+
result = execute_on(host, expanded_command)
|
19
26
|
log_result(result)
|
27
|
+
result
|
20
28
|
end
|
21
29
|
|
22
30
|
rescue => e
|
23
31
|
handle_exception(e, options)
|
24
32
|
end
|
25
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
|
+
|
26
41
|
def upload(source, target, options = {})
|
27
42
|
log_command("Execute: scp #{source} to #{target}", options[:comment])
|
28
43
|
stage.hosts.each_with_index do |host, index|
|
29
44
|
log_host(host, index)
|
30
45
|
result = upload_on(host, source, target)
|
31
46
|
log_result(result)
|
47
|
+
result
|
32
48
|
end
|
33
49
|
|
34
50
|
rescue => e
|
35
51
|
handle_exception(e, options)
|
36
52
|
end
|
37
53
|
|
38
|
-
|
39
54
|
private
|
40
55
|
def handle_exception(e, options)
|
41
56
|
if options[:abort_on_error] == false
|
@@ -73,11 +88,7 @@ class Deployer::Executor
|
|
73
88
|
execute_local "scp -P #{host[:port]} #{source} #{host[:user]}@#{host[:host]}:#{target}"
|
74
89
|
end
|
75
90
|
|
76
|
-
|
77
|
-
Net::SSH.start(host[:host], host[:user], port: host[:port]) do |ssh|
|
78
|
-
ssh.exec_sc!(command)
|
79
|
-
end
|
80
|
-
end
|
91
|
+
|
81
92
|
|
82
93
|
def execute_local(command)
|
83
94
|
output = nil
|
@@ -0,0 +1,85 @@
|
|
1
|
+
class Deployer::MuleDeployer < Deployer::BaseDeployer
|
2
|
+
attr_reader :adapter_names
|
3
|
+
|
4
|
+
def initialize(adapter_names, options)
|
5
|
+
super(options)
|
6
|
+
@adapter_names = adapter_names
|
7
|
+
end
|
8
|
+
|
9
|
+
def adapter_cached_copy(adapter_name)
|
10
|
+
cached_copy_dir('mule', "#{adapter_name}.zip")
|
11
|
+
end
|
12
|
+
|
13
|
+
def config_source_dir(adapter_name)
|
14
|
+
super('mule', adapter_name)
|
15
|
+
end
|
16
|
+
|
17
|
+
def deploy!
|
18
|
+
puts "deploying to #{stage.name} via #{deploy_via}".light_blue.on_blue
|
19
|
+
|
20
|
+
Deployer::Executor.new(stage, verbose: verbose?) do |executor|
|
21
|
+
create_base_dirs(executor)
|
22
|
+
|
23
|
+
# update
|
24
|
+
update_cached_copy(executor)
|
25
|
+
|
26
|
+
adapter_names_to_deploy = resolve_adapter_names(executor, options)
|
27
|
+
|
28
|
+
adapter_names_to_deploy.each do |adapter_name|
|
29
|
+
puts
|
30
|
+
puts "Deploying #{adapter_name}".light_blue.on_blue
|
31
|
+
log_deployment(executor, "Deploying #{adapter_name} via #{deploy_via} from #{cached_copy_dir}")
|
32
|
+
# make a copy of the zip files to merge them with config
|
33
|
+
cached_copy_source = adapter_cached_copy(adapter_name)
|
34
|
+
configuration_target = File.join(base_dir, 'mule', "#{adapter_name}.zip")
|
35
|
+
executor.execute("cp #{cached_copy_source} #{configuration_target}")
|
36
|
+
|
37
|
+
# copy config
|
38
|
+
config_source = config_source_dir(adapter_name)
|
39
|
+
executor.execute("if [[ -d #{config_source} ]] ; then cd #{config_source} ; zip -r #{configuration_target} . ; fi")
|
40
|
+
|
41
|
+
# deploy
|
42
|
+
executor.execute("cp #{adapter_cached_copy(adapter_name)} $MULE_HOME/apps")
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
|
48
|
+
private
|
49
|
+
|
50
|
+
def resolve_adapter_names(executor, options)
|
51
|
+
available = remote_ls(executor, options, cached_copy_dir('mule', '*.zip')).map do |name|
|
52
|
+
File.basename(name, '.zip')
|
53
|
+
end
|
54
|
+
|
55
|
+
fetched = Array(adapter_names).map do |name|
|
56
|
+
if name.include?('*') # resolve pattern on remote machine
|
57
|
+
remote_ls(executor, options, cached_copy_dir('mule', "#{name}.zip"))
|
58
|
+
else
|
59
|
+
name
|
60
|
+
end
|
61
|
+
end
|
62
|
+
if fetched.empty? # then fetch all
|
63
|
+
fetched = available
|
64
|
+
end
|
65
|
+
|
66
|
+
fetched = fetched.flatten.map do |name|
|
67
|
+
File.basename(name, '.zip')
|
68
|
+
end
|
69
|
+
|
70
|
+
verify_deployment_list!(fetched, available)
|
71
|
+
|
72
|
+
fetched
|
73
|
+
end
|
74
|
+
|
75
|
+
def update_cached_copy(executor)
|
76
|
+
if via_scp?
|
77
|
+
source = Eh::Settings.current.releases_dir('mule', '*.zip')
|
78
|
+
target_dir = cached_copy_dir('mule')
|
79
|
+
executor.execute("rm -rf #{target_dir}/*.zip && mkdir -p #{target_dir}")
|
80
|
+
executor.upload(source, target_dir)
|
81
|
+
else
|
82
|
+
update_scm(executor)
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
@@ -2,7 +2,7 @@ class Net::SSH::Connection::Session
|
|
2
2
|
|
3
3
|
def exec_sc!(command)
|
4
4
|
stdout_data,stderr_data = "",""
|
5
|
-
exit_code,exit_signal = nil,nil
|
5
|
+
exit_code, exit_signal = nil,nil
|
6
6
|
self.open_channel do |channel|
|
7
7
|
channel.exec(command) do |_, success|
|
8
8
|
raise "Command \"#{command}\" was unable to execute" unless success
|
@@ -0,0 +1,111 @@
|
|
1
|
+
class Deployer::RubyDeployer < Deployer::BaseDeployer
|
2
|
+
attr_accessor :processor_names
|
3
|
+
|
4
|
+
def initialize(processor_names, options)
|
5
|
+
super(options)
|
6
|
+
@processor_names = processor_names
|
7
|
+
end
|
8
|
+
|
9
|
+
def deploy!
|
10
|
+
puts "deploying to #{stage.name} via #{deploy_via}".light_blue.on_blue
|
11
|
+
|
12
|
+
Deployer::Executor.new(stage, verbose: verbose?) do |executor|
|
13
|
+
create_base_dirs(executor)
|
14
|
+
|
15
|
+
|
16
|
+
update_cached_copy(executor)
|
17
|
+
|
18
|
+
|
19
|
+
# fetch processor_names unless they have been passed as an argument to the initializer
|
20
|
+
processor_names_to_deploy = resolve_processor_names(executor, options)
|
21
|
+
processor_names_to_deploy.each do |processor_name|
|
22
|
+
puts
|
23
|
+
puts "Deploying #{processor_name}".light_blue.on_blue
|
24
|
+
log_deployment(executor, "Deploying #{processor_name} via #{deploy_via} from #{cached_copy_dir}")
|
25
|
+
# stop old one
|
26
|
+
executor.execute("kill -s TERM $(cat #{File.join(pids_dir, processor_name)}.pid)", abort_on_error: false, comment: "This is not sooo important")
|
27
|
+
|
28
|
+
# unzip package
|
29
|
+
target = deploy_dir('ruby')
|
30
|
+
source = cached_copy_dir('ruby',"#{processor_name}.zip")
|
31
|
+
executor.execute("rm -rf #{processor_dir(processor_name)} && unzip -o -d #{target} #{source}")
|
32
|
+
|
33
|
+
# copy config
|
34
|
+
executor.execute("if [[ -d #{config_source_dir(processor_name)} ]] ; then cp -r #{config_source_dir(processor_name)}/* #{processor_dir(processor_name)}; fi")
|
35
|
+
|
36
|
+
# symlink log dir
|
37
|
+
executor.execute("ln -s #{logs_dir} #{processor_dir(processor_name, 'logs')}")
|
38
|
+
|
39
|
+
# symlink pids dir
|
40
|
+
executor.execute("ln -s #{pids_dir} #{processor_dir(processor_name, 'pids')}")
|
41
|
+
|
42
|
+
# install gems
|
43
|
+
executor.execute("cd #{processor_dir(processor_name)} && bundle install --without test")
|
44
|
+
|
45
|
+
# start new one
|
46
|
+
executor.execute("cd #{processor_dir(processor_name)} && bundle exec ruby #{processor_name}.rb -d -e $EH_ENV")
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
private
|
52
|
+
|
53
|
+
def update_cached_copy(executor)
|
54
|
+
if via_scp?
|
55
|
+
source = Eh::Settings.current.releases_dir('ruby', '*.zip')
|
56
|
+
target_dir = File.join(cached_copy_dir, 'ruby')
|
57
|
+
executor.execute("rm -rf #{target_dir}/*.zip && mkdir -p #{target_dir}")
|
58
|
+
executor.upload(source, target_dir)
|
59
|
+
else
|
60
|
+
update_scm(executor)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def logs_dir
|
65
|
+
File.join(base_dir, 'shared', 'logs')
|
66
|
+
end
|
67
|
+
|
68
|
+
def pids_dir
|
69
|
+
File.join(base_dir, 'shared', 'pids')
|
70
|
+
end
|
71
|
+
|
72
|
+
def deploy_dir(*extra_paths)
|
73
|
+
File.join(base_dir, *extra_paths)
|
74
|
+
end
|
75
|
+
|
76
|
+
def processor_dir(*extra_paths)
|
77
|
+
File.join(deploy_dir, 'ruby', *extra_paths)
|
78
|
+
end
|
79
|
+
|
80
|
+
def config_source_dir(processor_name)
|
81
|
+
super('ruby', processor_name)
|
82
|
+
end
|
83
|
+
|
84
|
+
# Detect what processors to deploy
|
85
|
+
#
|
86
|
+
def resolve_processor_names(executor, options)
|
87
|
+
available = remote_ls(executor, options, File.join(cached_copy_dir, 'ruby', '*.zip')).map do |name|
|
88
|
+
File.basename(name, '.zip')
|
89
|
+
end
|
90
|
+
|
91
|
+
fetched = Array(processor_names).map do |name|
|
92
|
+
if name.include?('*') # resolve pattern on remote machine
|
93
|
+
remote_ls(executor, options, File.join(cached_copy_dir, 'ruby', "#{name}.zip"))
|
94
|
+
else
|
95
|
+
name
|
96
|
+
end
|
97
|
+
end
|
98
|
+
if fetched.empty? # then fetch all
|
99
|
+
fetched = available
|
100
|
+
end
|
101
|
+
|
102
|
+
fetched = fetched.flatten.map do |name|
|
103
|
+
File.basename(name, '.zip')
|
104
|
+
end
|
105
|
+
|
106
|
+
verify_deployment_list!(fetched, available)
|
107
|
+
|
108
|
+
fetched
|
109
|
+
end
|
110
|
+
|
111
|
+
end
|
data/lib/deployer/stage.rb
CHANGED
@@ -1,9 +1,8 @@
|
|
1
1
|
class Deployer::Stage
|
2
|
-
attr_reader :name, :
|
2
|
+
attr_reader :name, :hosts
|
3
3
|
|
4
|
-
def initialize(name
|
4
|
+
def initialize(name)
|
5
5
|
@name = name
|
6
|
-
@node_env = node_env
|
7
6
|
@hosts = []
|
8
7
|
end
|
9
8
|
|
@@ -18,7 +17,7 @@ class Deployer::Stage
|
|
18
17
|
def self.load(file)
|
19
18
|
data = YAML.load_file(file)
|
20
19
|
data.map do |name, config|
|
21
|
-
stage = Deployer::Stage.new(name
|
20
|
+
stage = Deployer::Stage.new(name)
|
22
21
|
config['hosts'].each do |host|
|
23
22
|
stage.host(host['host'], host['port'], host['user'])
|
24
23
|
end
|
data/lib/eh-commands.rb
CHANGED
@@ -1,8 +1,17 @@
|
|
1
1
|
# All commands are required here
|
2
|
-
|
3
|
-
require 'eh/commands/
|
4
|
-
require 'eh/commands/generate_processor'
|
5
|
-
require 'eh/commands/
|
6
|
-
require 'eh/commands/
|
7
|
-
require 'eh/commands/
|
8
|
-
require 'eh/commands/
|
2
|
+
if Eh::Settings.current.repository
|
3
|
+
require 'eh/commands/deploy'
|
4
|
+
require 'eh/commands/generate_processor'
|
5
|
+
require 'eh/commands/package_ruby'
|
6
|
+
require 'eh/commands/list_stages'
|
7
|
+
require 'eh/commands/deploy_config'
|
8
|
+
require 'eh/commands/deploy_ruby'
|
9
|
+
require 'eh/commands/deploy_mule'
|
10
|
+
else
|
11
|
+
# remove unused settings for this version
|
12
|
+
Eh::Settings.current.data.delete('repository_root_dir')
|
13
|
+
Eh::Settings.current.write
|
14
|
+
puts "No current repository defined. Please run 'eh repository add' and/or 'eh repository select'"
|
15
|
+
end
|
16
|
+
|
17
|
+
require 'eh/commands/repository'
|
data/lib/eh/commands/deploy.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
desc 'Deploys the app'
|
2
2
|
arg_name 'stage', optional: true
|
3
|
-
command :deploy do |c|
|
4
3
|
|
4
|
+
command :deploy do |c|
|
5
5
|
c.flag([:deploy_via], :desc => "One of 'copy' or 'scm'", :default_value => 'scm')
|
6
6
|
c.flag([:copy_from_dir], :desc => "Source directory for copy operation", :default_value => Eh::Settings.current.releases_dir)
|
7
7
|
c.flag([:tag], :desc => "The tag to deploy")
|
@@ -0,0 +1,18 @@
|
|
1
|
+
desc 'distribute the configs to the nodes'
|
2
|
+
|
3
|
+
command :deploy_config do |c|
|
4
|
+
c.flag([:stage], desc: 'stage', type: String, long_desc: 'Stage where processor is deployed to', default_value: 'development')
|
5
|
+
c.flag([:branch], desc: 'branch', type: String, long_desc: 'What branch to deploy. Only when deploy_via=scm', default_value: 'master')
|
6
|
+
c.flag([:tag], desc: 'tag', type: String, long_desc: 'What tag to deploy. Only when deploy_via=scm', default_value: nil)
|
7
|
+
|
8
|
+
c.switch([:v, :verbose], :desc => 'Show additional output.')
|
9
|
+
|
10
|
+
c.action do |global_options, options, args|
|
11
|
+
begin
|
12
|
+
Deployer::ConfigDeployer.new(options).deploy!
|
13
|
+
rescue => e
|
14
|
+
puts e.message
|
15
|
+
puts e.backtrace.join("\n")
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -1,68 +1,23 @@
|
|
1
|
-
|
2
1
|
desc 'deploy a single channel adapter'
|
3
|
-
arg_name 'channel_adapter
|
2
|
+
arg_name '[channel_adapter[,other_channel_adapter,pattern*]]'
|
4
3
|
|
5
4
|
command :deploy_mule do |c|
|
6
|
-
c.flag([:
|
7
|
-
c.flag([:deploy_via], desc:
|
5
|
+
c.flag([:stage], desc: 'stage', type: String, long_desc: 'Stage where channel adapter is deployed to', default_value: 'development')
|
6
|
+
c.flag([:deploy_via], desc: 'how to get hold of the channel adapter: scm or scp', type: String, long_desc: 'copy the channel adapter zip file via scp from this machine or check it out from scm', default_value: 'scp')
|
8
7
|
|
9
|
-
c.switch([:v, :verbose], :desc =>
|
8
|
+
c.switch([:v, :verbose], :desc => 'Show additional output.')
|
10
9
|
|
11
10
|
c.action do |global_options, options, args|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
end
|
16
|
-
|
17
|
-
adapter_name = args[0]
|
18
|
-
|
19
|
-
|
20
|
-
stage_path = File.join(Eh::Settings.current.stages_dir, "#{options[:stage]}.yml")
|
21
|
-
stage = Deployer::Stage.load(stage_path)
|
22
|
-
|
23
|
-
puts "deploying #{adapter_name} to #{stage.name} for environment #{stage.node_env}"
|
24
|
-
puts "deploying via: #{options[:deploy_via]}"
|
25
|
-
|
26
|
-
|
27
|
-
base_dir = "/apps/compoundbank/s_cme/apps/event_hub"
|
28
|
-
|
29
|
-
|
30
|
-
if options[:deploy_via] == 'scp'
|
31
|
-
cached_copy_dir = File.join(base_dir, 'eh-cached-copy-scp')
|
32
|
-
else
|
33
|
-
cached_copy_dir = File.join(base_dir, 'eh-cached-copy-scm')
|
34
|
-
end
|
35
|
-
|
36
|
-
adapter_cached_copy = File.join(cached_copy_dir, 'mule', "#{adapter_name}.zip")
|
37
|
-
config_source_dir = File.join(base_dir, 'config', 'mule', adapter_name)
|
38
|
-
|
39
|
-
# TODO: move to common place for all commands
|
40
|
-
scm_username = 'deploy'
|
41
|
-
scm_password = 'deploy2014!'
|
42
|
-
scm_base_url = "https://whistler.plan.io/svn/eventhub"
|
43
|
-
repository = "#{scm_base_url}/branches/master/releases"
|
44
|
-
|
45
|
-
Deployer::Executor.new(stage, verbose: options[:verbose]) do |executor|
|
46
|
-
# create required directories
|
47
|
-
executor.execute("mkdir -p #{base_dir}")
|
48
|
-
executor.execute("rm -rf #{cached_copy_dir}")
|
49
|
-
|
50
|
-
if options[:deploy_via] == 'scp'
|
51
|
-
# upload pre-packaged processor via scp
|
52
|
-
source = "#{Eh::Settings.current.releases_dir}/mule/#{adapter_name}.zip"
|
53
|
-
raise ArgumentError, "#{adapter_name} does not seem to exist, no file to read at #{source}" if !File.readable?(source)
|
54
|
-
executor.upload(source, adapter_cached_copy)
|
11
|
+
begin
|
12
|
+
if args[0]
|
13
|
+
adapter_names = args[0].split(',').map(&:strip)
|
55
14
|
else
|
56
|
-
|
57
|
-
executor.execute(co_line)
|
15
|
+
adapter_names = nil
|
58
16
|
end
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
# deploy
|
65
|
-
executor.execute("cp #{adapter_cached_copy} $MULE_HOME/apps")
|
17
|
+
Deployer::MuleDeployer.new(adapter_names, options).deploy!
|
18
|
+
rescue => e
|
19
|
+
puts e.message
|
20
|
+
puts e.backtrace.join("\n")
|
66
21
|
end
|
67
22
|
end
|
68
23
|
end
|
@@ -1,87 +1,25 @@
|
|
1
1
|
desc 'deploy a single ruby processor'
|
2
|
-
arg_name 'processor_name
|
2
|
+
arg_name '[processor_name,[other_processor_name,pattern*]]'
|
3
3
|
|
4
4
|
command :deploy_ruby do |c|
|
5
|
-
c.flag([:
|
6
|
-
c.flag([:deploy_via], desc:
|
5
|
+
c.flag([:stage], desc: 'stage', type: String, long_desc: 'Stage where processor is deployed to', default_value: 'development')
|
6
|
+
c.flag([:deploy_via], desc: 'how to get hold of the processor: scm or scp', type: String, long_desc: 'copy the processor zip file via scp from this machine or check it out from scm', default_value: 'scp')
|
7
|
+
c.flag([:branch], desc: 'branch', type: String, long_desc: 'What branch to deploy. Only when deploy_via=scm', default_value: 'master')
|
8
|
+
c.flag([:tag], desc: 'tag', type: String, long_desc: 'What tag to deploy. Only when deploy_via=scm', default_value: nil)
|
7
9
|
|
8
|
-
c.switch([:v, :verbose], :desc =>
|
10
|
+
c.switch([:v, :verbose], :desc => 'Show additional output.')
|
9
11
|
|
10
12
|
c.action do |global_options, options, args|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
exit -1
|
15
|
-
end
|
16
|
-
|
17
|
-
processor_name = args[0]
|
18
|
-
stage_path = File.join(Eh::Settings.current.stages_dir, "#{options[:stage]}.yml")
|
19
|
-
stage = Deployer::Stage.load(stage_path)
|
20
|
-
|
21
|
-
|
22
|
-
puts "deploying #{processor_name} to #{stage.name} for environment #{stage.node_env}"
|
23
|
-
puts "deploying via: #{options[:deploy_via]}"
|
24
|
-
|
25
|
-
|
26
|
-
base_dir = "/apps/compoundbank/s_cme/apps/event_hub"
|
27
|
-
logs_dir = File.join(base_dir, 'shared', 'logs')
|
28
|
-
pids_dir = File.join(base_dir, 'shared', 'pids')
|
29
|
-
|
30
|
-
|
31
|
-
if options[:deploy_via] == 'scp'
|
32
|
-
cached_copy_dir = File.join(base_dir, 'eh-cached-copy-scp')
|
33
|
-
else
|
34
|
-
cached_copy_dir = File.join(base_dir, 'eh-cached-copy-scm')
|
35
|
-
end
|
36
|
-
|
37
|
-
current_dir = File.join(base_dir, 'eh-current')
|
38
|
-
|
39
|
-
processor_dir = File.join(current_dir, 'ruby', processor_name)
|
40
|
-
config_source_dir = File.join(base_dir, 'config', 'ruby', processor_name)
|
41
|
-
|
42
|
-
# TODO: move to common place
|
43
|
-
scm_username = 'deploy'
|
44
|
-
scm_password = 'deploy2014!'
|
45
|
-
scm_base_url = "https://whistler.plan.io/svn/eventhub"
|
46
|
-
repository = "#{scm_base_url}/branches/master/releases"
|
47
|
-
|
48
|
-
Deployer::Executor.new(stage, verbose: options[:verbose]) do |executor|
|
49
|
-
# create required directories
|
50
|
-
executor.execute("mkdir -p #{base_dir} ; mkdir -p #{logs_dir} ; mkdir -p #{File.join(current_dir, 'ruby')} ; mkdir -p #{File.join(cached_copy_dir, 'ruby')}")
|
51
|
-
|
52
|
-
if options[:deploy_via] == 'scp'
|
53
|
-
# upload pre-packaged processor via scp
|
54
|
-
source = "#{Eh::Settings.current.releases_dir}/ruby/#{processor_name}.zip"
|
55
|
-
target = File.join(cached_copy_dir, 'ruby', "#{processor_name}.zip")
|
56
|
-
executor.upload(source, target)
|
13
|
+
begin
|
14
|
+
if args[0]
|
15
|
+
processor_names = args[0].split(',').map(&:strip)
|
57
16
|
else
|
58
|
-
|
59
|
-
executor.execute(co_line)
|
17
|
+
processor_names = nil
|
60
18
|
end
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
executor.execute("unzip -o -d #{source} #{target}")
|
66
|
-
|
67
|
-
# copy config
|
68
|
-
executor.execute("if [[ -d #{config_source_dir} ]] ; then cp -r #{config_source_dir}/* #{processor_dir}; fi")
|
69
|
-
|
70
|
-
# symlink log dir
|
71
|
-
executor.execute("ln -s #{logs_dir} #{File.join(processor_dir, 'logs')}")
|
72
|
-
|
73
|
-
# symlink pids dir
|
74
|
-
executor.execute("ln -s #{pids_dir} #{File.join(processor_dir, 'pids')}")
|
75
|
-
|
76
|
-
# install gems
|
77
|
-
executor.execute("cd #{processor_dir} && bundle install --without test")
|
78
|
-
|
79
|
-
# stop old one
|
80
|
-
executor.execute("kill -s TERM $(cat #{File.join(pids_dir, processor_name)}.pid)", abort_on_error: false, comment: "This is not sooo important")
|
81
|
-
|
82
|
-
# start new one
|
83
|
-
executor.execute("cd #{processor_dir} && bundle exec ruby #{processor_name}.rb -d --environment=#{stage.node_env}")
|
19
|
+
Deployer::RubyDeployer.new(processor_names, options).deploy!
|
20
|
+
rescue => e
|
21
|
+
puts e.message
|
22
|
+
puts e.backtrace.join("\n")
|
84
23
|
end
|
85
|
-
|
86
24
|
end
|
87
25
|
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
desc 'list the available stages'
|
2
|
+
|
3
|
+
command :list_stages do |c|
|
4
|
+
#c.flag([:branch], desc: 'branch', type: String, long_desc: 'What branch to deploy. Only when deploy_via=scm', default_value: 'master')
|
5
|
+
#c.flag([:tag], desc: 'tag', type: String, long_desc: 'What tag to deploy. Only when deploy_via=scm', default_value: nil)
|
6
|
+
|
7
|
+
c.switch([:v, :verbose], :desc => 'Show additional output.')
|
8
|
+
|
9
|
+
c.action do |global_options, options, args|
|
10
|
+
dir = Eh::Settings.current.stages_dir
|
11
|
+
puts "Checking in #{dir}".green if options[:verbose]
|
12
|
+
puts "Available stages are:".blue
|
13
|
+
Dir.glob(File.join(dir, '*.yml')) do |name|
|
14
|
+
puts "#{File.basename(name, '.*')}".light_blue
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -1,5 +1,5 @@
|
|
1
1
|
desc 'Packages processors to zip files'
|
2
|
-
command :
|
2
|
+
command :package_ruby do |c|
|
3
3
|
c.flag([:x, :exclude], :desc => "Exclude processors by name.", :type => Array, :long_desc => "You can specify multiple processors by providing a comma-separated list.")
|
4
4
|
c.flag([:p, :processors], :desc => "Specify what processors to package", :type => Array, :long_desc => "You can specify multiple processors by providing a comma-separated list.")
|
5
5
|
c.flag([:d, :destination], :desc => "Destination directory to place created zip files.", :default_value => Eh::Settings.current.ruby_release_dir)
|
@@ -0,0 +1,71 @@
|
|
1
|
+
desc "manage repositories"
|
2
|
+
|
3
|
+
command :repository do |command|
|
4
|
+
command.desc "Lists all avaiable repositories"
|
5
|
+
command.command :list do |command|
|
6
|
+
command.action do |global_options,options,args|
|
7
|
+
Eh::Settings.current.repositories.each_with_index do |repository, index|
|
8
|
+
if repository.current?
|
9
|
+
puts "#{index + 1}: #{repository.url} (current)"
|
10
|
+
else
|
11
|
+
puts "#{index + 1}: #{repository.url}"
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
command.desc "selects a repository: eh repository select INDEX"
|
18
|
+
command.command :select do |command|
|
19
|
+
command.action do |global_options,options,args|
|
20
|
+
if Eh::Settings.current.repositories.length == 0
|
21
|
+
raise "No repository configured so far"
|
22
|
+
end
|
23
|
+
if args.length != 1
|
24
|
+
raise "Need exactly 1 arguments: index"
|
25
|
+
end
|
26
|
+
selected = args[0].to_i
|
27
|
+
puts "Will select #{args[0]}"
|
28
|
+
Eh::Settings.current.data['repositories'].each_with_index do |repository, index|
|
29
|
+
repository['current'] = (index + 1) == selected
|
30
|
+
end
|
31
|
+
Eh::Settings.current.write
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
command.desc 'add a repository to the config: eh repository add URL DIR USERNAME PASSWORD'
|
36
|
+
command.command :add do |command|
|
37
|
+
command.action do |global_options, options, args|
|
38
|
+
if args.length != 4
|
39
|
+
raise "Need exactly 4 arguments: URL, DIR, USERNAME, PASSWORD"
|
40
|
+
end
|
41
|
+
Eh::Settings.current.data['repositories'] ||= []
|
42
|
+
Eh::Settings.current.data['repositories'] << {
|
43
|
+
'url' => args[0],
|
44
|
+
'dir' => args[1],
|
45
|
+
'deploy_username' => args[2],
|
46
|
+
'deploy_password' => args[3],
|
47
|
+
'current' => (Eh::Settings.current.data['repositories'].length == 0)
|
48
|
+
}
|
49
|
+
Eh::Settings.current.write
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
|
54
|
+
command.desc 'remove a repository from the config: eh repository remove INDEX'
|
55
|
+
command.command :remove do |command|
|
56
|
+
command.action do |global_options, options, args|
|
57
|
+
|
58
|
+
if args.length != 1
|
59
|
+
raise "Need exactly 1 arguments: index"
|
60
|
+
end
|
61
|
+
selected = args[0].to_i
|
62
|
+
|
63
|
+
if Eh::Settings.current.repositories[selected - 1].nil?
|
64
|
+
raise "No repository with index #{selected}"
|
65
|
+
end
|
66
|
+
|
67
|
+
Eh::Settings.current.data['repositories'].delete_at(selected - 1)
|
68
|
+
Eh::Settings.current.write
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
data/lib/eh/settings.rb
CHANGED
@@ -1,9 +1,46 @@
|
|
1
1
|
class Eh::Settings
|
2
|
-
|
2
|
+
|
3
|
+
attr_reader :data, :file
|
4
|
+
|
5
|
+
class Repository
|
6
|
+
def initialize(json)
|
7
|
+
@json = json
|
8
|
+
end
|
9
|
+
|
10
|
+
def url
|
11
|
+
@json['url']
|
12
|
+
end
|
13
|
+
|
14
|
+
def deploy_username
|
15
|
+
@json['deploy_username']
|
16
|
+
end
|
17
|
+
|
18
|
+
def deploy_password
|
19
|
+
@json['deploy_password']
|
20
|
+
end
|
21
|
+
|
22
|
+
def dir
|
23
|
+
@json['dir']
|
24
|
+
end
|
25
|
+
|
26
|
+
def current?
|
27
|
+
@json['current']
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def initialize(file)
|
32
|
+
@file = file
|
33
|
+
@data = JSON.parse(File.read(file))
|
34
|
+
end
|
35
|
+
|
3
36
|
def self.load(file)
|
4
|
-
|
5
|
-
|
6
|
-
|
37
|
+
Eh::Settings.new(file)
|
38
|
+
end
|
39
|
+
|
40
|
+
def write
|
41
|
+
File.open(file,"w") do |f|
|
42
|
+
f.write(data.to_json)
|
43
|
+
end
|
7
44
|
end
|
8
45
|
|
9
46
|
def self.current=(value)
|
@@ -14,40 +51,44 @@ class Eh::Settings
|
|
14
51
|
Thread.current[:eh_settings]
|
15
52
|
end
|
16
53
|
|
17
|
-
def
|
18
|
-
|
54
|
+
def repository
|
55
|
+
repositories.find do |repository|
|
56
|
+
repository.current?
|
57
|
+
end if repositories
|
19
58
|
end
|
20
59
|
|
21
|
-
def
|
22
|
-
|
60
|
+
def repositories
|
61
|
+
data["repositories"].map do |json|
|
62
|
+
Eh::Settings::Repository.new(json)
|
63
|
+
end if data["repositories"]
|
23
64
|
end
|
24
65
|
|
25
|
-
def releases_dir
|
26
|
-
File.join(
|
66
|
+
def releases_dir(*extra_paths)
|
67
|
+
File.join(repository.dir, 'releases', *extra_paths)
|
27
68
|
end
|
28
69
|
|
29
70
|
def rails_release_dir
|
30
|
-
|
71
|
+
releases_dir('rails')
|
31
72
|
end
|
32
73
|
|
33
74
|
def ruby_release_dir
|
34
|
-
|
75
|
+
releases_dir('ruby')
|
35
76
|
end
|
36
77
|
|
37
78
|
def processors_src_dir
|
38
|
-
File.join(
|
79
|
+
File.join(repository.dir, 'src', 'ruby')
|
39
80
|
end
|
40
81
|
|
41
82
|
def deployment_dir
|
42
|
-
File.join(
|
83
|
+
File.join(repository.dir, 'src', 'deployment')
|
43
84
|
end
|
44
85
|
|
45
86
|
def rails_src_dir
|
46
|
-
File.join(
|
87
|
+
File.join(repository.dir, 'src', 'rails', 'console')
|
47
88
|
end
|
48
89
|
|
49
90
|
def source_config_dir
|
50
|
-
File.join(
|
91
|
+
File.join(repository.dir, 'config')
|
51
92
|
end
|
52
93
|
|
53
94
|
def processor_template_repository_url
|
@@ -67,6 +108,6 @@ class Eh::Settings
|
|
67
108
|
end
|
68
109
|
|
69
110
|
def stages_dir
|
70
|
-
File.
|
111
|
+
File.join(repository.dir, 'config', 'stages')
|
71
112
|
end
|
72
113
|
end
|
data/lib/eh/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: eventhub-command
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Pascal Betz
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2015-02-12 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rake
|
@@ -142,22 +142,25 @@ files:
|
|
142
142
|
- bin/eh
|
143
143
|
- eh.gemspec
|
144
144
|
- eh.rdoc
|
145
|
-
- features/eh.feature
|
146
|
-
- features/step_definitions/eh_steps.rb
|
147
|
-
- features/support/env.rb
|
148
145
|
- lib/deployer.rb
|
146
|
+
- lib/deployer/base_deployer.rb
|
147
|
+
- lib/deployer/config_deployer.rb
|
149
148
|
- lib/deployer/executor.rb
|
149
|
+
- lib/deployer/mule_deployer.rb
|
150
150
|
- lib/deployer/net_ssh_extension.rb
|
151
|
+
- lib/deployer/ruby_deployer.rb
|
151
152
|
- lib/deployer/stage.rb
|
152
153
|
- lib/eh-commands.rb
|
153
154
|
- lib/eh.rb
|
154
155
|
- lib/eh/commands/copy_config.rb
|
155
156
|
- lib/eh/commands/deploy.rb
|
157
|
+
- lib/eh/commands/deploy_config.rb
|
156
158
|
- lib/eh/commands/deploy_mule.rb
|
157
159
|
- lib/eh/commands/deploy_ruby.rb
|
158
160
|
- lib/eh/commands/generate_processor.rb
|
159
|
-
- lib/eh/commands/
|
160
|
-
- lib/eh/commands/
|
161
|
+
- lib/eh/commands/list_stages.rb
|
162
|
+
- lib/eh/commands/package_ruby.rb
|
163
|
+
- lib/eh/commands/repository.rb
|
161
164
|
- lib/eh/settings.rb
|
162
165
|
- lib/eh/version.rb
|
163
166
|
- test/default_test.rb
|
data/features/eh.feature
DELETED
data/features/support/env.rb
DELETED
@@ -1,15 +0,0 @@
|
|
1
|
-
require 'aruba/cucumber'
|
2
|
-
|
3
|
-
ENV['PATH'] = "#{File.expand_path(File.dirname(__FILE__) + '/../../bin')}#{File::PATH_SEPARATOR}#{ENV['PATH']}"
|
4
|
-
LIB_DIR = File.join(File.expand_path(File.dirname(__FILE__)),'..','..','lib')
|
5
|
-
|
6
|
-
Before do
|
7
|
-
# Using "announce" causes massive warnings on 1.9.2
|
8
|
-
@puts = true
|
9
|
-
@original_rubylib = ENV['RUBYLIB']
|
10
|
-
ENV['RUBYLIB'] = LIB_DIR + File::PATH_SEPARATOR + ENV['RUBYLIB'].to_s
|
11
|
-
end
|
12
|
-
|
13
|
-
After do
|
14
|
-
ENV['RUBYLIB'] = @original_rubylib
|
15
|
-
end
|
@@ -1,68 +0,0 @@
|
|
1
|
-
desc 'Packages Rails Console to zip file'
|
2
|
-
command :package_rails do |c|
|
3
|
-
c.flag([:d, :destination], :desc => "Destination directory to place created zip file.", :default_value => Eh::Settings.current.rails_release_dir)
|
4
|
-
c.flag([:s, :source], :desc => "Source directory to read rails console from.", :default_value => Eh::Settings.current.rails_src_dir)
|
5
|
-
|
6
|
-
c.action do |global_options, options, args|
|
7
|
-
source_dir = options['s']
|
8
|
-
destination_dir = options['d']
|
9
|
-
|
10
|
-
skip_files = ["#{source_dir}/config/database.yml"]
|
11
|
-
|
12
|
-
puts "Will package rails console from #{source_dir} to #{destination_dir}"
|
13
|
-
|
14
|
-
console = Dir["#{source_dir}"]
|
15
|
-
|
16
|
-
FileUtils.mkdir_p(destination_dir)
|
17
|
-
|
18
|
-
zipfile_name = File.join(destination_dir, "console.zip")
|
19
|
-
directory = source_dir
|
20
|
-
|
21
|
-
# remove zip before we create a new one
|
22
|
-
FileUtils.rm zipfile_name, :force => true
|
23
|
-
|
24
|
-
Zip::File.open(zipfile_name, Zip::File::CREATE) do |zipfile|
|
25
|
-
|
26
|
-
#zipfile.add(processor_name, directory)
|
27
|
-
[directory].each do |file_to_be_zipped|
|
28
|
-
if File.directory?(file_to_be_zipped)
|
29
|
-
# should skip directories
|
30
|
-
next if options["directories-skip"]
|
31
|
-
|
32
|
-
directory = file_to_be_zipped
|
33
|
-
puts "zipper: archiving directory: #{directory}"
|
34
|
-
directory_chosen_pathname = options["directories-recursively-splat"] ? directory : File.dirname(directory)
|
35
|
-
directory_pathname = Pathname.new(directory_chosen_pathname)
|
36
|
-
files = Dir[File.join(directory, '**', '**')]
|
37
|
-
|
38
|
-
files.delete_if do |filename|
|
39
|
-
["#{source_dir}/log", "#{source_dir}/logs", "#{source_dir}/exceptions", "#{source_dir}/tmp"].any? do |prefix|
|
40
|
-
filename.start_with?(prefix)
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
files.each do |file|
|
45
|
-
if skip_files.include? file
|
46
|
-
puts "skipping #{file}"
|
47
|
-
next
|
48
|
-
end
|
49
|
-
|
50
|
-
file_pathname = Pathname.new(file)
|
51
|
-
file_relative_pathname = file_pathname.relative_path_from(directory_pathname)
|
52
|
-
zipfile.add(file_relative_pathname,file)
|
53
|
-
end
|
54
|
-
|
55
|
-
next
|
56
|
-
end
|
57
|
-
|
58
|
-
filename = File.basename(file_to_be_zipped)
|
59
|
-
|
60
|
-
puts "zipper: archiving #{file_to_be_zipped} as #{filename} into #{zipfile}"
|
61
|
-
|
62
|
-
zipfile.add(filename,file_to_be_zipped)
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
|
-
puts "Done packaging rails"
|
67
|
-
end
|
68
|
-
end
|