luban 0.5.5 → 0.6.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/CHANGELOG.md +32 -3
- data/README.md +1 -1
- data/lib/luban/deployment/cli/application/base.rb +56 -29
- data/lib/luban/deployment/cli/application/configurator.rb +7 -0
- data/lib/luban/deployment/cli/application/publisher.rb +3 -4
- data/lib/luban/deployment/cli/application/repository.rb +6 -6
- data/lib/luban/deployment/cli/application/scm/git.rb +1 -1
- data/lib/luban/deployment/cli/application/worker.rb +11 -6
- data/lib/luban/deployment/cli/command.rb +9 -3
- data/lib/luban/deployment/cli/package/installer/paths.rb +2 -2
- data/lib/luban/deployment/cli/package/worker.rb +3 -6
- data/lib/luban/deployment/cli/service/controller.rb +35 -5
- data/lib/luban/deployment/cli/service/worker.rb +3 -11
- data/lib/luban/deployment/helpers/generator.rb +3 -3
- data/lib/luban/deployment/parameters.rb +0 -4
- data/lib/luban/deployment/templates/application/config/deploy/__stage.rb.erb +1 -1
- data/lib/luban/deployment/templates/application/config/deploy.rb.erb +1 -1
- data/lib/luban/deployment/version.rb +1 -1
- data/lib/luban/deployment/worker/base.rb +7 -0
- 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: 1869e9e885d7001c5da72cb20649de3efe0373aa
|
4
|
+
data.tar.gz: 4fa710ce988a9dd6abe9b7ab099504851b25f8da
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: dc8d972f086c40b6bab462d389d685263d56bc44925ca41789ab963defe7c04a6f0348beeffeceb748d5ec8b7e298e676d3a51542ef98bb50b695a08d411862d
|
7
|
+
data.tar.gz: a657dfb9403ffaeee93f2abe34c1dee081058d7a84053422f6ec2bf700c09b1ae54a2890ec082b305374f1562f9f489e2ecd6eae739d1b005ee5b9983b236eac
|
data/CHANGELOG.md
CHANGED
@@ -1,6 +1,33 @@
|
|
1
1
|
# Change log
|
2
2
|
|
3
|
-
## Version 0.
|
3
|
+
## Version 0.6.0 (Jul 08, 2016)
|
4
|
+
|
5
|
+
New features:
|
6
|
+
* Added support for Cluster in Service::Controller
|
7
|
+
* Added control & configuration support for application if it has its own source code
|
8
|
+
|
9
|
+
Minor enhancements:
|
10
|
+
* Ensured profile updates with the updated release info passed thru task to Configurator
|
11
|
+
* Refactored and standardized the following metadata for worker task:
|
12
|
+
* :name, :full_name, :version:, :major_version, :patch_level
|
13
|
+
* Created correponding instance methods with proper prefix for worker classes:
|
14
|
+
* Worker::Base with prefix "target_"
|
15
|
+
* Package::Worker with prefix "package_"
|
16
|
+
* Service::Worker with prefix "service_"
|
17
|
+
* Application::Worker with prefix "application_"
|
18
|
+
* Updated binstubs after source code deployment in case any new bins are deployed
|
19
|
+
* Made task dispatcher method as protected
|
20
|
+
* Removed two unnecessary parameters: :log_format and :log_level
|
21
|
+
* Refactored method #default_templates_path in a DRY way
|
22
|
+
* Minor code cleanup
|
23
|
+
|
24
|
+
Bug fixes:
|
25
|
+
* Returned revision as nill if any unexpected errors occur during revision fetching for Git
|
26
|
+
* Do not create symlinks for linked_dirs when publishing application profile
|
27
|
+
* Fixed duplicate result output when output format is not blakchole
|
28
|
+
* Made task dispatcher methods as protected
|
29
|
+
|
30
|
+
## Version 0.5.5 (Jun 29, 2016)
|
4
31
|
|
5
32
|
Minor enhancements:
|
6
33
|
* Refactored app/service profile templates initialization
|
@@ -15,13 +42,15 @@ Minor enhancements:
|
|
15
42
|
|
16
43
|
## Version 0.5.1 (Jun 24, 2016)
|
17
44
|
|
18
|
-
|
45
|
+
New features:
|
19
46
|
* Added subcommands #init to initialize deployment application/service profiles
|
47
|
+
|
48
|
+
Minor enhancements:
|
20
49
|
* Added .gitignore file to the deployment project skeleton
|
21
50
|
|
22
51
|
## Version 0.5.0 (Jun 22, 2016)
|
23
52
|
|
24
|
-
|
53
|
+
New features:
|
25
54
|
* Added a series of subcommands, #init to
|
26
55
|
* Initialize a Luban deployment project
|
27
56
|
* Initialize a Luban deployment application
|
data/README.md
CHANGED
@@ -30,7 +30,7 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
|
|
30
30
|
|
31
31
|
## Contributing
|
32
32
|
|
33
|
-
1. Fork it ( https://github.com/
|
33
|
+
1. Fork it ( https://github.com/lubanrb/luban/fork )
|
34
34
|
2. Create your feature branch (`git checkout -b my-new-feature`)
|
35
35
|
3. Commit your changes (`git commit -am 'Add some feature'`)
|
36
36
|
4. Push to the branch (`git push origin my-new-feature`)
|
@@ -69,60 +69,87 @@ module Luban
|
|
69
69
|
opts[:roles] << scm_role unless scm_role.nil?
|
70
70
|
promptless_authen!(args: args, opts: opts)
|
71
71
|
end
|
72
|
+
dispatch_task :public_key!, to: :authenticator, as: :public_key, locally: true
|
73
|
+
dispatch_task :promptless_authen!, to: :authenticator, as: :promptless_authen
|
72
74
|
|
73
75
|
def setup(args:, opts:)
|
74
76
|
show_app_environment
|
75
77
|
promptless_authen(args: args, opts: opts)
|
76
78
|
setup!(args: args, opts: opts)
|
77
79
|
end
|
80
|
+
dispatch_task :setup!, to: :constructor, as: :setup
|
78
81
|
|
79
82
|
def build(args:, opts:)
|
80
83
|
show_app_environment
|
81
|
-
install_all(args: args, opts: opts)
|
84
|
+
install_all!(args: args, opts: opts)
|
82
85
|
build_repositories(args: args, opts: opts)
|
83
86
|
end
|
84
87
|
|
85
88
|
def destroy(args:, opts:)
|
86
|
-
uninstall_all(args: args, opts: opts)
|
89
|
+
uninstall_all!(args: args, opts: opts)
|
87
90
|
destroy!(args: args, opts: opts)
|
88
91
|
end
|
89
92
|
|
93
|
+
def destroy_project(args:, opts:)
|
94
|
+
show_app_environment
|
95
|
+
destroy!(args: args, opts: opts.merge(destroy_project: true))
|
96
|
+
end
|
97
|
+
dispatch_task :destroy!, to: :constructor, as: :destroy
|
98
|
+
|
90
99
|
%i(install_all uninstall_all).each do |action|
|
91
|
-
define_method(action) do |args:, opts:|
|
92
|
-
packages.each_value { |p| p.send(
|
100
|
+
define_method("#{action}!") do |args:, opts:|
|
101
|
+
packages.each_value { |p| p.send(action, args: args, opts: opts) }
|
93
102
|
end
|
103
|
+
protected "#{action}!"
|
94
104
|
end
|
95
105
|
|
96
|
-
(Luban::Deployment::Command::Tasks::Install::Actions -
|
97
|
-
%i(setup build destroy)).each do |action|
|
106
|
+
(Luban::Deployment::Command::Tasks::Install::Actions - %i(setup build destroy)).each do |action|
|
98
107
|
define_method(action) do |args:, opts:|
|
99
108
|
show_app_environment
|
100
|
-
|
109
|
+
send("#{action}!", args: args, opts: opts)
|
101
110
|
end
|
102
|
-
end
|
103
111
|
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
112
|
+
define_method("#{action}!") do |args:, opts:|
|
113
|
+
packages.each_value { |p| p.send(action, args: args, opts: opts) }
|
114
|
+
end
|
115
|
+
protected "#{action}!"
|
108
116
|
end
|
109
117
|
|
110
|
-
|
111
|
-
|
112
|
-
|
118
|
+
alias_method :cleanup_packages!, :cleanup!
|
119
|
+
def cleanup!(args:, opts:)
|
120
|
+
cleanup_packages!(args: args, opts: opts)
|
121
|
+
cleanup_application!(args: args, opts: opts)
|
113
122
|
end
|
123
|
+
protected :cleanup!
|
124
|
+
dispatch_task :cleanup_application!, to: :constructor, as: :cleanup
|
114
125
|
|
115
126
|
def deploy(args:, opts:)
|
116
127
|
show_app_environment
|
128
|
+
if has_source?
|
129
|
+
release = deploy_release(args: args, opts: opts)
|
130
|
+
opts = opts.merge(release: release)
|
131
|
+
end
|
117
132
|
deploy_profile(args: args, opts: opts) if has_profile?
|
118
|
-
deploy_release(args: args, opts: opts) if has_source?
|
119
133
|
end
|
120
134
|
|
121
135
|
Luban::Deployment::Command::Tasks::Control::Actions.each do |action|
|
122
136
|
define_method(action) do |args:, opts:|
|
123
137
|
show_app_environment
|
124
|
-
|
138
|
+
send("#{action}!", args: args, opts: opts)
|
139
|
+
end
|
140
|
+
|
141
|
+
define_method("#{action}!") do |args:, opts:|
|
142
|
+
send("application_#{action}!", args: args, opts: opts) if has_source?
|
143
|
+
send("service_#{action}!", args: args, opts: opts)
|
144
|
+
end
|
145
|
+
protected "#{action}!"
|
146
|
+
|
147
|
+
dispatch_task "application_#{action}!", to: :controller, as: action
|
148
|
+
|
149
|
+
define_method("service_#{action}!") do |args:, opts:|
|
150
|
+
services.each_value { |s| s.send(action, args: args, opts: opts) }
|
125
151
|
end
|
152
|
+
protected "service_#{action}!"
|
126
153
|
end
|
127
154
|
|
128
155
|
def init_profiles(args:, opts:)
|
@@ -136,6 +163,7 @@ module Luban
|
|
136
163
|
init_profile!(args: args, opts: opts.merge(default_templates: default_templates))
|
137
164
|
end
|
138
165
|
end
|
166
|
+
dispatch_task :init_profile!, to: :configurator, as: :init_profile, locally: true
|
139
167
|
|
140
168
|
def init_service_profiles(args:, opts:)
|
141
169
|
return if opts[:app]
|
@@ -171,6 +199,11 @@ module Luban
|
|
171
199
|
set_default_profile
|
172
200
|
end
|
173
201
|
|
202
|
+
def set_default_application_parameters
|
203
|
+
super
|
204
|
+
linked_dirs.push('log', 'pids')
|
205
|
+
end
|
206
|
+
|
174
207
|
def set_default_profile
|
175
208
|
if config_finder[:application].has_profile?
|
176
209
|
profile(config_finder[:application].stage_profile_path, scm: :rsync)
|
@@ -204,7 +237,7 @@ module Luban
|
|
204
237
|
end
|
205
238
|
|
206
239
|
def compose_task_options(opts)
|
207
|
-
super.merge(name:
|
240
|
+
super.merge(name: name.to_s, packages: packages).tap do |o|
|
208
241
|
o.merge!(version: source_version) if has_source?
|
209
242
|
end
|
210
243
|
end
|
@@ -213,14 +246,11 @@ module Luban
|
|
213
246
|
puts "#{display_name} in #{parent.class.name}"
|
214
247
|
end
|
215
248
|
|
216
|
-
%i(setup destroy cleanup).each do |task|
|
217
|
-
dispatch_task "#{task}!", to: :constructor, as: task
|
218
|
-
end
|
219
|
-
|
220
249
|
def build_repositories(args:, opts:)
|
221
250
|
build_repository!(args: args, opts: opts.merge(repository: profile)) if has_profile?
|
222
251
|
build_repository!(args: args, opts: opts.merge(repository: source)) if has_source?
|
223
252
|
end
|
253
|
+
dispatch_task :build_repository!, to: :repository, as: :build, locally: true
|
224
254
|
|
225
255
|
def deploy_profile(args:, opts:)
|
226
256
|
update_profile(args: args, opts: opts)
|
@@ -231,9 +261,12 @@ module Luban
|
|
231
261
|
update_profile!(args: args, opts: opts)
|
232
262
|
services.each_value { |s| s.send(:update_profile, args: args, opts: opts) }
|
233
263
|
end
|
264
|
+
dispatch_task :update_profile!, to: :configurator, as: :update_profile, locally: true
|
234
265
|
|
235
266
|
def deploy_release(args:, opts:)
|
236
|
-
deploy_release!(args: args, opts: opts.merge(repository: source))
|
267
|
+
deploy_release!(args: args, opts: opts.merge(repository: source)).tap do
|
268
|
+
binstubs!(args: args, opts: opts)
|
269
|
+
end
|
237
270
|
end
|
238
271
|
|
239
272
|
def deploy_release!(args:, opts:)
|
@@ -244,12 +277,6 @@ module Luban
|
|
244
277
|
end
|
245
278
|
end
|
246
279
|
alias_method :deploy_profile!, :deploy_release!
|
247
|
-
|
248
|
-
dispatch_task :promptless_authen!, to: :authenticator, as: :promptless_authen
|
249
|
-
dispatch_task :public_key!, to: :authenticator, as: :public_key, locally: true
|
250
|
-
dispatch_task :init_profile!, to: :configurator, as: :init_profile, locally: true
|
251
|
-
dispatch_task :update_profile!, to: :configurator, as: :update_profile, locally: true
|
252
|
-
dispatch_task :build_repository!, to: :repository, as: :build, locally: true
|
253
280
|
dispatch_task :package_release!, to: :repository, as: :package, locally: true
|
254
281
|
dispatch_task :publish_release!, to: :publisher, as: :publish
|
255
282
|
end
|
@@ -3,6 +3,13 @@ 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
|
6
13
|
end
|
7
14
|
end
|
8
15
|
end
|
@@ -43,11 +43,11 @@ module Luban
|
|
43
43
|
end
|
44
44
|
|
45
45
|
def bundle_path
|
46
|
-
@bundle_path ||= shared_path.join('vendor'
|
46
|
+
@bundle_path ||= shared_path.join('vendor', 'bundle')
|
47
47
|
end
|
48
48
|
|
49
49
|
def gems_cache_path
|
50
|
-
@gems_cache_path ||= shared_path.join('vendor'
|
50
|
+
@gems_cache_path ||= shared_path.join('vendor', 'cache')
|
51
51
|
end
|
52
52
|
|
53
53
|
def bundle_without
|
@@ -118,7 +118,6 @@ module Luban
|
|
118
118
|
|
119
119
|
def create_symlinks
|
120
120
|
send("create_#{release_type}_symlinks")
|
121
|
-
create_shared_symlinks_for(:directory, linked_dirs)
|
122
121
|
create_shared_symlinks_for(:directory, bundle_linked_dirs) if file?(gemfile)
|
123
122
|
end
|
124
123
|
|
@@ -129,7 +128,7 @@ module Luban
|
|
129
128
|
|
130
129
|
def create_app_symlinks
|
131
130
|
create_release_symlink(app_path)
|
132
|
-
create_shared_symlinks_for(:directory, %w(profile))
|
131
|
+
create_shared_symlinks_for(:directory, linked_dirs | %w(profile))
|
133
132
|
create_shared_symlinks_for(:file, linked_files)
|
134
133
|
end
|
135
134
|
|
@@ -23,11 +23,11 @@ module Luban
|
|
23
23
|
end
|
24
24
|
|
25
25
|
def clone_path
|
26
|
-
@clone_path ||= workspace_path.join('repositories'
|
26
|
+
@clone_path ||= workspace_path.join('repositories', type)
|
27
27
|
end
|
28
28
|
|
29
29
|
def releases_path
|
30
|
-
@releases_path ||= workspace_path.join('releases'
|
30
|
+
@releases_path ||= workspace_path.join('releases', type)
|
31
31
|
end
|
32
32
|
|
33
33
|
def release_package_path
|
@@ -67,7 +67,7 @@ module Luban
|
|
67
67
|
# release: copy the contents of cloned repository onto the release path
|
68
68
|
[:available?, :cloned?, :fetch_revision, :clone, :update, :release].each do |method|
|
69
69
|
define_method(method) do
|
70
|
-
raise NotImplementedError, "
|
70
|
+
raise NotImplementedError, "#{self.class.name}##{__method__} is an abstract method."
|
71
71
|
end
|
72
72
|
end
|
73
73
|
|
@@ -75,12 +75,12 @@ module Luban
|
|
75
75
|
assure_dirs(clone_path, releases_path)
|
76
76
|
if cloned? and !force?
|
77
77
|
update_revision
|
78
|
-
update_result "Skipped! Local #{type} repository has been built ALREADY.", status: :skipped
|
78
|
+
update_result "Skipped! Local #{type} repository has been built ALREADY (#{revision}).", status: :skipped
|
79
79
|
else
|
80
80
|
if available?
|
81
81
|
if build!
|
82
82
|
update_revision
|
83
|
-
update_result "Successfully built local #{type} repository."
|
83
|
+
update_result "Successfully built local #{type} repository (#{revision})."
|
84
84
|
else
|
85
85
|
update_result "FAILED to build local #{type} repository!", status: :failed, level: :error
|
86
86
|
end
|
@@ -182,4 +182,4 @@ module Luban
|
|
182
182
|
end
|
183
183
|
end
|
184
184
|
end
|
185
|
-
end
|
185
|
+
end
|
@@ -22,7 +22,7 @@ module Luban
|
|
22
22
|
end
|
23
23
|
|
24
24
|
def fetch_revision
|
25
|
-
within(clone_path) { capture(git_cmd, "rev-parse --short=#{rev_size} #{ref}") }
|
25
|
+
within(clone_path) { capture(git_cmd, "rev-parse --short=#{rev_size} #{ref} 2>/dev/null") }
|
26
26
|
#within(clone_path) { capture(git_cmd, "rev-list --max-count=1 --abbrev-commit --abbrev=rev_size #{ref}") }
|
27
27
|
end
|
28
28
|
|
@@ -5,16 +5,21 @@ module Luban
|
|
5
5
|
include Luban::Deployment::Worker::Paths::Remote
|
6
6
|
include Luban::Deployment::Service::Worker::Base
|
7
7
|
|
8
|
-
|
9
|
-
|
8
|
+
%i(name full_name version major_version patch_level).each do |method|
|
9
|
+
define_method("application_#{method}") { send("target_#{method}") }
|
10
10
|
end
|
11
11
|
|
12
|
-
def
|
13
|
-
|
12
|
+
def packages; task.opts.packages; end
|
13
|
+
|
14
|
+
def package_version(package_name); packages[package_name.to_sym].current_version; end
|
15
|
+
|
16
|
+
def package_path(package_name)
|
17
|
+
@package_path ||= luban_install_path.join('pkg', package_name.to_s, 'versions',
|
18
|
+
package_version(package_name))
|
14
19
|
end
|
15
20
|
|
16
|
-
def
|
17
|
-
@
|
21
|
+
def package_bin_path(package_name)
|
22
|
+
@package_bin_path ||= package_path(package_name).join('bin')
|
18
23
|
end
|
19
24
|
end
|
20
25
|
end
|
@@ -177,6 +177,8 @@ module Luban
|
|
177
177
|
run_task(cmd: as, args: args, opts: opts, locally: locally,
|
178
178
|
worker_class: self.class.worker_class(to), &blk)
|
179
179
|
end
|
180
|
+
|
181
|
+
protected task
|
180
182
|
end
|
181
183
|
end
|
182
184
|
|
@@ -204,11 +206,15 @@ module Luban
|
|
204
206
|
end
|
205
207
|
mutex.synchronize { result << r }
|
206
208
|
end
|
207
|
-
print_task_result
|
209
|
+
print_task_result(result) if opts[:format] == :blackhole
|
208
210
|
locally ? result.first[:__return__] : result
|
209
211
|
end
|
210
212
|
|
211
|
-
def default_templates_path
|
213
|
+
def default_templates_path(base_path = nil)
|
214
|
+
return @default_templates_path if base_path.nil?
|
215
|
+
path = Pathname.new(base_path).dirname.join('templates')
|
216
|
+
@default_templates_path ||= path.exist? ? path.realpath : nil
|
217
|
+
end
|
212
218
|
|
213
219
|
def default_templates
|
214
220
|
default_templates_path.nil? ? [] : default_templates_path.children
|
@@ -316,7 +322,7 @@ module Luban
|
|
316
322
|
def compose_task_options(opts); opts.clone; end
|
317
323
|
|
318
324
|
def run(roles: luban_roles, hosts: nil, once: false,
|
319
|
-
dry_run: false, format
|
325
|
+
dry_run: false, format:, verbosity:, **opts)
|
320
326
|
configure_backend(dry_run: dry_run, format: format, verbosity: verbosity)
|
321
327
|
hosts = Array(hosts)
|
322
328
|
servers = select_servers(roles, hosts)
|
@@ -49,7 +49,7 @@ module Luban
|
|
49
49
|
end
|
50
50
|
|
51
51
|
def install_log_path
|
52
|
-
@install_log_path ||= package_path.join('log'
|
52
|
+
@install_log_path ||= package_path.join('log', package_full_name)
|
53
53
|
end
|
54
54
|
|
55
55
|
def install_log_file_path
|
@@ -62,4 +62,4 @@ module Luban
|
|
62
62
|
end
|
63
63
|
end
|
64
64
|
end
|
65
|
-
end
|
65
|
+
end
|
@@ -26,12 +26,9 @@ module Luban
|
|
26
26
|
end
|
27
27
|
end
|
28
28
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
def package_version; task.opts.version; end
|
33
|
-
def package_major_version; task.opts.major_version; end
|
34
|
-
def package_patch_level; task.opts.patch_level; end
|
29
|
+
%i(name full_name version major_version patch_level).each do |method|
|
30
|
+
define_method("package_#{method}") { send("target_#{method}") }
|
31
|
+
end
|
35
32
|
|
36
33
|
def parent; task.opts.parent; end
|
37
34
|
def child?; !parent.nil?; end
|
@@ -34,8 +34,7 @@ module Luban
|
|
34
34
|
end
|
35
35
|
|
36
36
|
def monitor_executable
|
37
|
-
@monitor_executable ||= env_path.join("#{stage}.#{process_monitor[:env]}")
|
38
|
-
join('bin').join(process_monitor[:name])
|
37
|
+
@monitor_executable ||= env_path.join("#{stage}.#{process_monitor[:env]}", 'bin', process_monitor[:name])
|
39
38
|
end
|
40
39
|
|
41
40
|
def monitor_command
|
@@ -174,11 +173,11 @@ module Luban
|
|
174
173
|
|
175
174
|
def check_process!
|
176
175
|
if pid_file_missing?
|
177
|
-
"#{service_full_name}: started but PID file
|
176
|
+
"#{service_full_name}: started but PID file(s) do NOT exist in #{pids_path}"
|
178
177
|
elsif process_started?
|
179
|
-
"#{service_full_name}: started (
|
178
|
+
"#{service_full_name}: started - PID(s) #{pid})"
|
180
179
|
elsif pid_file_orphaned?
|
181
|
-
"#{service_full_name}: stopped but PID file
|
180
|
+
"#{service_full_name}: stopped but PID file(s) exist in #{pids_path}"
|
182
181
|
else
|
183
182
|
"#{service_full_name}: stopped"
|
184
183
|
end
|
@@ -209,6 +208,37 @@ module Luban
|
|
209
208
|
end
|
210
209
|
end
|
211
210
|
|
211
|
+
module Cluster
|
212
|
+
def pid_file_pattern
|
213
|
+
raise NotImplementedError, "#{self.class.name}#pid_file_pattern is an abstract method."
|
214
|
+
end
|
215
|
+
|
216
|
+
def pid_files_path
|
217
|
+
pids_path.join(pid_file_pattern)
|
218
|
+
end
|
219
|
+
|
220
|
+
def pid_files
|
221
|
+
capture(:ls, "-A #{pid_files_path} 2>/dev/null").split.map do |f|
|
222
|
+
Pathname.new(f)
|
223
|
+
end
|
224
|
+
end
|
225
|
+
|
226
|
+
def pids
|
227
|
+
pid_files.collect { |pid_file| capture(:cat, "#{pid_file} 2>/dev/null") }
|
228
|
+
end
|
229
|
+
|
230
|
+
def pid; pids; end
|
231
|
+
|
232
|
+
def pid_file_exists?
|
233
|
+
# Any pid file is NOT zero size
|
234
|
+
pid_files.any? { |pid_file| file?(pid_file, "-s") }
|
235
|
+
end
|
236
|
+
|
237
|
+
def remove_orphaned_pid_file
|
238
|
+
rm(pid_files_path) if pid_file_orphaned?
|
239
|
+
end
|
240
|
+
end
|
241
|
+
|
212
242
|
include Base
|
213
243
|
end
|
214
244
|
end
|
@@ -3,16 +3,8 @@ module Luban
|
|
3
3
|
module Service
|
4
4
|
class Worker < Luban::Deployment::Package::Worker
|
5
5
|
module Base
|
6
|
-
|
7
|
-
|
8
|
-
end
|
9
|
-
|
10
|
-
def service_version
|
11
|
-
@service_version ||= package_version
|
12
|
-
end
|
13
|
-
|
14
|
-
def service_full_name
|
15
|
-
@service_full_name ||= package_full_name
|
6
|
+
%i(name full_name version major_version patch_level).each do |method|
|
7
|
+
define_method("service_#{method}") { send("target_#{method}") }
|
16
8
|
end
|
17
9
|
|
18
10
|
def service_entry
|
@@ -20,7 +12,7 @@ module Luban
|
|
20
12
|
end
|
21
13
|
|
22
14
|
def profile_path
|
23
|
-
@profile_path ||= shared_path.join('profile'
|
15
|
+
@profile_path ||= shared_path.join('profile', service_name)
|
24
16
|
end
|
25
17
|
|
26
18
|
def log_path
|
@@ -45,7 +45,7 @@ module Luban
|
|
45
45
|
|
46
46
|
def skeletons_path
|
47
47
|
@skeletons_path ||=
|
48
|
-
Pathname.new(__FILE__).dirname.join('..'
|
48
|
+
Pathname.new(__FILE__).dirname.join('..', 'templates').realpath
|
49
49
|
end
|
50
50
|
|
51
51
|
def copy_dir(src_path, dst_path, stages: [], depth: 1)
|
@@ -123,12 +123,12 @@ module Luban
|
|
123
123
|
@application_target_path ||= apps_path.join(application)
|
124
124
|
end
|
125
125
|
|
126
|
-
def
|
126
|
+
def application_class_name
|
127
127
|
"#{project}:#{application}".camelcase
|
128
128
|
end
|
129
129
|
|
130
130
|
def create_application_skeleton
|
131
|
-
puts "Creating skeleton for #{stage} application #{
|
131
|
+
puts "Creating skeleton for #{stage} application #{application_class_name}"
|
132
132
|
copy_dir(application_skeleton_path, application_target_path, stages: [stage])
|
133
133
|
end
|
134
134
|
end
|
@@ -67,8 +67,6 @@ module Luban
|
|
67
67
|
parameter :sshkit_backend
|
68
68
|
parameter :authen_key_type
|
69
69
|
parameter :default_env
|
70
|
-
parameter :log_format
|
71
|
-
parameter :log_level
|
72
70
|
parameter :pty
|
73
71
|
parameter :connection_timeout
|
74
72
|
parameter :ssh_options
|
@@ -81,8 +79,6 @@ module Luban
|
|
81
79
|
set_default :sshkit_backend, SSHKit::Backend::Netssh
|
82
80
|
set_default :authen_key_type, 'rsa'
|
83
81
|
set_default :default_env, { path: '$PATH:/usr/local/bin' }
|
84
|
-
set_default :log_format, :pretty
|
85
|
-
set_default :log_level, :info
|
86
82
|
set_default :pty, false
|
87
83
|
set_default :connection_timeout, 30 # second
|
88
84
|
set_default :ssh_options, {}
|
@@ -1 +1 @@
|
|
1
|
-
# Deployment configuration for application <%=
|
1
|
+
# Deployment configuration for application <%= application_class_name %>
|
@@ -29,6 +29,13 @@ module Luban
|
|
29
29
|
@env_name ||= "#{stage}.#{project}/#{application}"
|
30
30
|
end
|
31
31
|
|
32
|
+
def target_name; task.opts.name; end
|
33
|
+
def target_full_name; "#{target_name}-#{target_version}"; end
|
34
|
+
|
35
|
+
def target_version; task.opts.version; end
|
36
|
+
def target_major_version; task.opts.major_version || target_version; end
|
37
|
+
def target_patch_level; task.opts.patch_level || ''; end
|
38
|
+
|
32
39
|
def run
|
33
40
|
update_result(__return__: @run_blk ? run_with_block : run_with_command).to_h
|
34
41
|
end
|
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.
|
4
|
+
version: 0.6.0
|
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-
|
11
|
+
date: 2016-07-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: luban-cli
|