capistrano-maven 0.0.7 → 0.1.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.
- data/README.md +17 -18
- data/capistrano-maven.gemspec +6 -2
- data/lib/capistrano-maven.rb +259 -197
- data/lib/capistrano-maven/version.rb +1 -1
- data/test/centos6-64/.gitignore +5 -0
- data/test/centos6-64/Capfile +2 -0
- data/test/centos6-64/Gemfile +2 -0
- data/test/centos6-64/Vagrantfile +99 -0
- data/test/centos6-64/run.sh +7 -0
- data/test/config/deploy.rb +361 -0
- data/{lib/templates/settings.xml → test/config/templates/settings.xml.erb} +0 -0
- data/test/precise64/.gitignore +5 -0
- data/test/precise64/Capfile +2 -0
- data/test/precise64/Gemfile +2 -0
- data/test/precise64/Vagrantfile +99 -0
- data/test/precise64/run.sh +7 -0
- data/test/project/.gitignore +3 -0
- data/test/project/pom.xml +7 -0
- data/test/project/release.xml +7 -0
- data/test/project/snapshot.xml +7 -0
- data/test/project/src/main/java/com/github/yyuu/Main.java +7 -0
- metadata +105 -8
data/README.md
CHANGED
@@ -26,28 +26,27 @@ This recipes will try to do following things during Capistrano `deploy:setup` an
|
|
26
26
|
|
27
27
|
To build you Maven projects during Capistrano `deploy` tasks, add following in you `config/deploy.rb`. By default, Maven build will run after the Capistrano's `deploy:finalize_update`.
|
28
28
|
|
29
|
-
#
|
30
|
-
require
|
31
|
-
set(:mvn_version,
|
29
|
+
# config/deploy.rb
|
30
|
+
require "capistrano-maven"
|
31
|
+
set(:mvn_version, "3.0.5") # Maven version to build project
|
32
32
|
|
33
33
|
Following options are available to manage your Maven build.
|
34
34
|
|
35
|
-
* `:mvn_version` - project Maven version
|
36
|
-
* `:mvn_archive_url` - download URL for specified Maven version
|
37
|
-
* `:
|
38
|
-
* `:
|
35
|
+
* `:mvn_version` - The project Maven version.
|
36
|
+
* `:mvn_archive_url` - The download URL for specified Maven version.
|
37
|
+
* `:mvn_setup_remotely` - Setup `mvn` on remote servers. As same value as `:mvn_update_remotely` by default.
|
38
|
+
* `:mvn_setup_locally` - Setup `mvn` on local server. Asa same value as `:mvn_update_locally` by default.
|
39
|
+
* `:mvn_update_remotely` - Run `mvn` on remote servers. `true` by default.
|
40
|
+
* `:mvn_update_locally` - Run `mvn` on local server. `false` by default.
|
41
|
+
* `:mvn_goals` - Maven goals to execute. Run `clean package` by default.
|
42
|
+
* `:mvn_settings` - List of your optional setting files for Maven.
|
43
|
+
* `:mvn_settings_local` - List of your optional setting files for Maven.
|
44
|
+
* `:mvn_template_path` - The local path where the templates of setting files are in. By default, searches from `config/templates`.
|
45
|
+
* `:mvn_java_home` - Optional `JAVA_HOME` settings for Maven commands.
|
46
|
+
* `:mvn_java_home_local` - Optional `JAVA_HOME` settings for Maven commands in localhost.
|
39
47
|
* `:mvn_profiles` - Maven profiles to use.
|
40
|
-
* `:mvn_skip_tests` -
|
41
|
-
* `:mvn_update_snapshots` -
|
42
|
-
* `:mvn_update_settings` - update `settings.xml` or not. false by default.
|
43
|
-
* `:mvn_update_settings_locally` - udate `settings.xml` or not on local compilation. false by default.
|
44
|
-
* `:mvn_settings` - list of your optional setting files for Maven. use `%w(settings.xml)` by default.
|
45
|
-
* `:mvn_settings_local` - list of your optional setting files for Maven. use `%w(settings.xml)` by default.
|
46
|
-
* `:mvn_settings_path` - the destination path of the optional `settings.xml` file. use `:release_path` by default.
|
47
|
-
* `:mvn_settings_path_local` - the destination path of the optional `settings.xml` file. use `pwd` by default.
|
48
|
-
* `:mvn_template_path` - specify ERB template path for settings.xml.
|
49
|
-
* `:mvn_java_home` - optional `JAVA_HOME` settings for Maven commands.
|
50
|
-
* `:mvn_java_home_local` - optional `JAVA_HOME` settings for Maven commands in localhost.
|
48
|
+
* `:mvn_skip_tests` - Add `-Dmaven.test.skip=true` in Maven commands. `false` by default.
|
49
|
+
* `:mvn_update_snapshots` - Add `-U` if Maven commands. `false` by default.
|
51
50
|
* `:mvn_release_build` - Skip building on SNAPSHOT version. `false` by default.
|
52
51
|
|
53
52
|
## Contributing
|
data/capistrano-maven.gemspec
CHANGED
@@ -16,6 +16,10 @@ Gem::Specification.new do |gem|
|
|
16
16
|
gem.version = Capistrano::Maven::VERSION
|
17
17
|
|
18
18
|
gem.add_dependency("capistrano")
|
19
|
-
gem.add_dependency("capistrano-file-resources", "~> 0.0
|
20
|
-
gem.add_dependency("capistrano-file-transfer-ext", "~> 0.0
|
19
|
+
gem.add_dependency("capistrano-file-resources", "~> 0.1.0")
|
20
|
+
gem.add_dependency("capistrano-file-transfer-ext", "~> 0.1.0")
|
21
|
+
gem.add_development_dependency("capistrano-jdk-installer", "~> 0.1.0")
|
22
|
+
gem.add_development_dependency("net-scp", "~> 1.0.4")
|
23
|
+
gem.add_development_dependency("net-ssh", "~> 2.2.2")
|
24
|
+
gem.add_development_dependency("vagrant", "~> 1.0.6")
|
21
25
|
end
|
data/lib/capistrano-maven.rb
CHANGED
@@ -9,276 +9,338 @@ module Capistrano
|
|
9
9
|
def self.extended(configuration)
|
10
10
|
configuration.load {
|
11
11
|
namespace(:mvn) {
|
12
|
-
_cset(:
|
13
|
-
_cset(:
|
14
|
-
|
15
|
-
}
|
12
|
+
_cset(:mvn_roles, [:app])
|
13
|
+
_cset(:mvn_version, "3.0.5")
|
14
|
+
_cset(:mvn_major_version) { mvn_version.split(".").first.to_i }
|
16
15
|
_cset(:mvn_archive_url) {
|
17
16
|
"http://www.apache.org/dist/maven/maven-#{mvn_major_version}/#{mvn_version}/binaries/apache-maven-#{mvn_version}-bin.tar.gz"
|
18
17
|
}
|
19
|
-
_cset(:
|
20
|
-
|
21
|
-
}
|
22
|
-
_cset(:
|
23
|
-
|
24
|
-
}
|
25
|
-
_cset(:
|
26
|
-
|
27
|
-
}
|
28
|
-
_cset(:
|
29
|
-
|
30
|
-
}
|
31
|
-
_cset(:
|
32
|
-
|
33
|
-
}
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
18
|
+
_cset(:mvn_tools_path) { File.join(shared_path, "tools", "mvn") }
|
19
|
+
_cset(:mvn_tools_path_local) { File.expand_path("tools/mvn") }
|
20
|
+
_cset(:mvn_archive_path) { mvn_tools_path }
|
21
|
+
_cset(:mvn_archive_path_local) { mvn_tools_path_local }
|
22
|
+
_cset(:mvn_archive_file) { File.join(mvn_archive_path, File.basename(URI.parse(mvn_archive_url).path)) }
|
23
|
+
_cset(:mvn_archive_file_local) { File.join(mvn_archive_path_local, File.basename(URI.parse(mvn_archive_url).path)) }
|
24
|
+
_cset(:mvn_path) { File.join(mvn_tools_path, File.basename(URI.parse(mvn_archive_url).path, "-bin.tar.gz")) }
|
25
|
+
_cset(:mvn_path_local) { File.join(mvn_tools_path_local, File.basename(URI.parse(mvn_archive_url).path, "-bin.tar.gz")) }
|
26
|
+
_cset(:mvn_bin_path) { File.join(mvn_path, "bin") }
|
27
|
+
_cset(:mvn_bin_path_local) { File.join(mvn_path_local, "bin") }
|
28
|
+
_cset(:mvn_bin) { File.join(mvn_bin_path, "mvn") }
|
29
|
+
_cset(:mvn_bin_local) { File.join(mvn_bin_path_local, "mvn") }
|
30
|
+
_cset(:mvn_project_path) { release_path }
|
31
|
+
_cset(:mvn_project_path_local) { File.expand_path(".") }
|
32
|
+
_cset(:mvn_template_path) { File.expand_path("config/templates") }
|
33
|
+
|
34
|
+
## Maven environment
|
35
|
+
_cset(:mvn_common_environment, {})
|
36
|
+
_cset(:mvn_default_environment) {
|
37
|
+
environment = {}
|
38
|
+
environment["JAVA_HOME"] = fetch(:mvn_java_home) if exists?(:mvn_java_home)
|
39
|
+
if exists?(:mvn_java_options)
|
40
|
+
environment["MAVEN_OPTS"] = [ fetch(:mvn_java_options, []) ].flatten.join(" ")
|
38
41
|
end
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
File.join(mvn_path, 'bin', 'mvn')
|
48
|
-
}
|
49
|
-
_cset(:mvn_bin_local) {
|
50
|
-
File.join(mvn_path_local, 'bin', 'mvn')
|
51
|
-
}
|
52
|
-
_cset(:mvn_cmd) {
|
53
|
-
if fetch(:mvn_java_home, nil)
|
54
|
-
"env JAVA_HOME=#{mvn_java_home} #{mvn_bin} #{mvn_options.join(' ')}"
|
55
|
-
else
|
56
|
-
"#{mvn_bin} #{mvn_options.join(' ')}"
|
42
|
+
environment["PATH"] = [ mvn_bin_path, "$PATH" ].join(":") if mvn_setup_remotely
|
43
|
+
_merge_environment(mvn_common_environment, environment)
|
44
|
+
}
|
45
|
+
_cset(:mvn_default_environment_local) {
|
46
|
+
environment = {}
|
47
|
+
environment["JAVA_HOME"] = fetch(:mvn_java_home_local) if exists?(:mvn_java_home_local)
|
48
|
+
if exists?(:mvn_java_options_local)
|
49
|
+
environment["MAVEN_OPTS"] = [ fetch(:mvn_java_options_local, []) ].flatten.join(" ")
|
57
50
|
end
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
51
|
+
environment["PATH"] = [ mvn_bin_path_local, "$PATH" ].join(":") if mvn_setup_locally
|
52
|
+
_merge_environment(mvn_common_environment, environment)
|
53
|
+
}
|
54
|
+
_cset(:mvn_environment) { _merge_environment(mvn_default_environment, fetch(:mvn_extra_environment, {})) }
|
55
|
+
_cset(:mvn_environment_local) { _merge_environment(mvn_default_environment_local, fetch(:mvn_extra_environment_local, {})) }
|
56
|
+
def _command(cmdline, options={})
|
57
|
+
environment = options.fetch(:env, {})
|
58
|
+
if environment.empty?
|
59
|
+
cmdline
|
62
60
|
else
|
63
|
-
"
|
61
|
+
env = (["env"] + environment.map { |k, v| "#{k}=#{v.dump}" }).join(" ")
|
62
|
+
"#{env} #{cmdline}"
|
64
63
|
end
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
_cset(:
|
73
|
-
|
74
|
-
}
|
75
|
-
_cset(:mvn_target_path_local) {
|
76
|
-
File.join(mvn_project_path_local, File.basename(mvn_target_path))
|
77
|
-
}
|
78
|
-
_cset(:mvn_template_path, File.join(File.dirname(__FILE__), 'templates'))
|
79
|
-
_cset(:mvn_update_settings, false)
|
80
|
-
_cset(:mvn_update_settings_locally, false)
|
81
|
-
_cset(:mvn_settings_path) { mvn_project_path }
|
82
|
-
_cset(:mvn_settings_path_local) { mvn_project_path_local }
|
83
|
-
_cset(:mvn_settings, %w(settings.xml))
|
84
|
-
_cset(:mvn_settings_local, %w(settings.xml))
|
85
|
-
_cset(:mvn_cleanup_settings, [])
|
86
|
-
_cset(:mvn_cleanup_settings_local, [])
|
87
|
-
_cset(:mvn_compile_locally, false) # perform precompilation on localhost
|
64
|
+
end
|
65
|
+
def command(cmdline, options={})
|
66
|
+
_command(cmdline, :env => mvn_environment.merge(options.fetch(:env, {})))
|
67
|
+
end
|
68
|
+
def command_local(cmdline, options={})
|
69
|
+
_command(cmdline, :env => mvn_environment_local.merge(options.fetch(:env, {})))
|
70
|
+
end
|
71
|
+
_cset(:mvn_cmd) { command("#{mvn_bin.dump} #{mvn_options.map { |x| x.dump }.join(" ")}") }
|
72
|
+
_cset(:mvn_cmd_local) { command_local("#{mvn_bin_local.dump} #{mvn_options_local.map { |x| x.dump }.join(" ")}") }
|
88
73
|
_cset(:mvn_goals, %w(clean package))
|
89
74
|
_cset(:mvn_common_options) {
|
90
75
|
options = []
|
91
|
-
options << "-P#{mvn_profiles.join(
|
76
|
+
options << "-P#{mvn_profiles.join(",")}" unless fetch(:mvn_profiles, []).empty?
|
92
77
|
options << "-Dmaven.test.skip=true" if fetch(:mvn_skip_tests, false)
|
93
78
|
options << "-U" if fetch(:mvn_update_snapshots, false)
|
94
79
|
options << "-B"
|
95
80
|
options
|
96
81
|
}
|
97
|
-
_cset(:
|
98
|
-
options = mvn_common_options
|
99
|
-
if mvn_update_settings
|
100
|
-
settings = File.join(mvn_settings_path, mvn_settings.first)
|
101
|
-
options << "--settings=#{settings}"
|
102
|
-
end
|
82
|
+
_cset(:mvn_default_options) {
|
83
|
+
options = mvn_common_options.dup
|
84
|
+
options += mvn_settings.map { |s| "--settings=#{File.join(mvn_settings_path, s).dump}" } if mvn_update_settings
|
103
85
|
options
|
104
86
|
}
|
105
|
-
_cset(:
|
106
|
-
options = mvn_common_options
|
107
|
-
if mvn_update_settings_locally
|
108
|
-
settings = File.join(mvn_settings_path_local, mvn_settings_local.first)
|
109
|
-
options << "--settings=#{settings}"
|
110
|
-
end
|
87
|
+
_cset(:mvn_default_options_local) {
|
88
|
+
options = mvn_common_options.dup
|
89
|
+
options += mvn_settings_local.map { |s| "--settings=#{File.join(mvn_settings_path_local, s).dump}" } if mvn_update_settings_locally
|
111
90
|
options
|
112
91
|
}
|
92
|
+
_cset(:mvn_options) { mvn_default_options + fetch(:mvn_extra_options, []) }
|
93
|
+
_cset(:mvn_options_local) { mvn_default_options_local + fetch(:mvn_extra_options_local, []) }
|
113
94
|
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
95
|
+
_cset(:mvn_setup_remotely) { mvn_update_remotely }
|
96
|
+
_cset(:mvn_setup_locally) { mvn_update_locally }
|
97
|
+
_cset(:mvn_update_remotely) { not(mvn_update_locally) }
|
98
|
+
_cset(:mvn_update_locally) { # perform update on localhost
|
99
|
+
if exists?(:mvn_compile_locally)
|
100
|
+
logger.info(":mvn_compile_locally has been deprecated. use :mvn_update_locally instead.")
|
101
|
+
fetch(:mvn_compile_locally, false)
|
102
|
+
else
|
103
|
+
false
|
104
|
+
end
|
121
105
|
}
|
122
|
-
after 'deploy:setup', 'mvn:setup'
|
123
106
|
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
107
|
+
if top.namespaces.key?(:multistage)
|
108
|
+
after "multistage:ensure", "mvn:setup_default_environment"
|
109
|
+
else
|
110
|
+
on :start do
|
111
|
+
if top.namespaces.key?(:multistage)
|
112
|
+
after "multistage:ensure", "mvn:setup_default_environment"
|
113
|
+
else
|
114
|
+
setup_default_environment
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
_cset(:mvn_environment_join_keys, %w(DYLD_LIBRARY_PATH LD_LIBRARY_PATH MANPATH PATH))
|
120
|
+
def _merge_environment(x, y)
|
121
|
+
x.merge(y) { |key, x_val, y_val|
|
122
|
+
if mvn_environment_join_keys.include?(key)
|
123
|
+
( y_val.split(":") + x_val.split(":") ).uniq.join(":")
|
124
|
+
else
|
125
|
+
y_val
|
126
|
+
end
|
129
127
|
}
|
128
|
+
end
|
129
|
+
|
130
|
+
task(:setup_default_environment, :roles => mvn_roles, :except => { :no_release => true }) {
|
131
|
+
if fetch(:mvn_setup_default_environment, true)
|
132
|
+
set(:default_environment, _merge_environment(default_environment, mvn_environment))
|
133
|
+
end
|
130
134
|
}
|
131
135
|
|
132
|
-
def
|
133
|
-
if
|
134
|
-
|
136
|
+
def _invoke_command(cmdline, options={})
|
137
|
+
if options[:via] == :run_locally
|
138
|
+
run_locally(cmdline)
|
135
139
|
else
|
136
|
-
|
140
|
+
invoke_command(cmdline, options)
|
137
141
|
end
|
138
142
|
end
|
139
143
|
|
140
|
-
def
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
144
|
+
def _download(uri, filename, options={})
|
145
|
+
options = fetch(:mvn_download_options, {}).merge(options)
|
146
|
+
if FileTest.exist?(filename)
|
147
|
+
logger.info("Found downloaded archive: #{filename}")
|
148
|
+
else
|
149
|
+
dirs = [ File.dirname(filename) ]
|
150
|
+
execute = []
|
151
|
+
execute << "mkdir -p #{dirs.uniq.map { |x| x.dump }.join(" ")}"
|
152
|
+
execute << "wget --no-verbose -O #{filename.dump} #{uri.dump}"
|
153
|
+
_invoke_command(execute.join(" && "), options)
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
157
|
+
def _upload(filename, remote_filename, options={})
|
158
|
+
_invoke_command("mkdir -p #{File.dirname(remote_filename).dump}", options)
|
159
|
+
transfer_if_modified(:up, filename, remote_filename, fetch(:mvn_upload_options, {}).merge(options))
|
160
|
+
end
|
161
|
+
|
162
|
+
def _install(filename, destination, options={})
|
148
163
|
execute = []
|
149
|
-
execute << "mkdir -p #{
|
150
|
-
execute <<
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
test -x #{bin};
|
162
|
-
fi
|
163
|
-
EOS
|
164
|
-
execute.join(' && ')
|
164
|
+
execute << "mkdir -p #{File.dirname(destination).dump}"
|
165
|
+
execute << "tar xf #{filename.dump} -C #{File.dirname(destination).dump}"
|
166
|
+
_invoke_command(execute.join(" && "), options)
|
167
|
+
end
|
168
|
+
|
169
|
+
def _installed?(destination, options={})
|
170
|
+
mvn = File.join(destination, "bin", "mvn")
|
171
|
+
cmdline = "test -d #{destination.dump} && test -x #{mvn.dump}"
|
172
|
+
_invoke_command(cmdline, options)
|
173
|
+
true
|
174
|
+
rescue
|
175
|
+
false
|
165
176
|
end
|
166
177
|
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
178
|
+
## setup
|
179
|
+
desc("Setup maven.")
|
180
|
+
task(:setup, :roles => mvn_roles, :except => { :no_release => true }) {
|
181
|
+
transaction {
|
182
|
+
setup_remotely if mvn_setup_remotely
|
183
|
+
setup_locally if mvn_setup_locally
|
184
|
+
}
|
185
|
+
}
|
186
|
+
after "deploy:setup", "mvn:setup"
|
187
|
+
|
188
|
+
task(:setup_remotely, :roles => mvn_roles, :except => { :no_release => true }) {
|
189
|
+
_download(mvn_archive_url, mvn_archive_file_local, :via => :run_locally)
|
190
|
+
_upload(mvn_archive_file_local, mvn_archive_file)
|
191
|
+
unless _installed?(mvn_path)
|
192
|
+
_install(mvn_archive_file, mvn_path)
|
193
|
+
_installed?(mvn_path)
|
194
|
+
end
|
195
|
+
update_settings if mvn_update_settings
|
172
196
|
}
|
173
197
|
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
198
|
+
desc("Setup maven locally.")
|
199
|
+
task(:setup_locally, :roles => mvn_roles, :except => { :no_release => true }) {
|
200
|
+
_download(mvn_archive_url, mvn_archive_file_local, :via => :run_locally)
|
201
|
+
unless _installed?(mvn_path_local, :via => :run_locally)
|
202
|
+
_install(mvn_archive_file_local, mvn_path_local, :via => :run_locally)
|
203
|
+
_installed?(mvn_path_local, :via => :run_locally)
|
204
|
+
end
|
205
|
+
update_settings_locally if mvn_update_settings_locally
|
179
206
|
}
|
180
207
|
|
181
|
-
|
182
|
-
|
183
|
-
|
208
|
+
_cset(:mvn_update_settings) { mvn_setup_remotely and not(mvn_settings.empty?) }
|
209
|
+
_cset(:mvn_update_settings_locally) { mvn_setup_locally and not(mvn_settings_local.empty?) }
|
210
|
+
_cset(:mvn_settings_path) { mvn_tools_path }
|
211
|
+
_cset(:mvn_settings_path_local) { mvn_tools_path_local }
|
212
|
+
_cset(:mvn_settings, [])
|
213
|
+
_cset(:mvn_settings_local) { mvn_settings }
|
214
|
+
task(:update_settings, :roles => mvn_roles, :except => { :no_release => true }) {
|
215
|
+
mvn_settings.each do |file|
|
216
|
+
safe_put(template(file, :path => mvn_template_path), File.join(mvn_settings_path, file))
|
184
217
|
end
|
185
|
-
run("rm -f #{mvn_cleanup_settings.map { |x| x.dump }.join(' ')}") unless mvn_cleanup_settings.empty?
|
186
218
|
}
|
187
219
|
|
188
|
-
task(:update_settings_locally, :except => { :no_release => true }) {
|
189
|
-
mvn_settings_local.each do |
|
190
|
-
File.
|
220
|
+
task(:update_settings_locally, :roles => mvn_roles, :except => { :no_release => true }) {
|
221
|
+
mvn_settings_local.each do |file|
|
222
|
+
destination = File.join(mvn_settings_path_local, file)
|
223
|
+
run_locally("mkdir -p #{File.dirname(destination).dump}")
|
224
|
+
File.write(destination, template(file, :path => mvn_template_path))
|
191
225
|
end
|
192
|
-
run_locally("rm -f #{mvn_cleanup_settings_local.map { |x| x.dump }.join(' ')}") unless mvn_cleanup_settings_local.empty?
|
193
226
|
}
|
194
227
|
|
228
|
+
## update
|
195
229
|
desc("Update maven build.")
|
196
|
-
task(:update, :roles =>
|
230
|
+
task(:update, :roles => mvn_roles, :except => { :no_release => true }) {
|
197
231
|
transaction {
|
198
|
-
if
|
199
|
-
|
200
|
-
else
|
201
|
-
execute
|
202
|
-
end
|
232
|
+
update_remotely if mvn_update_remotely
|
233
|
+
update_locally if mvn_update_locally
|
203
234
|
}
|
204
235
|
}
|
205
|
-
|
236
|
+
_cset(:mvn_update_hook_type, :after)
|
237
|
+
_cset(:mvn_update_hook, "deploy:finalize_update")
|
238
|
+
on(:start) do
|
239
|
+
[ mvn_update_hook ].flatten.each do |hook|
|
240
|
+
send(mvn_update_hook_type, hook, "mvn:update") if hook
|
241
|
+
end
|
242
|
+
end
|
206
243
|
|
207
|
-
|
208
|
-
|
209
|
-
transaction {
|
210
|
-
execute_locally
|
211
|
-
upload_locally
|
212
|
-
}
|
244
|
+
task(:update_remotely, :roles => mvn_roles, :except => { :no_release => true }) {
|
245
|
+
execute_remotely
|
213
246
|
}
|
214
247
|
|
215
|
-
|
216
|
-
|
217
|
-
|
248
|
+
desc("Update maven build locally.")
|
249
|
+
task(:update_locally, :roles => mvn_roles, :except => { :no_release => true }) {
|
250
|
+
execute_locally
|
251
|
+
upload_locally
|
252
|
+
}
|
218
253
|
|
219
|
-
def
|
254
|
+
def _parse_project_version(s)
|
220
255
|
# FIXME: is there any better way to get project version?
|
221
256
|
s.split(/(?:\r?\n)+/).reject { |line| /^\[[A-Z]+\]/ =~ line }.last
|
222
257
|
end
|
223
258
|
|
224
|
-
_cset(:mvn_release_build, false)
|
225
|
-
_cset(:mvn_snapshot_pattern, /-SNAPSHOT$/i)
|
226
259
|
_cset(:mvn_project_version) {
|
227
|
-
|
260
|
+
_parse_project_version(mvn.exec(%w(-Dexpression=project.version help:evaluate), :via => :capture))
|
228
261
|
}
|
229
262
|
_cset(:mvn_project_version_local) {
|
230
|
-
|
263
|
+
_parse_project_version(mvn.exec_locally(%w(-Dexpression=project.version help:evaluate), :via => :capture_locally))
|
231
264
|
}
|
232
|
-
|
233
|
-
def _validate_project_version(
|
234
|
-
if mvn_release_build
|
235
|
-
version = fetch(
|
236
|
-
if mvn_snapshot_pattern === version
|
237
|
-
abort("Skip to build project since \`#{version}' is a SNAPSHOT version.")
|
238
|
-
end
|
265
|
+
_cset(:mvn_snapshot_pattern, /-SNAPSHOT$/i)
|
266
|
+
def _validate_project_version(key)
|
267
|
+
if fetch(:mvn_release_build, false)
|
268
|
+
version = fetch(key)
|
269
|
+
abort("Skip to build project since \`#{version}' is a SNAPSHOT version.") if mvn_snapshot_pattern === version
|
239
270
|
end
|
240
271
|
end
|
241
272
|
|
242
273
|
desc("Perform maven build.")
|
243
|
-
task(:execute, :roles =>
|
244
|
-
|
245
|
-
|
246
|
-
|
274
|
+
task(:execute, :roles => mvn_roles, :except => { :no_release => true }) {
|
275
|
+
execute_remotely
|
276
|
+
}
|
277
|
+
task(:execute_remotely, :roles => mvn_roles, :except => { :no_release => true }) {
|
278
|
+
on_rollback do
|
279
|
+
mvn.exec("clean")
|
280
|
+
end
|
247
281
|
_validate_project_version(:mvn_project_version)
|
248
|
-
|
282
|
+
mvn.exec(mvn_goals)
|
249
283
|
}
|
250
284
|
|
251
285
|
desc("Perform maven build locally.")
|
252
|
-
task(:execute_locally, :roles =>
|
253
|
-
on_rollback
|
254
|
-
|
255
|
-
|
286
|
+
task(:execute_locally, :roles => mvn_roles, :except => { :no_release => true }) {
|
287
|
+
on_rollback do
|
288
|
+
mvn.exec_locally("clean")
|
289
|
+
end
|
256
290
|
_validate_project_version(:mvn_project_version_local)
|
257
|
-
|
258
|
-
logger.info(cmdline)
|
259
|
-
abort("execution failure") unless system(cmdline)
|
291
|
+
mvn.exec_locally(mvn_goals)
|
260
292
|
}
|
261
293
|
|
262
|
-
_cset(:
|
263
|
-
_cset(:
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
"#{mvn_target_path_local}.tar.gz"
|
269
|
-
|
270
|
-
task(:upload_locally, :roles => :app, :except => { :no_release => true }) {
|
271
|
-
on_rollback {
|
272
|
-
run("rm -rf #{mvn_target_path} #{mvn_target_archive}")
|
273
|
-
}
|
294
|
+
_cset(:mvn_target_path) { File.join(mvn_project_path, "target") }
|
295
|
+
_cset(:mvn_target_path_local) { File.join(mvn_project_path_local, "target") }
|
296
|
+
task(:upload_locally, :roles => mvn_roles, :except => { :no_release => true }) {
|
297
|
+
on_rollback do
|
298
|
+
run("rm -rf #{mvn_target_path.dump}")
|
299
|
+
end
|
300
|
+
filename = "#{mvn_target_path_local}.tar.gz"
|
301
|
+
remote_filename = "#{mvn_target_path}.tar.gz"
|
274
302
|
begin
|
275
|
-
run_locally("cd #{File.dirname(mvn_target_path_local)} &&
|
276
|
-
|
277
|
-
|
303
|
+
run_locally("cd #{File.dirname(mvn_target_path_local).dump} && tar chzf #{filename.dump} #{File.basename(mvn_target_path_local).dump}")
|
304
|
+
run("mkdir -p #{File.dirname(mvn_target_path).dump}")
|
305
|
+
top.upload(filename, remote_filename)
|
306
|
+
run("cd #{File.dirname(mvn_target_path).dump} && tar xzf #{remote_filename.dump}")
|
278
307
|
ensure
|
279
|
-
|
308
|
+
run("rm -f #{remote_filename.dump}") rescue nil
|
309
|
+
run_locally("rm -f #{filename.dump}") rescue nil
|
280
310
|
end
|
281
311
|
}
|
312
|
+
|
313
|
+
def _exec_command(args=[], options={})
|
314
|
+
args = [ args ].flatten
|
315
|
+
mvn = options.fetch(:mvn, "mvn")
|
316
|
+
execute = []
|
317
|
+
execute << "cd #{options[:path].dump}" if options.key?(:path)
|
318
|
+
execute << "#{mvn} #{args.map { |x| x.dump }.join(" ")}"
|
319
|
+
execute.join(" && ")
|
320
|
+
end
|
321
|
+
|
322
|
+
## public methods
|
323
|
+
def exec(args=[], options={})
|
324
|
+
cmdline = _exec_command(args, { :path => mvn_project_path, :mvn => mvn_cmd, :via => :run }.merge(options))
|
325
|
+
_invoke_command(cmdline, options)
|
326
|
+
end
|
327
|
+
|
328
|
+
def exec_locally(args=[], options={})
|
329
|
+
via = options.delete(:via)
|
330
|
+
cmdline = _exec_command(args, { :path => mvn_project_path_local, :mvn => mvn_cmd_local, :via => :run_locally }.merge(options))
|
331
|
+
if via == :capture_locally
|
332
|
+
_invoke_command(cmdline, options.merge(:via => :run_locally))
|
333
|
+
else
|
334
|
+
logger.trace("executing locally: #{cmdline.dump}")
|
335
|
+
elapsed = Benchmark.realtime do
|
336
|
+
system(cmdline)
|
337
|
+
end
|
338
|
+
if $?.to_i > 0 # $? is command exit code (posix style)
|
339
|
+
raise Capistrano::LocalArgumentError, "Command #{cmd} returned status code #{$?}"
|
340
|
+
end
|
341
|
+
logger.trace "command finished in #{(elapsed * 1000).round}ms"
|
342
|
+
end
|
343
|
+
end
|
282
344
|
}
|
283
345
|
}
|
284
346
|
end
|