luban 0.6.2 → 0.6.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +20 -0
- data/lib/luban/deployment/cli/application/base.rb +121 -59
- data/lib/luban/deployment/cli/application/configurator.rb +0 -7
- data/lib/luban/deployment/cli/application/controller.rb +32 -39
- data/lib/luban/deployment/cli/application/publisher.rb +25 -37
- data/lib/luban/deployment/cli/application/repository.rb +53 -36
- data/lib/luban/deployment/cli/application/scm/git.rb +16 -11
- data/lib/luban/deployment/cli/application/worker.rb +10 -0
- data/lib/luban/deployment/cli/command.rb +1 -0
- data/lib/luban/deployment/cli/package/base.rb +2 -2
- data/lib/luban/deployment/cli/package/installer/install.rb +2 -2
- data/lib/luban/deployment/cli/service/controller.rb +1 -1
- data/lib/luban/deployment/parameters.rb +0 -2
- data/lib/luban/deployment/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3f5385cce19de66d6ae2ca1b7f4651f33881931b
|
4
|
+
data.tar.gz: 5c9b6a5c98b86c9bdd7ac2819d14efd5efcb0679
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 252e997fc1e0e70acd918045ac5b941c8c21a60a14deb9656da1ed0b91be752d1d7f5b6b0fdb3fc83932e7db4badffedf689f93facf18d04b030fbab11efb715
|
7
|
+
data.tar.gz: 8484026d33e2de99c9de5c61cbdabf9d48e2fb0e2b13750a38f53f396dec4d5ae7e134764d3ec9e687efc2e29f5147d92d5e30d458b519cc379d516759c94e9f
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,25 @@
|
|
1
1
|
# Change log
|
2
2
|
|
3
|
+
## Version 0.6.5 (Jul 27, 2016)
|
4
|
+
|
5
|
+
New features:
|
6
|
+
* Remade application release handling to manage multiple releases
|
7
|
+
* Supported deployment for multiple releases
|
8
|
+
* Supported release deprecation
|
9
|
+
* supported release summary
|
10
|
+
* Simplified release cleanup
|
11
|
+
|
12
|
+
Minor enhancements:
|
13
|
+
* Changed release_tag format for git commit in Git scm strategy
|
14
|
+
* Used attribute :version to unify :branch, :tag and :ref in Git scm strategy
|
15
|
+
* Deprecated parameter #keep_releases
|
16
|
+
* Releases retension is changed to control by manual configurations
|
17
|
+
* Added option #force for command #deploy
|
18
|
+
* Minor code refactor and cleanup
|
19
|
+
|
20
|
+
Bug fixes:
|
21
|
+
* Fixed display issue for pgrep under CentOS
|
22
|
+
|
3
23
|
## Version 0.6.2 (Jul 14, 2016)
|
4
24
|
|
5
25
|
New features:
|
@@ -9,7 +9,25 @@ module Luban
|
|
9
9
|
|
10
10
|
attr_reader :packages
|
11
11
|
attr_reader :services
|
12
|
+
attr_reader :current_app
|
13
|
+
attr_reader :release_opts
|
14
|
+
attr_reader :current_profile
|
15
|
+
attr_reader :profile_opts
|
12
16
|
|
17
|
+
def self.action_on_packages(action, as: action)
|
18
|
+
define_method(action) do |args:, opts:|
|
19
|
+
packages.each_value { |p| p.send(as, args: args, opts: opts) }
|
20
|
+
end
|
21
|
+
protected action
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.action_on_services(action, as: action)
|
25
|
+
define_method(action) do |args:, opts:|
|
26
|
+
services.each_value { |s| s.send(as, args: args, opts: opts) }
|
27
|
+
end
|
28
|
+
protected action
|
29
|
+
end
|
30
|
+
|
13
31
|
def find_project; parent; end
|
14
32
|
def find_application(name = nil)
|
15
33
|
name.nil? ? self : find_project.apps[name.to_sym]
|
@@ -20,9 +38,9 @@ module Luban
|
|
20
38
|
def has_packages?; !packages.empty?; end
|
21
39
|
def has_services?; !services.empty?; end
|
22
40
|
|
23
|
-
def installable?;
|
24
|
-
def deployable?; has_source? or has_profile?
|
25
|
-
def controllable?; has_source? or
|
41
|
+
def installable?; has_packages?; end
|
42
|
+
def deployable?; has_source? or has_profile? end
|
43
|
+
def controllable?; has_source? or has_services?; end
|
26
44
|
|
27
45
|
def use_package?(package_name, package_version, servers: [])
|
28
46
|
package_name = package_name.to_sym
|
@@ -32,8 +50,8 @@ module Luban
|
|
32
50
|
end
|
33
51
|
|
34
52
|
def other_package_users_for(package_name, package_version, servers: [])
|
35
|
-
|
36
|
-
|
53
|
+
find_project.package_users_for(package_name, package_version,
|
54
|
+
exclude: [name], servers: servers)
|
37
55
|
end
|
38
56
|
|
39
57
|
def package(name, version:, **opts)
|
@@ -50,24 +68,33 @@ module Luban
|
|
50
68
|
end
|
51
69
|
alias_method :require_package, :package
|
52
70
|
|
71
|
+
def profile(from = nil, **opts)
|
72
|
+
from.nil? ? @profile : (@profile = opts.merge(type: 'profile', from: from))
|
73
|
+
end
|
74
|
+
|
75
|
+
def profile_release(version, **opts)
|
76
|
+
@current_profile = version if opts[:current]
|
77
|
+
profile_opts[version] = opts.merge(version: version)
|
78
|
+
end
|
79
|
+
|
53
80
|
def source(from = nil, **opts)
|
54
|
-
|
55
|
-
@source = opts.merge(type: 'app', from: from)
|
56
|
-
if source_version.nil?
|
57
|
-
abort "Aborted! Please specify the source version with :tag, :branch or :ref."
|
58
|
-
end
|
59
|
-
@source
|
81
|
+
from.nil? ? @source : (@source = opts.merge(type: 'app', from: from))
|
60
82
|
end
|
61
83
|
|
62
|
-
def
|
63
|
-
@
|
84
|
+
def release(version, **opts)
|
85
|
+
@current_app = version if opts[:current]
|
86
|
+
release_opts[version] = opts.merge(version: version)
|
64
87
|
end
|
65
88
|
|
66
|
-
def
|
67
|
-
|
89
|
+
def has_version?(version)
|
90
|
+
release_opts.has_key?(version)
|
68
91
|
end
|
69
92
|
|
70
|
-
def
|
93
|
+
def versions; release_opts.keys; end
|
94
|
+
def deprecated_versions; release_opts.select {|r, o| o[:deprecated] }.keys; end
|
95
|
+
def deployable_versions; release_opts.select {|r, o| !o[:deprecated] }.keys; end
|
96
|
+
|
97
|
+
def password_for(user); find_project.password_for(user); end
|
71
98
|
|
72
99
|
def promptless_authen(args:, opts:)
|
73
100
|
opts = opts.merge(app: self, public_keys: Array(public_key!(args: args, opts: opts)))
|
@@ -101,63 +128,64 @@ module Luban
|
|
101
128
|
end
|
102
129
|
dispatch_task :destroy!, to: :constructor, as: :destroy
|
103
130
|
|
104
|
-
%i(install_all uninstall_all).each do |action|
|
105
|
-
define_method(
|
106
|
-
|
131
|
+
%i(install_all uninstall_all binstubs which whence).each do |action|
|
132
|
+
define_method(action) do |args:, opts:|
|
133
|
+
show_app_environment
|
134
|
+
send("#{action}!", args: args, opts: opts)
|
107
135
|
end
|
108
|
-
|
136
|
+
action_on_packages("#{action}!", as: action)
|
137
|
+
end
|
138
|
+
|
139
|
+
def cleanup(args:, opts:)
|
140
|
+
show_app_environment
|
141
|
+
cleanup_packages!(args: args, opts: opts)
|
142
|
+
cleanup_application!(args: args, opts: opts)
|
109
143
|
end
|
144
|
+
action_on_packages :cleanup_packages!, as: :cleanup
|
145
|
+
dispatch_task :cleanup_application!, to: :constructor, as: :cleanup
|
110
146
|
|
111
|
-
|
147
|
+
%i(show_current show_summary).each do |action|
|
112
148
|
define_method(action) do |args:, opts:|
|
113
149
|
show_app_environment
|
114
|
-
send("#{action}!", args: args, opts: opts)
|
150
|
+
send("#{action}_packages!", args: args, opts: opts)
|
151
|
+
send("#{action}_application", args: args, opts: opts) if has_source?
|
115
152
|
end
|
153
|
+
action_on_packages "#{action}_packages!", as: action
|
154
|
+
end
|
116
155
|
|
117
|
-
|
118
|
-
|
119
|
-
end
|
120
|
-
protected "#{action}!"
|
156
|
+
def show_current_application(args:, opts:)
|
157
|
+
print_summary(get_summary(args: args, opts: opts.merge(version: current_app)))
|
121
158
|
end
|
122
159
|
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
define_method("#{action}!") do |args:, opts:|
|
127
|
-
send("#{action}_application!", args: args, opts: opts) if has_source?
|
128
|
-
send("#{action}_packages!", args: args, opts: opts)
|
160
|
+
def show_summary_application(args:, opts:)
|
161
|
+
versions.each do |version|
|
162
|
+
print_summary(get_summary(args: args, opts: opts.merge(version: version)))
|
129
163
|
end
|
130
|
-
protected "#{action}!"
|
131
|
-
dispatch_task "#{action}_application!", to: worker, as: action
|
132
164
|
end
|
165
|
+
dispatch_task :get_summary, to: :controller, as: :get_summary
|
133
166
|
|
134
167
|
def deploy(args:, opts:)
|
135
168
|
show_app_environment
|
136
|
-
if has_source?
|
137
|
-
release = deploy_release(args: args, opts: opts)
|
138
|
-
opts = opts.merge(release: release)
|
139
|
-
end
|
169
|
+
deploy_release(args: args, opts: opts) if has_source?
|
140
170
|
deploy_profile(args: args, opts: opts) if has_profile?
|
141
171
|
end
|
142
172
|
|
143
173
|
Luban::Deployment::Command::Tasks::Control::Actions.each do |action|
|
144
174
|
define_method(action) do |args:, opts:|
|
145
175
|
show_app_environment
|
146
|
-
send("#{action}!", args: args, opts: opts)
|
147
|
-
end
|
148
|
-
|
149
|
-
define_method("#{action}!") do |args:, opts:|
|
150
|
-
send("application_#{action}!", args: args, opts: opts) if has_source?
|
151
176
|
send("service_#{action}!", args: args, opts: opts)
|
177
|
+
send("application_#{action}", args: args, opts: opts) if has_source?
|
152
178
|
end
|
153
|
-
|
154
|
-
|
155
|
-
dispatch_task "application_#{action}!", to: :controller, as: action
|
179
|
+
action_on_services "service_#{action}!", as: action
|
156
180
|
|
157
|
-
define_method("
|
158
|
-
|
181
|
+
define_method("application_#{action}") do |args:, opts:|
|
182
|
+
if current_app
|
183
|
+
send("application_#{action}!", args: args, opts: opts.merge(version: current_app))
|
184
|
+
else
|
185
|
+
abort "Aborted! No current version of #{display_name} is specified."
|
186
|
+
end
|
159
187
|
end
|
160
|
-
|
188
|
+
dispatch_task "application_#{action}!", to: :controller, as: action
|
161
189
|
end
|
162
190
|
|
163
191
|
def init_profiles(args:, opts:)
|
@@ -178,7 +206,7 @@ module Luban
|
|
178
206
|
if services.has_key?(opts[:service])
|
179
207
|
services[opts[:service]].init_profile(args: args, opts: opts)
|
180
208
|
else
|
181
|
-
services.
|
209
|
+
services.each_value { |s| s.init_profile(args: args, opts: opts) }
|
182
210
|
end
|
183
211
|
end
|
184
212
|
|
@@ -190,7 +218,9 @@ module Luban
|
|
190
218
|
@packages = {}
|
191
219
|
@services = {}
|
192
220
|
@source = {}
|
221
|
+
@release_opts = {}
|
193
222
|
@profile = {}
|
223
|
+
@profile_opts = {}
|
194
224
|
end
|
195
225
|
|
196
226
|
def validate_parameters
|
@@ -214,7 +244,8 @@ module Luban
|
|
214
244
|
|
215
245
|
def set_default_profile
|
216
246
|
if config_finder[:application].has_profile?
|
217
|
-
profile(config_finder[:application].stage_profile_path, scm: :rsync)
|
247
|
+
profile(config_finder[:application].stage_profile_path, scm: :rsync)
|
248
|
+
profile_release(stage, current: true)
|
218
249
|
end
|
219
250
|
end
|
220
251
|
|
@@ -246,10 +277,20 @@ module Luban
|
|
246
277
|
|
247
278
|
def compose_task_options(opts)
|
248
279
|
super.merge(name: name.to_s, packages: packages).tap do |o|
|
249
|
-
|
280
|
+
version = o[:version]
|
281
|
+
unless version.nil?
|
282
|
+
o.merge!(release: release_opts[version])
|
283
|
+
update_release_tag(o)
|
284
|
+
end
|
250
285
|
end
|
251
286
|
end
|
252
287
|
|
288
|
+
def update_release_tag(version:, **opts)
|
289
|
+
opts[:release][:tag] ||=
|
290
|
+
release_tag(args: {}, opts: opts.merge(repository: source.merge(version: version)))
|
291
|
+
end
|
292
|
+
dispatch_task :release_tag, to: :repository, as: :release_tag, locally: true
|
293
|
+
|
253
294
|
def show_app_environment
|
254
295
|
puts "#{display_name} in #{parent.class.name}"
|
255
296
|
end
|
@@ -262,31 +303,52 @@ module Luban
|
|
262
303
|
|
263
304
|
def deploy_profile(args:, opts:)
|
264
305
|
update_profile(args: args, opts: opts)
|
265
|
-
deploy_profile!(args: args, opts: opts.merge(repository: profile))
|
306
|
+
deploy_profile!(args: args, opts: opts.merge(repository: profile.merge(version: current_profile)))
|
266
307
|
end
|
267
308
|
|
268
309
|
def update_profile(args:, opts:)
|
269
|
-
update_profile!(args: args, opts: opts)
|
310
|
+
update_profile!(args: args, opts: opts.merge(version: current_app))
|
270
311
|
services.each_value { |s| s.send(:update_profile, args: args, opts: opts) }
|
271
312
|
end
|
272
313
|
dispatch_task :update_profile!, to: :configurator, as: :update_profile, locally: true
|
273
314
|
|
274
315
|
def deploy_release(args:, opts:)
|
275
|
-
|
276
|
-
|
316
|
+
deployable_versions.each do |version|
|
317
|
+
deploy_release!(args: args, opts: opts.merge(repository: source.merge(version: version)))
|
318
|
+
end
|
319
|
+
deprecated_versions.each do |version|
|
320
|
+
deprecate_release!(args: args, opts: opts.merge(repository: source.merge(version: version)))
|
277
321
|
end
|
278
322
|
end
|
279
323
|
|
280
324
|
def deploy_release!(args:, opts:)
|
281
|
-
package_release!(args: args, opts: opts)[:
|
282
|
-
unless
|
283
|
-
publish_release!(args: args, opts: opts.merge(
|
325
|
+
package_release!(args: args, opts: opts)[:release_pack].tap do |pack|
|
326
|
+
unless pack.nil?
|
327
|
+
publish_release!(args: args, opts: opts.merge(release_pack: pack))
|
284
328
|
end
|
285
329
|
end
|
286
330
|
end
|
287
331
|
alias_method :deploy_profile!, :deploy_release!
|
288
332
|
dispatch_task :package_release!, to: :repository, as: :package, locally: true
|
289
333
|
dispatch_task :publish_release!, to: :publisher, as: :publish
|
334
|
+
|
335
|
+
def deprecate_release!(args:, opts:)
|
336
|
+
deprecate_packaged_release!(args: args, opts: opts)[:release_pack].tap do |pack|
|
337
|
+
unless pack.nil?
|
338
|
+
deprecate_published_release!(args: args, opts: opts.merge(release_pack: pack))
|
339
|
+
end
|
340
|
+
end
|
341
|
+
end
|
342
|
+
dispatch_task :deprecate_packaged_release!, to: :repository, as: :deprecate, locally: true
|
343
|
+
dispatch_task :deprecate_published_release!, to: :publisher, as: :deprecate
|
344
|
+
|
345
|
+
def print_summary(result)
|
346
|
+
result.each do |entry|
|
347
|
+
s = entry[:summary]
|
348
|
+
puts " [#{entry[:hostname]}] #{s[:status]} #{s[:name]} (#{s[:published]})"
|
349
|
+
puts " [#{entry[:hostname]}] #{s[:alert]}" unless s[:alert].nil?
|
350
|
+
end
|
351
|
+
end
|
290
352
|
end
|
291
353
|
end
|
292
354
|
end
|
@@ -3,13 +3,6 @@ module Luban
|
|
3
3
|
class Application
|
4
4
|
class Configurator < Worker
|
5
5
|
include Luban::Deployment::Service::Configurator::Base
|
6
|
-
|
7
|
-
def release_type; task.opts.release[:type]; end
|
8
|
-
def release_tag; task.opts.release[:tag]; end
|
9
|
-
|
10
|
-
def release_path
|
11
|
-
@release_path ||= releases_path.join(release_type, release_tag)
|
12
|
-
end
|
13
6
|
end
|
14
7
|
end
|
15
8
|
end
|
@@ -4,52 +4,45 @@ module Luban
|
|
4
4
|
class Controller < Worker
|
5
5
|
include Luban::Deployment::Service::Controller::Base
|
6
6
|
|
7
|
-
def
|
8
|
-
|
9
|
-
end
|
10
|
-
|
11
|
-
def current_symlinked?(_release_tag)
|
12
|
-
_release_tag == release_tag
|
13
|
-
end
|
14
|
-
|
15
|
-
def release_path
|
16
|
-
@release_path ||= Pathname.new(readlink(current_app_path))
|
17
|
-
end
|
18
|
-
|
19
|
-
def releases_path
|
20
|
-
@releases_path ||= release_path.dirname
|
21
|
-
end
|
22
|
-
|
23
|
-
def release_tag
|
24
|
-
@release_tag ||= release_path.basename.to_s
|
25
|
-
end
|
26
|
-
|
27
|
-
def show_current
|
28
|
-
update_result get_summary(release_tag)
|
29
|
-
end
|
30
|
-
|
31
|
-
def show_summary
|
32
|
-
update_result get_summary(*get_releases)
|
33
|
-
end
|
7
|
+
def current_configured?; !!task.opts.release[:current]; end
|
8
|
+
alias_method :current?, :current_configured?
|
34
9
|
|
35
|
-
def
|
36
|
-
|
10
|
+
def current_symlinked?
|
11
|
+
release_tag == current_release_tag
|
37
12
|
end
|
38
13
|
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
if current_symlinked?(tag)
|
43
|
-
current_release?(tag) ? " *" : "s*"
|
14
|
+
def current_release_tag
|
15
|
+
if symlink?(current_app_path)
|
16
|
+
File.basename(readlink(current_app_path))
|
44
17
|
else
|
45
|
-
|
18
|
+
nil
|
46
19
|
end
|
47
20
|
end
|
48
21
|
|
49
|
-
def
|
50
|
-
|
51
|
-
|
52
|
-
|
22
|
+
def published?; directory?(release_path); end
|
23
|
+
def deprecated?; !!task.opts.release[:deprecated]; end
|
24
|
+
|
25
|
+
def get_summary
|
26
|
+
status = if current_symlinked?
|
27
|
+
current? ? " *" : "s*"
|
28
|
+
else
|
29
|
+
current? ? "c*" : (deprecated? ? " d" : " ")
|
30
|
+
end
|
31
|
+
|
32
|
+
if published?
|
33
|
+
published = 'published'
|
34
|
+
alert = case status
|
35
|
+
when "s*"
|
36
|
+
"Alert! #{application_name}:#{release_tag} is not the current version but symlinked IMPROPERLY. "
|
37
|
+
when "c*"
|
38
|
+
"Alert! #{application_name}:#{release_tag} is set as current version but NOT symlinked properly. "
|
39
|
+
end
|
40
|
+
else
|
41
|
+
published = 'NOT published'
|
42
|
+
alert = nil
|
43
|
+
end
|
44
|
+
update_result summary: { name: "#{application_name}:#{release_tag}", published: published,
|
45
|
+
status: status, alert: alert }
|
53
46
|
end
|
54
47
|
end
|
55
48
|
end
|
@@ -2,11 +2,12 @@ module Luban
|
|
2
2
|
module Deployment
|
3
3
|
class Application
|
4
4
|
class Publisher < Worker
|
5
|
-
def release_type; task.opts.
|
6
|
-
def
|
7
|
-
def
|
8
|
-
def
|
9
|
-
def
|
5
|
+
def release_type; task.opts.release_pack[:type]; end
|
6
|
+
def release_version; task.opts.release_pack[:version]; end
|
7
|
+
def release_tag; task.opts.release_pack[:tag]; end
|
8
|
+
def release_package_path; task.opts.release_pack[:path]; end
|
9
|
+
def release_md5; task.opts.release_pack[:md5]; end
|
10
|
+
def bundled_gems; task.opts.release_pack[:bundled_gems]; end
|
10
11
|
def locked_gemfile; bundled_gems[:locked_gemfile]; end
|
11
12
|
def gems_source; bundled_gems[:gems_cache]; end
|
12
13
|
def gems; bundled_gems[:gems]; end
|
@@ -14,16 +15,12 @@ module Luban
|
|
14
15
|
def publish_app?; release_type == 'app'; end
|
15
16
|
def publish_profile?; release_type == 'profile'; end
|
16
17
|
|
17
|
-
def
|
18
|
-
@
|
18
|
+
def release_name
|
19
|
+
@release_name ||= "#{application}:#{release_type}:#{release_tag}"
|
19
20
|
end
|
20
21
|
|
21
22
|
def releases_path
|
22
|
-
@releases_path ||= super.join(release_type)
|
23
|
-
end
|
24
|
-
|
25
|
-
def release_path
|
26
|
-
@release_path ||= releases_path.join(release_tag)
|
23
|
+
@releases_path ||= super.dirname.join(release_type)
|
27
24
|
end
|
28
25
|
|
29
26
|
def releases_log_path
|
@@ -62,9 +59,7 @@ module Luban
|
|
62
59
|
@bundle_linked_dirs ||= %w(.bundle vendor/cache vendor/bundle)
|
63
60
|
end
|
64
61
|
|
65
|
-
def published?
|
66
|
-
get_releases.include?(release_tag)
|
67
|
-
end
|
62
|
+
def published?; directory?(release_path); end
|
68
63
|
|
69
64
|
def publish
|
70
65
|
assure_dirs(releases_path)
|
@@ -72,7 +67,7 @@ module Luban
|
|
72
67
|
if force?
|
73
68
|
publish!
|
74
69
|
else
|
75
|
-
update_result "Skipped! #{
|
70
|
+
update_result "Skipped! ALREADY published #{release_name}.", status: :skipped
|
76
71
|
return
|
77
72
|
end
|
78
73
|
else
|
@@ -80,9 +75,16 @@ module Luban
|
|
80
75
|
end
|
81
76
|
|
82
77
|
if published?
|
83
|
-
update_result "Successfully published #{
|
78
|
+
update_result "Successfully published #{release_name}."
|
84
79
|
else
|
85
|
-
update_result "
|
80
|
+
update_result "FAILED to publish #{release_name}.", status: :failed, level: :error
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
def deprecate
|
85
|
+
if directory?(release_path)
|
86
|
+
rmdir(release_path)
|
87
|
+
update_result "Successfully deprecated published release #{release_name}."
|
86
88
|
end
|
87
89
|
end
|
88
90
|
|
@@ -93,10 +95,6 @@ module Luban
|
|
93
95
|
|
94
96
|
protected
|
95
97
|
|
96
|
-
def get_releases
|
97
|
-
capture(:ls, '-xt', releases_path).split
|
98
|
-
end
|
99
|
-
|
100
98
|
def publish!
|
101
99
|
rollout_release
|
102
100
|
cleanup_releases
|
@@ -161,23 +159,13 @@ module Luban
|
|
161
159
|
end
|
162
160
|
|
163
161
|
def release_log_message
|
164
|
-
"
|
162
|
+
"#{release_name} in #{stage} #{project} is published successfully."
|
165
163
|
end
|
166
164
|
|
167
|
-
def cleanup_releases
|
168
|
-
|
169
|
-
if
|
170
|
-
|
171
|
-
unless releases_to_keep.include?(release_tag)
|
172
|
-
releases_to_keep[-1] = release_tag
|
173
|
-
end
|
174
|
-
releases_to_remove = releases - releases_to_keep
|
175
|
-
releases_to_remove.each do |release|
|
176
|
-
rmdir(releases_path.join(release))
|
177
|
-
end
|
178
|
-
info "Removed #{releases_to_remove.count} old releases."
|
179
|
-
else
|
180
|
-
info "No old releases to remove (keeping most recent #{keep_releases} releases)."
|
165
|
+
def cleanup_releases(keep_releases = 1)
|
166
|
+
files = capture(:ls, '-xtd', releases_path.join("#{release_version}-*")).split(" ")
|
167
|
+
if files.count > keep_releases
|
168
|
+
files.last(files.count - keep_releases).each { |f| rmdir(f) }
|
181
169
|
end
|
182
170
|
end
|
183
171
|
|
@@ -12,6 +12,7 @@ module Luban
|
|
12
12
|
attr_reader :scm
|
13
13
|
attr_reader :revision
|
14
14
|
attr_reader :rev_size
|
15
|
+
attr_reader :version
|
15
16
|
|
16
17
|
def scm_module
|
17
18
|
require_relative "scm/#{scm}"
|
@@ -51,7 +52,11 @@ module Luban
|
|
51
52
|
end
|
52
53
|
|
53
54
|
def release_tag
|
54
|
-
@release_tag ||= "#{
|
55
|
+
@release_tag ||= "#{version}-#{revision}"
|
56
|
+
end
|
57
|
+
|
58
|
+
def release_name
|
59
|
+
@release_name ||= "#{application}:#{type}:#{release_tag}"
|
55
60
|
end
|
56
61
|
|
57
62
|
def bundle_without
|
@@ -74,45 +79,65 @@ module Luban
|
|
74
79
|
def build
|
75
80
|
assure_dirs(clone_path, releases_path)
|
76
81
|
if cloned? and !force?
|
77
|
-
|
78
|
-
update_result "Skipped! Local #{type} repository has been built ALREADY (#{revision}).", status: :skipped
|
82
|
+
update_result "Skipped! Local #{type} repository has been built ALREADY.", status: :skipped
|
79
83
|
else
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
update_result "Successfully built local #{type} repository (#{revision})."
|
84
|
-
else
|
85
|
-
update_result "FAILED to build local #{type} repository!", status: :failed, level: :error
|
86
|
-
end
|
84
|
+
abort "Aborted! Remote #{type} repository is NOT available." unless available?
|
85
|
+
if build!
|
86
|
+
update_result "Successfully built local #{type} repository."
|
87
87
|
else
|
88
|
-
|
88
|
+
abort "FAILED to build local #{type} repository!"
|
89
89
|
end
|
90
90
|
end
|
91
91
|
end
|
92
92
|
|
93
|
+
def packaged?; file?(release_package_path); end
|
94
|
+
|
93
95
|
def package
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
96
|
+
abort "Aborted! Local #{type} repository is NOT built yet!" unless cloned?
|
97
|
+
abort "Aborted! FAILED to update local #{type} repository!" unless update
|
98
|
+
update_revision
|
99
|
+
abort "Aborted! Version to package is MISSING!" if version.nil?
|
100
|
+
release_package = ->{ { type: type, version: version, tag: release_tag,
|
101
|
+
path: release_package_path,
|
102
|
+
md5: md5_for_file(release_package_path),
|
103
|
+
bundled_gems: bundle_gems } }
|
104
|
+
if packaged?
|
105
|
+
if force?
|
106
|
+
release
|
107
|
+
else
|
108
|
+
update_result "Skipped! ALREADY packaged #{release_name}.", status: :skipped,
|
109
|
+
release_pack: release_package.call
|
110
|
+
end
|
105
111
|
else
|
106
|
-
|
112
|
+
release
|
113
|
+
cleanup_releases
|
107
114
|
end
|
115
|
+
|
116
|
+
if packaged?
|
117
|
+
update_result "Successfully packaged #{release_name} to #{release_package_path}."
|
118
|
+
else
|
119
|
+
abort "Aborted! FAILED to package #{release_name}!"
|
120
|
+
end
|
121
|
+
update_result release_pack: release_package.call
|
122
|
+
end
|
123
|
+
|
124
|
+
def deprecate
|
125
|
+
abort "Aborted! Local #{type} repository is NOT built yet!" unless cloned?
|
126
|
+
abort "Aborted! Version to deprecate is MISSING!" if version.nil?
|
127
|
+
if file?(release_package_path)
|
128
|
+
rm(release_package_path)
|
129
|
+
update_result "Successfully deprecated packaged release #{release_name}."
|
130
|
+
end
|
131
|
+
update_result release_pack: { type: type, version: version, tag: release_tag }
|
108
132
|
end
|
109
133
|
|
110
134
|
protected
|
111
135
|
|
112
136
|
def init
|
113
137
|
@rev_size = DefaultRevisionSize
|
114
|
-
task.opts.repository.each_pair { |
|
138
|
+
task.opts.repository.each_pair { |k, v| instance_variable_set("@#{k}", v) }
|
115
139
|
load_scm
|
140
|
+
update_revision if cloned? and !version.nil?
|
116
141
|
end
|
117
142
|
|
118
143
|
def load_scm
|
@@ -124,23 +149,15 @@ module Luban
|
|
124
149
|
clone
|
125
150
|
end
|
126
151
|
|
127
|
-
def package!
|
128
|
-
if update
|
129
|
-
update_revision
|
130
|
-
release
|
131
|
-
end
|
132
|
-
end
|
133
|
-
|
134
152
|
def update_revision
|
135
153
|
@revision = fetch_revision
|
136
154
|
end
|
137
155
|
|
138
|
-
def cleanup_releases
|
139
|
-
|
156
|
+
def cleanup_releases(keep_releases = 1)
|
157
|
+
path = releases_path.join("#{release_prefix}-#{version}-*.#{release_package_extname}")
|
158
|
+
files = capture(:ls, '-xt', path).split(" ")
|
140
159
|
if files.count > keep_releases
|
141
|
-
|
142
|
-
files.last(files.count - keep_releases).each { |f| rm(f) }
|
143
|
-
end
|
160
|
+
files.last(files.count - keep_releases).each { |f| rm(f) }
|
144
161
|
end
|
145
162
|
end
|
146
163
|
|
@@ -4,15 +4,8 @@ module Luban
|
|
4
4
|
class Repository
|
5
5
|
module SCM
|
6
6
|
module Git
|
7
|
-
attr_reader :tag
|
8
|
-
attr_reader :branch
|
9
|
-
|
10
7
|
def git_cmd; :git; end
|
11
8
|
|
12
|
-
def ref
|
13
|
-
tag || branch || @ref
|
14
|
-
end
|
15
|
-
|
16
9
|
def available?
|
17
10
|
test(git_cmd, 'ls-remote --heads', from)
|
18
11
|
end
|
@@ -22,8 +15,8 @@ module Luban
|
|
22
15
|
end
|
23
16
|
|
24
17
|
def fetch_revision
|
25
|
-
within(clone_path) { capture(git_cmd, "rev-parse --short=#{rev_size} #{
|
26
|
-
#within(clone_path) { capture(git_cmd, "rev-list --max-count=1 --abbrev-commit --abbrev=rev_size #{
|
18
|
+
within(clone_path) { capture(git_cmd, "rev-parse --short=#{rev_size} #{version} 2>/dev/null") }
|
19
|
+
#within(clone_path) { capture(git_cmd, "rev-list --max-count=1 --abbrev-commit --abbrev=rev_size #{version}") }
|
27
20
|
end
|
28
21
|
|
29
22
|
def clone
|
@@ -35,11 +28,23 @@ module Luban
|
|
35
28
|
end
|
36
29
|
|
37
30
|
def release
|
38
|
-
within(clone_path) { test(git_cmd, :archive,
|
31
|
+
within(clone_path) { test(git_cmd, :archive, version, "--prefix=#{release_tag}/ -o #{release_package_path}") }
|
32
|
+
end
|
33
|
+
|
34
|
+
def branch?
|
35
|
+
within(clone_path) { test(git_cmd, :"show-ref", "--quite --verify refs/heads/#{version}") }
|
36
|
+
end
|
37
|
+
|
38
|
+
def tag?
|
39
|
+
within(clone_path) {test(git_cmd, :"show-ref", "--quite --verify refs/tags/#{version}") }
|
40
|
+
end
|
41
|
+
|
42
|
+
def commit?
|
43
|
+
version =~ /^\h+/ and !revision.nil?
|
39
44
|
end
|
40
45
|
|
41
46
|
def release_tag
|
42
|
-
@release_tag ||= "
|
47
|
+
@release_tag ||= commit? ? "ref-#{revision}" : super
|
43
48
|
end
|
44
49
|
end
|
45
50
|
end
|
@@ -25,6 +25,16 @@ module Luban
|
|
25
25
|
def service_entry
|
26
26
|
@service_entry ||= "#{env_name.gsub('/', '.')}.app"
|
27
27
|
end
|
28
|
+
|
29
|
+
def release_tag; task.opts.release[:tag]; end
|
30
|
+
|
31
|
+
def releases_path
|
32
|
+
@releases_path ||= super.join('app')
|
33
|
+
end
|
34
|
+
|
35
|
+
def release_path
|
36
|
+
@release_path ||= releases_path.join(release_tag)
|
37
|
+
end
|
28
38
|
end
|
29
39
|
end
|
30
40
|
end
|
@@ -81,7 +81,7 @@ module Luban
|
|
81
81
|
def package_options; @package_options ||= {}; end
|
82
82
|
|
83
83
|
def update_package_options(version, **opts)
|
84
|
-
unless
|
84
|
+
unless has_version?(version)
|
85
85
|
package_options[version] =
|
86
86
|
{ name: name.to_s }.merge!(self.class.decompose_version(version))
|
87
87
|
end
|
@@ -242,7 +242,7 @@ module Luban
|
|
242
242
|
def print_summary(result)
|
243
243
|
result.each do |entry|
|
244
244
|
s = entry[:summary]
|
245
|
-
puts " [#{entry[:hostname]}] #{s[:status]} #{s[:name]} #{s[:installed]}"
|
245
|
+
puts " [#{entry[:hostname]}] #{s[:status]} #{s[:name]} (#{s[:installed]})"
|
246
246
|
puts " [#{entry[:hostname]}] #{s[:executable]}" unless s[:executable].nil?
|
247
247
|
puts " [#{entry[:hostname]}] #{s[:alert]}" unless s[:alert].nil?
|
248
248
|
end
|
@@ -119,7 +119,7 @@ module Luban
|
|
119
119
|
end
|
120
120
|
|
121
121
|
if installed?
|
122
|
-
installed = '
|
122
|
+
installed = 'installed'
|
123
123
|
alert = case status
|
124
124
|
when "s*"
|
125
125
|
"Alert! #{package_full_name} is not the current version but symlinked IMPROPERLY. " +
|
@@ -129,7 +129,7 @@ module Luban
|
|
129
129
|
"Run \"binstubs\" to fix it."
|
130
130
|
end
|
131
131
|
else
|
132
|
-
installed = '
|
132
|
+
installed = 'NOT installed'
|
133
133
|
alert = nil
|
134
134
|
end
|
135
135
|
update_result summary: { name: package_full_name, installed: installed,
|
@@ -210,7 +210,7 @@ module Luban
|
|
210
210
|
end
|
211
211
|
|
212
212
|
def process_grep(pattern = process_pattern)
|
213
|
-
capture(:pgrep, "-l -f \"#{pattern}\" 2>/dev/null").split("\n").inject({}) do |h, p|
|
213
|
+
capture(:pgrep, "-l -f -a \"#{pattern}\" 2>/dev/null").split("\n").inject({}) do |h, p|
|
214
214
|
pid, pname = p.split(' ', 2)
|
215
215
|
h[pid] = pname
|
216
216
|
h
|
@@ -109,7 +109,6 @@ module Luban
|
|
109
109
|
|
110
110
|
parameter :application
|
111
111
|
parameter :scm_role
|
112
|
-
parameter :keep_releases
|
113
112
|
parameter :linked_dirs
|
114
113
|
parameter :linked_files
|
115
114
|
parameter :logrotate_files
|
@@ -118,7 +117,6 @@ module Luban
|
|
118
117
|
|
119
118
|
def set_default_application_parameters
|
120
119
|
set_default :scm_role, :scm
|
121
|
-
set_default :keep_releases, 3
|
122
120
|
set_default :linked_dirs, []
|
123
121
|
set_default :linked_files, []
|
124
122
|
set_default :logrotate_files, []
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: luban
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.6.
|
4
|
+
version: 0.6.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Rubyist Lei
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-07-
|
11
|
+
date: 2016-07-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: luban-cli
|