raystool 1.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/bin/__rays_exec.rb +31 -0
- data/bin/__rays_init +79 -0
- data/lib/rays/config/backup.rb +42 -0
- data/lib/rays/config/configuration.rb +376 -0
- data/lib/rays/config/environment.rb +73 -0
- data/lib/rays/config/templates/global/global.yml +3 -0
- data/lib/rays/config/templates/global/scripts/rays +187 -0
- data/lib/rays/config/templates/project/.rays +0 -0
- data/lib/rays/config/templates/project/config/environment.yml +68 -0
- data/lib/rays/config/templates/project/config/project.yml +4 -0
- data/lib/rays/core.rb +128 -0
- data/lib/rays/exceptions/rays_exception.rb +25 -0
- data/lib/rays/interface/commander.rb +394 -0
- data/lib/rays/interface/controller.rb +365 -0
- data/lib/rays/loaders/highline.rb +24 -0
- data/lib/rays/loaders/logging.rb +60 -0
- data/lib/rays/models/appmodule/base.rb +185 -0
- data/lib/rays/models/appmodule/content.rb +35 -0
- data/lib/rays/models/appmodule/ext.rb +36 -0
- data/lib/rays/models/appmodule/hook.rb +36 -0
- data/lib/rays/models/appmodule/layout.rb +36 -0
- data/lib/rays/models/appmodule/manager.rb +130 -0
- data/lib/rays/models/appmodule/portlet.rb +36 -0
- data/lib/rays/models/appmodule/servicebuilder.rb +36 -0
- data/lib/rays/models/appmodule/theme.rb +36 -0
- data/lib/rays/models/project.rb +116 -0
- data/lib/rays/servers/base.rb +70 -0
- data/lib/rays/servers/database.rb +73 -0
- data/lib/rays/servers/liferay.rb +64 -0
- data/lib/rays/servers/solr.rb +111 -0
- data/lib/rays/services/application_service.rb +116 -0
- data/lib/rays/services/backup_service.rb +94 -0
- data/lib/rays/services/database.rb +59 -0
- data/lib/rays/services/remote.rb +75 -0
- data/lib/rays/services/scm.rb +92 -0
- data/lib/rays/services/sync.rb +90 -0
- data/lib/rays/utils/common_utils.rb +153 -0
- data/lib/rays/utils/file_utils.rb +118 -0
- data/lib/rays/utils/network_utils.rb +50 -0
- data/lib/rays/workers/base.rb +134 -0
- data/lib/rays/workers/builder.rb +63 -0
- data/lib/rays/workers/cleaner.rb +42 -0
- data/lib/rays/workers/deployer.rb +92 -0
- data/lib/rays/workers/generator.rb +49 -0
- metadata +175 -0
@@ -0,0 +1,153 @@
|
|
1
|
+
=begin
|
2
|
+
Copyright (c) 2012 Dmitri Carpov
|
3
|
+
|
4
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
5
|
+
a copy of this software and associated documentation files (the
|
6
|
+
"Software"), to deal in the Software without restriction, including
|
7
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
8
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
9
|
+
permit persons to whom the Software is furnished to do so, subject to
|
10
|
+
the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be
|
13
|
+
included in all copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
16
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
17
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
18
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
19
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
20
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
21
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
22
|
+
=end
|
23
|
+
|
24
|
+
#
|
25
|
+
# 1. Execution pointcuts
|
26
|
+
# 2. General use methods
|
27
|
+
#
|
28
|
+
|
29
|
+
# 1. Execution pointcuts
|
30
|
+
|
31
|
+
#
|
32
|
+
# Execute a given block and process any exception with a proper logging.
|
33
|
+
#
|
34
|
+
def log_block(message)
|
35
|
+
begin
|
36
|
+
yield
|
37
|
+
rescue RaysException => e
|
38
|
+
$log.error(e)
|
39
|
+
$log.debug("#{e}:\tBacktrace:\r\n#{e.backtrace.join("\r\n")}")
|
40
|
+
raise e
|
41
|
+
rescue => e
|
42
|
+
$log.error("Cannot #{message}.")
|
43
|
+
$log.debug("#{e}:\tBacktrace:\r\n#{e.backtrace.join("\r\n")}")
|
44
|
+
raise e
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
#
|
49
|
+
# Wrap a given block with progress information.
|
50
|
+
#
|
51
|
+
def task(start_message, done_message, failed_message)
|
52
|
+
begin
|
53
|
+
$log.info("<!#{start_message}!>")
|
54
|
+
yield
|
55
|
+
$log.info(done_message)
|
56
|
+
rescue => e
|
57
|
+
$log.error("#{failed_message}\nreason: #{e.message}")
|
58
|
+
$log.debug("#{e}.:\tBacktrace:\r\n#{e.backtrace.join("\r\n")}")
|
59
|
+
raise e
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
#
|
64
|
+
# Block console output for a given block.
|
65
|
+
#
|
66
|
+
def silent
|
67
|
+
begin
|
68
|
+
orig_stdout = $stdout.dup # does a dup2() internally
|
69
|
+
$stdout.reopen('/dev/null', 'w')
|
70
|
+
yield
|
71
|
+
ensure
|
72
|
+
$stdout.reopen(orig_stdout)
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
|
77
|
+
# 2. General use methods
|
78
|
+
|
79
|
+
#
|
80
|
+
# Execute OS command.
|
81
|
+
#
|
82
|
+
def rays_exec(command)
|
83
|
+
success = false
|
84
|
+
if $log.debug?
|
85
|
+
success = system command
|
86
|
+
else
|
87
|
+
silent { success = system command }
|
88
|
+
end
|
89
|
+
raise RaysException.new("Failed to execute: #{command}") unless success
|
90
|
+
success
|
91
|
+
end
|
92
|
+
|
93
|
+
#
|
94
|
+
# Safe execute. Use it for user input commands.
|
95
|
+
#
|
96
|
+
def rays_safe_exec(command, *args)
|
97
|
+
SafeShell.execute(command, *args)
|
98
|
+
end
|
99
|
+
|
100
|
+
#
|
101
|
+
# Execute a given code a directory.
|
102
|
+
#
|
103
|
+
def in_directory(directory)
|
104
|
+
original_directory = Dir.pwd
|
105
|
+
Dir.chdir(directory) if Dir.exist?(directory)
|
106
|
+
begin
|
107
|
+
yield
|
108
|
+
ensure
|
109
|
+
Dir.chdir(original_directory)
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
#
|
114
|
+
# Execute a given command while liferay service is stopped.
|
115
|
+
#
|
116
|
+
def service_safe(stop = true)
|
117
|
+
environment = $rays_config.environment
|
118
|
+
if stop and environment.liferay.service.alive?
|
119
|
+
environment.liferay.service.stop
|
120
|
+
yield
|
121
|
+
environment.liferay.service.start
|
122
|
+
else
|
123
|
+
yield
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
#
|
128
|
+
# In local environment
|
129
|
+
#
|
130
|
+
def in_local_environment
|
131
|
+
original_environment_name = $rays_config.environment.name
|
132
|
+
begin
|
133
|
+
$rays_config.environment = 'local'
|
134
|
+
yield
|
135
|
+
ensure
|
136
|
+
$rays_config.environment = original_environment_name
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
#
|
141
|
+
# Create a missing option string
|
142
|
+
#
|
143
|
+
def missing_environment_option(name, option)
|
144
|
+
"#{name} does not contain #{option} information. see config/environment.yml"
|
145
|
+
end
|
146
|
+
|
147
|
+
#
|
148
|
+
# Check if command in the PATH
|
149
|
+
#
|
150
|
+
def command?(command)
|
151
|
+
system("which #{ command} > /dev/null 2>&1")
|
152
|
+
end
|
153
|
+
|
@@ -0,0 +1,118 @@
|
|
1
|
+
=begin
|
2
|
+
Copyright (c) 2012 Dmitri Carpov
|
3
|
+
|
4
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
5
|
+
a copy of this software and associated documentation files (the
|
6
|
+
"Software"), to deal in the Software without restriction, including
|
7
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
8
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
9
|
+
permit persons to whom the Software is furnished to do so, subject to
|
10
|
+
the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be
|
13
|
+
included in all copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
16
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
17
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
18
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
19
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
20
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
21
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
22
|
+
=end
|
23
|
+
|
24
|
+
module Rays
|
25
|
+
module Utils
|
26
|
+
module FileUtils
|
27
|
+
#
|
28
|
+
# Get parent path from a given path
|
29
|
+
#
|
30
|
+
def self.parent dir
|
31
|
+
return nil unless Dir.exists?(dir)
|
32
|
+
Pathname.new(dir).parent.to_s
|
33
|
+
end
|
34
|
+
|
35
|
+
#
|
36
|
+
# Find a file specified by regexp in a given directory recursively down.
|
37
|
+
#
|
38
|
+
def self.find_down dir, file
|
39
|
+
files = []
|
40
|
+
if Dir.exist?(dir)
|
41
|
+
Find.find(dir) do |file_path|
|
42
|
+
next unless file_path.match(file)
|
43
|
+
files << file_path
|
44
|
+
end
|
45
|
+
end
|
46
|
+
files
|
47
|
+
end
|
48
|
+
|
49
|
+
#
|
50
|
+
# Find a parent directory which contains a given file name (no patterns allowed)
|
51
|
+
#
|
52
|
+
def self.find_up file, dir = Dir.pwd, limit = '/'
|
53
|
+
return nil if dir.eql? limit or !dir.start_with?(limit)
|
54
|
+
return dir unless Dir.new(dir).find_index(file).nil?
|
55
|
+
find_up file, Pathname.new(dir).parent.to_s, limit
|
56
|
+
end
|
57
|
+
|
58
|
+
#
|
59
|
+
# Get list of child directory names of a given directory.
|
60
|
+
# Goes one level down only.
|
61
|
+
#
|
62
|
+
def self.find_directories path, hidden=false
|
63
|
+
dirs = []
|
64
|
+
Dir.glob("#{path}/*/").each do |dir|
|
65
|
+
dirs << File.basename(dir)
|
66
|
+
end
|
67
|
+
if hidden
|
68
|
+
Dir.glob("#{path}/.*/").each do |dir|
|
69
|
+
basename = File.basename(dir)
|
70
|
+
dirs << File.basename(dir) if basename != '.' and basename != '..'
|
71
|
+
end
|
72
|
+
end
|
73
|
+
dirs
|
74
|
+
end
|
75
|
+
|
76
|
+
#
|
77
|
+
# YamlFile allows to work with java .properties files as a ruby hash
|
78
|
+
#
|
79
|
+
class YamlFile
|
80
|
+
attr_reader :properties
|
81
|
+
|
82
|
+
def initialize(file)
|
83
|
+
@file_name = file
|
84
|
+
@properties = {}
|
85
|
+
@properties = YAML::load_file(File.open(@file_name)) || Hash.new
|
86
|
+
end
|
87
|
+
|
88
|
+
def write
|
89
|
+
File.open(@file_name, 'w') do |out|
|
90
|
+
YAML.dump(@properties, out)
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
#
|
96
|
+
# PropertiesFile allows to work with java .properties files as a ruby hash
|
97
|
+
#
|
98
|
+
class PropertiesFile
|
99
|
+
attr_reader :properties
|
100
|
+
|
101
|
+
def initialize file
|
102
|
+
@file_name = file
|
103
|
+
@properties = {}
|
104
|
+
file = File.open(@file_name, 'r')
|
105
|
+
IO.foreach(file) do |line|
|
106
|
+
@properties[$1.strip] = $2 if line =~ /([^=]*)=(.*)\/\/(.*)/ || line =~ /([^=]*)=(.*)/
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
def write
|
111
|
+
properties_file = File.new(@file_name, 'w+')
|
112
|
+
@properties.each { |key, value| properties_file.puts "#{key}=#{value}\n" }
|
113
|
+
properties_file.close
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
=begin
|
2
|
+
Copyright (c) 2012 Dmitri Carpov
|
3
|
+
|
4
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
5
|
+
a copy of this software and associated documentation files (the
|
6
|
+
"Software"), to deal in the Software without restriction, including
|
7
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
8
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
9
|
+
permit persons to whom the Software is furnished to do so, subject to
|
10
|
+
the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be
|
13
|
+
included in all copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
16
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
17
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
18
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
19
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
20
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
21
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
22
|
+
=end
|
23
|
+
|
24
|
+
module Rays
|
25
|
+
module Utils
|
26
|
+
class NetworkUtils
|
27
|
+
class << self
|
28
|
+
|
29
|
+
def port_open?(ip, port)
|
30
|
+
begin
|
31
|
+
Timeout::timeout(1) do
|
32
|
+
begin
|
33
|
+
s = TCPSocket.new(ip, port)
|
34
|
+
s.close
|
35
|
+
return true
|
36
|
+
rescue Errno::ECONNREFUSED, Errno::EHOSTUNREACH
|
37
|
+
return false
|
38
|
+
end
|
39
|
+
end
|
40
|
+
rescue Timeout::Error
|
41
|
+
return false
|
42
|
+
end
|
43
|
+
|
44
|
+
false
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,134 @@
|
|
1
|
+
=begin
|
2
|
+
Copyright (c) 2012 Dmitri Carpov
|
3
|
+
|
4
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
5
|
+
a copy of this software and associated documentation files (the
|
6
|
+
"Software"), to deal in the Software without restriction, including
|
7
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
8
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
9
|
+
permit persons to whom the Software is furnished to do so, subject to
|
10
|
+
the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be
|
13
|
+
included in all copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
16
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
17
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
18
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
19
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
20
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
21
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
22
|
+
=end
|
23
|
+
module Rays
|
24
|
+
module Worker
|
25
|
+
class Manager
|
26
|
+
include Singleton
|
27
|
+
|
28
|
+
def initialize
|
29
|
+
@workers = {}
|
30
|
+
end
|
31
|
+
|
32
|
+
def register(type, name, worker_class)
|
33
|
+
@workers[type] = {} if @workers[type].nil?
|
34
|
+
@workers[type][name] = worker_class
|
35
|
+
end
|
36
|
+
|
37
|
+
def create(type, name)
|
38
|
+
if !@workers[type].nil? and !@workers[type][name].nil?
|
39
|
+
@workers[type][name].instance
|
40
|
+
else
|
41
|
+
raise RaysException.new("Cannot find #{type} #{name}")
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
class BaseWorker
|
47
|
+
def self.register(type, name)
|
48
|
+
Manager.instance.register(type, name, self)
|
49
|
+
end
|
50
|
+
|
51
|
+
def execute(process, app_module)
|
52
|
+
if app_module.nil? or !Dir.exist?(app_module.path)
|
53
|
+
raise RaysException.new("Do not know how to #{process} <!#{app_module.inspect}!>")
|
54
|
+
end
|
55
|
+
|
56
|
+
in_directory(app_module.path) do
|
57
|
+
task("#{process} <!#{app_module.type} #{app_module.name}!>", "done", "failed") do
|
58
|
+
yield
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
class MavenUtil
|
65
|
+
class << self
|
66
|
+
def link_to_parent(module_pom)
|
67
|
+
check_parent_pom
|
68
|
+
add_parent_pom_to module_pom
|
69
|
+
end
|
70
|
+
|
71
|
+
private
|
72
|
+
def check_parent_pom
|
73
|
+
in_directory($rays_config.project_root) do
|
74
|
+
unless File.exists?('pom.xml')
|
75
|
+
builder = Nokogiri::XML::Builder.new do |xml|
|
76
|
+
xml.project {
|
77
|
+
xml.name Project.instance.name
|
78
|
+
xml.groupId Project.instance.package
|
79
|
+
xml.artifactId Project.instance.name
|
80
|
+
xml.version '1.0'
|
81
|
+
xml.packaging 'pom'
|
82
|
+
xml.properties {
|
83
|
+
xml << "<liferay.version>#{Project.instance.liferay}</liferay.version>"
|
84
|
+
}
|
85
|
+
}
|
86
|
+
end
|
87
|
+
|
88
|
+
File.open('pom.xml', 'w') do |file|
|
89
|
+
file.write(builder.to_xml)
|
90
|
+
end
|
91
|
+
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
def add_parent_pom_to(module_pom)
|
97
|
+
doc = Nokogiri::XML(open(module_pom), &:noblanks)
|
98
|
+
|
99
|
+
# remove generated liferay.version tags
|
100
|
+
properties_node = doc.css('properties')
|
101
|
+
unless properties_node.nil?
|
102
|
+
properties_node.children.each do |node|
|
103
|
+
if node.name == 'liferay.version'
|
104
|
+
node.remove
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
parent_node = Nokogiri::XML::Node.new('parent',doc)
|
110
|
+
|
111
|
+
group_id_node = Nokogiri::XML::Node.new('groupId',doc)
|
112
|
+
group_id_node.content = Project.instance.package
|
113
|
+
parent_node.add_child group_id_node
|
114
|
+
|
115
|
+
artifact_id_node = Nokogiri::XML::Node.new('artifactId',doc)
|
116
|
+
artifact_id_node.content = Project.instance.name
|
117
|
+
parent_node.add_child artifact_id_node
|
118
|
+
|
119
|
+
version_node = Nokogiri::XML::Node.new('version',doc)
|
120
|
+
version_node.content = '1.0'
|
121
|
+
parent_node.add_child version_node
|
122
|
+
|
123
|
+
relative_path_node = Nokogiri::XML::Node.new('relativePath',doc)
|
124
|
+
relative_path_node.content = '../../pom.xml'
|
125
|
+
parent_node.add_child relative_path_node
|
126
|
+
|
127
|
+
doc.root.children.first.add_previous_sibling parent_node
|
128
|
+
|
129
|
+
File.open(module_pom, 'w') { |file| file.write doc.to_xml }
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
=begin
|
2
|
+
Copyright (c) 2012 Dmitri Carpov
|
3
|
+
|
4
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
5
|
+
a copy of this software and associated documentation files (the
|
6
|
+
"Software"), to deal in the Software without restriction, including
|
7
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
8
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
9
|
+
permit persons to whom the Software is furnished to do so, subject to
|
10
|
+
the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be
|
13
|
+
included in all copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
16
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
17
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
18
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
19
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
20
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
21
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
22
|
+
=end
|
23
|
+
module Rays
|
24
|
+
module Worker
|
25
|
+
module Builder
|
26
|
+
|
27
|
+
# Maven builder
|
28
|
+
class Maven < BaseWorker
|
29
|
+
register :builder, :maven
|
30
|
+
include Singleton
|
31
|
+
|
32
|
+
def build(app_module, skip_test = false)
|
33
|
+
execute('build', app_module) do
|
34
|
+
test_args = ''
|
35
|
+
test_args = '-Dmaven.skip.tests=true' if skip_test
|
36
|
+
|
37
|
+
rays_exec("#{$rays_config.mvn} clean package #{test_args}")
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
# Content builder
|
43
|
+
class Content < BaseWorker
|
44
|
+
register :builder, :content_sync
|
45
|
+
include Singleton
|
46
|
+
|
47
|
+
def build(app_module, skip_test = false)
|
48
|
+
execute('build', app_module) do
|
49
|
+
# replace liferay server port
|
50
|
+
properties_file = Rays::Utils::FileUtils::PropertiesFile.new "#{app_module.path}/src/main/resources/configuration.properties"
|
51
|
+
properties_file.properties['server.port'] = $rays_config.environment.liferay.port
|
52
|
+
properties_file.write
|
53
|
+
|
54
|
+
test_args = ''
|
55
|
+
test_args = '-Dmaven.skip.tests=true' if skip_test
|
56
|
+
|
57
|
+
rays_exec("cd #{app_module.path} && #{$rays_config.mvn} clean assembly:single package #{test_args}")
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
=begin
|
2
|
+
Copyright (c) 2012 Dmitri Carpov
|
3
|
+
|
4
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
5
|
+
a copy of this software and associated documentation files (the
|
6
|
+
"Software"), to deal in the Software without restriction, including
|
7
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
8
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
9
|
+
permit persons to whom the Software is furnished to do so, subject to
|
10
|
+
the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be
|
13
|
+
included in all copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
16
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
17
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
18
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
19
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
20
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
21
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
22
|
+
=end
|
23
|
+
module Rays
|
24
|
+
module Worker
|
25
|
+
module Cleaner
|
26
|
+
|
27
|
+
# Maven cleaner
|
28
|
+
class Maven < BaseWorker
|
29
|
+
register :cleaner, :maven
|
30
|
+
|
31
|
+
include Singleton
|
32
|
+
|
33
|
+
def clean(app_module)
|
34
|
+
execute('clean', app_module) do
|
35
|
+
rays_exec("#{$rays_config.mvn} clean")
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,92 @@
|
|
1
|
+
=begin
|
2
|
+
Copyright (c) 2012 Dmitri Carpov
|
3
|
+
|
4
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
5
|
+
a copy of this software and associated documentation files (the
|
6
|
+
"Software"), to deal in the Software without restriction, including
|
7
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
8
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
9
|
+
permit persons to whom the Software is furnished to do so, subject to
|
10
|
+
the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be
|
13
|
+
included in all copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
16
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
17
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
18
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
19
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
20
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
21
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
22
|
+
=end
|
23
|
+
require 'net/ssh'
|
24
|
+
|
25
|
+
module Rays
|
26
|
+
module Worker
|
27
|
+
module Deployer
|
28
|
+
|
29
|
+
# Maven deployer
|
30
|
+
class Maven < BaseWorker
|
31
|
+
register :deployer, :maven
|
32
|
+
|
33
|
+
include Singleton
|
34
|
+
|
35
|
+
def deploy(app_module)
|
36
|
+
execute('deploy', app_module) do
|
37
|
+
env = $rays_config.environment
|
38
|
+
Rays::Utils::FileUtils.find_down("./", '.*\\.war$').each do |file_to_deploy|
|
39
|
+
if env.liferay.remote?
|
40
|
+
env.liferay.remote.copy_to(file_to_deploy, env.liferay.deploy_directory)
|
41
|
+
else
|
42
|
+
FileUtils.cp(file_to_deploy, env.liferay.deploy_directory)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
# Content deployer
|
50
|
+
class Content < BaseWorker
|
51
|
+
register :deployer, :content_sync
|
52
|
+
|
53
|
+
include Singleton
|
54
|
+
|
55
|
+
def deploy(app_module)
|
56
|
+
execute('deploy', app_module) do
|
57
|
+
env = $rays_config.environment
|
58
|
+
base_filenames = []
|
59
|
+
deploy_dir = "/tmp/content_sync"
|
60
|
+
if env.liferay.remote?
|
61
|
+
env.liferay.remote.exec("rm -rf #{deploy_dir} && mkdir #{deploy_dir}")
|
62
|
+
else
|
63
|
+
rays_exec("rm -rf #{deploy_dir} && mkdir #{deploy_dir}")
|
64
|
+
end
|
65
|
+
Rays::Utils::FileUtils.find_down("./target/", '.*\\.jar$').each do |file|
|
66
|
+
if env.liferay.remote?
|
67
|
+
env.liferay.remote.copy_to(file, deploy_dir)
|
68
|
+
else
|
69
|
+
FileUtils.cp(file, env.liferay.deploy_directory)
|
70
|
+
end
|
71
|
+
base_filenames << File.basename(file)
|
72
|
+
end
|
73
|
+
|
74
|
+
class_path = base_filenames.join ':'
|
75
|
+
structures_cmd = "export JAVA_HOME=#{env.liferay.java_home} && cd #{deploy_dir} && #{env.liferay.java_cmd} -cp #{class_path} com.savoirfairelinux.liferay.client.UpdateStructures"
|
76
|
+
templates_cmd = "export JAVA_HOME=#{env.liferay.java_home} && cd #{deploy_dir} && #{env.liferay.java_cmd} -cp #{class_path} com.savoirfairelinux.liferay.client.UpdateTemplates"
|
77
|
+
|
78
|
+
if env.liferay.remote?
|
79
|
+
env.liferay.remote.exec(structures_cmd)
|
80
|
+
env.liferay.remote.exec(templates_cmd)
|
81
|
+
else
|
82
|
+
rays_exec(structures_cmd)
|
83
|
+
rays_exec(templates_cmd)
|
84
|
+
end
|
85
|
+
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
=begin
|
2
|
+
Copyright (c) 2012 Dmitri Carpov
|
3
|
+
|
4
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
5
|
+
a copy of this software and associated documentation files (the
|
6
|
+
"Software"), to deal in the Software without restriction, including
|
7
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
8
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
9
|
+
permit persons to whom the Software is furnished to do so, subject to
|
10
|
+
the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be
|
13
|
+
included in all copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
16
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
17
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
18
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
19
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
20
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
21
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
22
|
+
=end
|
23
|
+
module Rays
|
24
|
+
module Worker
|
25
|
+
module Generator
|
26
|
+
|
27
|
+
# Maven generator
|
28
|
+
class Maven < BaseWorker
|
29
|
+
register :generator, :maven
|
30
|
+
|
31
|
+
include Singleton
|
32
|
+
|
33
|
+
def create(app_module)
|
34
|
+
raise RaysException.new("Don't know how to create #{app_module.type}/#{app_module.name}.") if app_module.archetype_name.nil?
|
35
|
+
create_cmd = "#{$rays_config.mvn} archetype:generate" <<
|
36
|
+
" -DarchetypeGroupId=com.liferay.maven.archetypes" <<
|
37
|
+
" -DarchetypeArtifactId=#{app_module.archetype_name}" <<
|
38
|
+
" -DarchetypeVersion=#{Project.instance.liferay}" <<
|
39
|
+
" -DgroupId=#{Project.instance.package}.#{app_module.type}" <<
|
40
|
+
" -DartifactId=#{app_module.name}" <<
|
41
|
+
" -Dversion=1.0-SNAPSHOT" <<
|
42
|
+
" -Dpackaging=war -B"
|
43
|
+
rays_exec(create_cmd)
|
44
|
+
MavenUtil.link_to_parent File.join(app_module.path, 'pom.xml')
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|