luban 0.9.9 → 0.9.10
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 +18 -0
- data/lib/luban/deployment/cli/application/base.rb +22 -16
- data/lib/luban/deployment/cli/command.rb +6 -2
- data/lib/luban/deployment/cli/package/installer/install.rb +1 -1
- data/lib/luban/deployment/cli/project.rb +3 -9
- data/lib/luban/deployment/cli/service/base.rb +27 -10
- data/lib/luban/deployment/configuration/core.rb +5 -1
- data/lib/luban/deployment/helpers/configuration.rb +1 -1
- data/lib/luban/deployment/helpers/utils.rb +3 -3
- data/lib/luban/deployment/parameters.rb +33 -57
- data/lib/luban/deployment/version.rb +1 -1
- data/lib/luban/deployment/worker/base.rb +9 -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: 9d25dda1f3728164c6c4dbba1cbfffc26748f9ce
|
4
|
+
data.tar.gz: 2967b210dc597d9293418e9005f90f705fe4e380
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 812bbd83cc2575d2908fd1241274d069ecb60386fe1f46f07084c604fc3aede2a56d517e20e6497551358cbbc0f1ce2798bd2e0a897cac92b2a744a9f2f02e48
|
7
|
+
data.tar.gz: 7bd9bb1d13b426ac1d997d5a2c9f1c3138a2114854ccf24539623bacfc346b988db89dd949d39a391e86b09aed604498fe7a3c32e4f71b9631a64e8910a8471e
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,23 @@
|
|
1
1
|
# Change log
|
2
2
|
|
3
|
+
## Version 0.9.10 (Oct 24, 2016)
|
4
|
+
|
5
|
+
Minor enhancements:
|
6
|
+
* Refactored and enhanced the design and implementation of parameters in a deployment project
|
7
|
+
* Supported default value for a given parameter
|
8
|
+
* set method for default value should be in the form of "set_default_for_parameter_name"
|
9
|
+
* any methods following the above convention will be called during default value setup
|
10
|
+
* Supported parameter validation by convention
|
11
|
+
* validation method name should be in the form of "validate_for_parameter_name"
|
12
|
+
* any methods following the above convention will be called during parameter validation
|
13
|
+
* Injected parameters from service package, if any, into the application
|
14
|
+
* Automated default source handling and thus no more manual set_default_source
|
15
|
+
* Two default source paths under application base path and stage config path
|
16
|
+
|
17
|
+
|
18
|
+
Bug fixes:
|
19
|
+
* Ensured linked dirs to be created in package installer
|
20
|
+
|
3
21
|
## Version 0.9.9 (Oct 20, 2016)
|
4
22
|
|
5
23
|
Bug fixes:
|
@@ -80,7 +80,10 @@ module Luban
|
|
80
80
|
command(name, base: Luban::Deployment::Package::Base.package_class(name))
|
81
81
|
end
|
82
82
|
pkg.update_package_options(version, opts.merge(packages: packages))
|
83
|
-
|
83
|
+
if pkg.is_a?(Luban::Deployment::Service::Base)
|
84
|
+
services[name] = pkg
|
85
|
+
add_service_parameters(pkg)
|
86
|
+
end
|
84
87
|
packages[name] = pkg
|
85
88
|
end
|
86
89
|
alias_method :require_package, :package
|
@@ -110,7 +113,11 @@ module Luban
|
|
110
113
|
end
|
111
114
|
|
112
115
|
def default_source_path
|
113
|
-
@default_source_path ||=
|
116
|
+
@default_source_path ||=
|
117
|
+
[config_finder[:application].stage_config_path.join('app'),
|
118
|
+
config_finder[:application].base_path.join('app')].find do |source_path|
|
119
|
+
File.directory?(source_path)
|
120
|
+
end
|
114
121
|
end
|
115
122
|
|
116
123
|
def default_source?
|
@@ -275,26 +282,19 @@ module Luban
|
|
275
282
|
@profile_opts = {}
|
276
283
|
end
|
277
284
|
|
278
|
-
def validate_parameters
|
279
|
-
super
|
280
|
-
validate_project_parameters
|
281
|
-
validate_application_parameters
|
282
|
-
end
|
283
|
-
|
284
285
|
def set_default_parameters
|
286
|
+
set :application, self.class.name.split(':').last.snakecase
|
285
287
|
super
|
286
|
-
set_default_project_parameters
|
287
|
-
set_default :application, self.class.name.split(':').last.snakecase
|
288
|
-
set_default_application_parameters
|
289
|
-
set_default_profile
|
290
288
|
end
|
291
289
|
|
292
|
-
def
|
293
|
-
|
294
|
-
|
290
|
+
def set_default_for_source
|
291
|
+
unless default_source_path.nil?
|
292
|
+
source(default_source_path, scm: :rsync)
|
293
|
+
release(stage, current: true)
|
294
|
+
end
|
295
295
|
end
|
296
296
|
|
297
|
-
def
|
297
|
+
def set_default_for_profile
|
298
298
|
if config_finder[:application].has_profile?
|
299
299
|
profile(config_finder[:application].stage_profile_path, scm: :rsync)
|
300
300
|
profile_release(stage, current: true)
|
@@ -317,6 +317,12 @@ module Luban
|
|
317
317
|
setup_crontab_tasks
|
318
318
|
end
|
319
319
|
|
320
|
+
def add_service_parameters(service)
|
321
|
+
service.class.parameters.each_pair do |param, default|
|
322
|
+
singleton_class.send(:parameter, param, default: default)
|
323
|
+
end
|
324
|
+
end
|
325
|
+
|
320
326
|
def setup_init_profiles
|
321
327
|
_services = services.keys
|
322
328
|
task :init do
|
@@ -365,13 +365,17 @@ module Luban
|
|
365
365
|
end
|
366
366
|
|
367
367
|
def set_default_parameters
|
368
|
-
|
368
|
+
find_instance_methods(/^set_default_for_/).each { |m| send(m) }
|
369
|
+
end
|
370
|
+
|
371
|
+
def find_instance_methods(pattern)
|
372
|
+
singleton_class.instance_methods.select { |m| m.to_s =~ pattern }.reverse
|
369
373
|
end
|
370
374
|
|
371
375
|
def load_configuration; end
|
372
376
|
|
373
377
|
def validate_parameters
|
374
|
-
|
378
|
+
find_instance_methods(/^validate_for_/).each { |m| send(m) }
|
375
379
|
end
|
376
380
|
|
377
381
|
def load_libraries; end
|
@@ -98,18 +98,12 @@ module Luban
|
|
98
98
|
|
99
99
|
protected
|
100
100
|
|
101
|
-
def validate_parameters
|
102
|
-
super
|
103
|
-
validate_project_parameters
|
104
|
-
end
|
105
|
-
|
106
101
|
def set_default_parameters
|
107
|
-
|
108
|
-
|
109
|
-
set_default :project, self.class.name.split('::').last.snakecase
|
110
|
-
set_default_project_parameters
|
102
|
+
set :stage, self.class.name.split('::').first.snakecase
|
103
|
+
set :project, self.class.name.split('::').last.snakecase
|
111
104
|
@passwords = {}
|
112
105
|
@passwords_mutex = Mutex.new
|
106
|
+
super
|
113
107
|
end
|
114
108
|
|
115
109
|
def load_libraries
|
@@ -5,17 +5,34 @@ module Luban
|
|
5
5
|
include Luban::Deployment::Command::Tasks::Control
|
6
6
|
include Luban::Deployment::Command::Tasks::Monitor
|
7
7
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
8
|
+
class << self
|
9
|
+
def inherited(subclass)
|
10
|
+
super
|
11
|
+
# Ensure parameters from base class
|
12
|
+
# got inherited to its subclasses
|
13
|
+
params = instance_variable_get('@parameters')
|
14
|
+
subclass.instance_variable_set('@parameters', params.nil? ? {} : params.clone)
|
15
|
+
end
|
16
|
+
|
17
|
+
attr_reader :parameters
|
18
|
+
|
19
|
+
def parameter(param, default: nil)
|
20
|
+
super
|
21
|
+
parameters[param] = default
|
15
22
|
end
|
16
|
-
|
17
|
-
|
18
|
-
|
23
|
+
|
24
|
+
def service_action(action, dispatch_to: nil, as: action, locally: false, &blk)
|
25
|
+
define_method(action) do |args:, opts:|
|
26
|
+
if current_version
|
27
|
+
send("#{__method__}!", args: args, opts: opts.merge(version: current_version))
|
28
|
+
else
|
29
|
+
abort "Aborted! No current version of #{display_name} is specified."
|
30
|
+
end
|
31
|
+
end
|
32
|
+
unless dispatch_to.nil?
|
33
|
+
dispatch_task "#{action}!", to: dispatch_to, as: as, locally: locally, &blk
|
34
|
+
protected "#{action}!"
|
35
|
+
end
|
19
36
|
end
|
20
37
|
end
|
21
38
|
|
@@ -14,7 +14,7 @@ module Luban
|
|
14
14
|
end
|
15
15
|
|
16
16
|
def set_default(key, value)
|
17
|
-
set(key, value)
|
17
|
+
set(key, value) if @variables[key].nil?
|
18
18
|
end
|
19
19
|
|
20
20
|
def delete(key)
|
@@ -37,6 +37,10 @@ module Luban
|
|
37
37
|
@variables.keys
|
38
38
|
end
|
39
39
|
|
40
|
+
def has_key?(key)
|
41
|
+
@variables.has_key?(key)
|
42
|
+
end
|
43
|
+
|
40
44
|
def role(name, hosts, **properties)
|
41
45
|
if name == :all
|
42
46
|
raise ArgumentError, 'Reserved role name, :all, is NOT allowed to use.'
|
@@ -157,7 +157,6 @@ module Luban
|
|
157
157
|
end
|
158
158
|
|
159
159
|
def load_stage_configuration
|
160
|
-
target.load_configuration_file(stage_config_file)
|
161
160
|
if File.directory?(stage_config_path)
|
162
161
|
["*.rb", "{packages}/**/*.rb"].each do |pattern|
|
163
162
|
Dir[stage_config_path.join(pattern)].each do |file|
|
@@ -165,6 +164,7 @@ module Luban
|
|
165
164
|
end
|
166
165
|
end
|
167
166
|
end
|
167
|
+
target.load_configuration_file(stage_config_file)
|
168
168
|
end
|
169
169
|
|
170
170
|
def find_template_file(file_name)
|
@@ -194,9 +194,9 @@ module Luban
|
|
194
194
|
Time.now().strftime("%d/%m/%Y %H:%M:%S")
|
195
195
|
end
|
196
196
|
|
197
|
-
def method_missing(sym, *args, &blk)
|
198
|
-
|
199
|
-
end
|
197
|
+
#def method_missing(sym, *args, &blk)
|
198
|
+
# backend.respond_to?(sym) ? backend.send(sym, *args, &blk) : super
|
199
|
+
#end
|
200
200
|
end
|
201
201
|
end
|
202
202
|
end
|
@@ -2,12 +2,12 @@ module Luban
|
|
2
2
|
module Deployment
|
3
3
|
module Parameters
|
4
4
|
module Base
|
5
|
-
def parameter(
|
6
|
-
|
7
|
-
|
8
|
-
value.nil? ? fetch(__method__) : set(__method__, value)
|
9
|
-
end
|
5
|
+
def parameter(param, default: nil)
|
6
|
+
define_method(param) do |value = nil|
|
7
|
+
value.nil? ? fetch(__method__) : set(__method__, value)
|
10
8
|
end
|
9
|
+
define_method("set_default_for_#{param}") { set_default param, default }
|
10
|
+
protected "set_default_for_#{param}"
|
11
11
|
end
|
12
12
|
end
|
13
13
|
|
@@ -20,37 +20,35 @@ module Luban
|
|
20
20
|
mod.extend(Base)
|
21
21
|
end
|
22
22
|
|
23
|
-
parameter :luban_roles
|
24
|
-
parameter :luban_root_path
|
23
|
+
parameter :luban_roles, default: %i(app)
|
24
|
+
parameter :luban_root_path, default: DefaultLubanRootPath
|
25
25
|
|
26
26
|
parameter :stages
|
27
27
|
parameter :applications
|
28
|
-
parameter :env_vars
|
28
|
+
parameter :env_vars, default: ->{ Hash.new }
|
29
29
|
|
30
30
|
parameter :work_dir
|
31
31
|
parameter :apps_path
|
32
32
|
parameter :project
|
33
|
-
parameter :user
|
34
|
-
parameter :config_finder
|
33
|
+
parameter :user, default: ENV['USER']
|
34
|
+
parameter :config_finder, default: ->{ Hash.new }
|
35
35
|
|
36
36
|
protected
|
37
37
|
|
38
|
-
def
|
39
|
-
set_default :luban_roles, %i(app)
|
40
|
-
set_default :luban_root_path, DefaultLubanRootPath
|
41
|
-
set_default :env_vars, {}
|
42
|
-
set_default :user, ENV['USER']
|
43
|
-
set_default :config_finder, {}
|
44
|
-
end
|
45
|
-
|
46
|
-
def validate_general_parameters
|
38
|
+
def validate_for_user
|
47
39
|
if user != ENV['USER']
|
48
40
|
abort "Aborted! Given deployment user (#{user.inspect}) is NOT the current user #{ENV['USER'].inspect}" +
|
49
41
|
"Please switch to the deployment user before any deployments."
|
50
42
|
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def validate_for_project
|
51
46
|
if project.nil?
|
52
47
|
abort "Aborted! Please specify the project name: project 'project name'"
|
53
48
|
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def validate_for_luban_root_path
|
54
52
|
if luban_root_path.is_a?(String)
|
55
53
|
luban_root_path Pathname.new(luban_root_path)
|
56
54
|
end
|
@@ -65,14 +63,14 @@ module Luban
|
|
65
63
|
|
66
64
|
parameter :stage
|
67
65
|
|
68
|
-
parameter :process_monitor
|
69
|
-
parameter :sshkit_backend
|
70
|
-
parameter :authen_key_type
|
71
|
-
parameter :default_env
|
72
|
-
parameter :pty
|
73
|
-
parameter :connection_timeout
|
74
|
-
parameter :ssh_options
|
75
|
-
parameter :use_sudo
|
66
|
+
parameter :process_monitor, default: ->{ Hash.new }
|
67
|
+
parameter :sshkit_backend, default: SSHKit::Backend::Netssh
|
68
|
+
parameter :authen_key_type, default: 'rsa'
|
69
|
+
parameter :default_env, default: ->{ { path: '$PATH:/usr/local/bin' } }
|
70
|
+
parameter :pty, default: false
|
71
|
+
parameter :connection_timeout, default: 30 # second
|
72
|
+
parameter :ssh_options, default: ->{ Hash.new }
|
73
|
+
parameter :use_sudo, default: false # Turn off sudo by default
|
76
74
|
|
77
75
|
def process_monitor_via(monitor, env: "uber/lubmon")
|
78
76
|
monitor = monitor.to_s.downcase
|
@@ -84,25 +82,12 @@ module Luban
|
|
84
82
|
|
85
83
|
protected
|
86
84
|
|
87
|
-
def
|
88
|
-
set_default :process_monitor, {}
|
89
|
-
set_default :sshkit_backend, SSHKit::Backend::Netssh
|
90
|
-
set_default :authen_key_type, 'rsa'
|
91
|
-
set_default :default_env, { path: '$PATH:/usr/local/bin' }
|
92
|
-
set_default :pty, false
|
93
|
-
set_default :connection_timeout, 30 # second
|
94
|
-
set_default :ssh_options, {}
|
95
|
-
set_default :use_sudo, false # Turn off sudo by default
|
96
|
-
|
97
|
-
setup_default_project_config_finder
|
98
|
-
end
|
99
|
-
|
100
|
-
def setup_default_project_config_finder
|
85
|
+
def set_default_for_project_config_finder
|
101
86
|
config_finder[:project] ||=
|
102
87
|
Luban::Deployment::Helpers::Configuration::Finder.project(self)
|
103
88
|
end
|
104
89
|
|
105
|
-
def
|
90
|
+
def validate_for_process_monitor
|
106
91
|
if monitor_defined?
|
107
92
|
if process_monitor[:name].nil?
|
108
93
|
abort "Aborted! Please specify the process monitor."
|
@@ -121,10 +106,10 @@ module Luban
|
|
121
106
|
DefaultLogrotateInterval = 10 # mins
|
122
107
|
|
123
108
|
parameter :application
|
124
|
-
parameter :scm_role
|
125
|
-
parameter :archive_role
|
126
|
-
parameter :logrotate_max_age
|
127
|
-
parameter :logrotate_interval
|
109
|
+
parameter :scm_role, default: :scm
|
110
|
+
parameter :archive_role, default: :archive
|
111
|
+
parameter :logrotate_max_age, default: DefaultLogrotateMaxAge
|
112
|
+
parameter :logrotate_interval, default: (ENV['LUBAN_LOGROTATE_INTERVAL'] || DefaultLogrotateInterval).to_i
|
128
113
|
|
129
114
|
def env_name
|
130
115
|
@env_name ||= "#{stage}.#{project}/#{application}"
|
@@ -144,21 +129,12 @@ module Luban
|
|
144
129
|
|
145
130
|
protected
|
146
131
|
|
147
|
-
def
|
148
|
-
set_default :scm_role, :scm
|
149
|
-
set_default :archive_role, :archive
|
150
|
-
set_default :logrotate_max_age, DefaultLogrotateMaxAge
|
151
|
-
set_default :logrotate_interval,
|
152
|
-
(ENV['LUBAN_LOGROTATE_INTERVAL'] || DefaultLogrotateInterval).to_i
|
153
|
-
setup_default_application_config_finder
|
154
|
-
end
|
155
|
-
|
156
|
-
def setup_default_application_config_finder
|
132
|
+
def set_default_for_application_config_finder
|
157
133
|
config_finder[:application] ||=
|
158
134
|
Luban::Deployment::Helpers::Configuration::Finder.application(self)
|
159
135
|
end
|
160
136
|
|
161
|
-
def
|
137
|
+
def validate_for_application
|
162
138
|
if application.nil?
|
163
139
|
abort "Aborted! Please specify the application name - application 'app name'"
|
164
140
|
end
|
@@ -38,6 +38,15 @@ module Luban
|
|
38
38
|
update_result(__return__: @run_blk ? run_with_block : run_with_command).to_h
|
39
39
|
end
|
40
40
|
|
41
|
+
def method_missing(sym, *args, &blk)
|
42
|
+
if args.empty? and blk.nil? and config.has_key?(sym)
|
43
|
+
singleton_class.send(:define_method, sym) { config.fetch(__method__) }
|
44
|
+
send(sym)
|
45
|
+
else
|
46
|
+
super
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
41
50
|
protected
|
42
51
|
|
43
52
|
def create_task(task)
|
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.9.
|
4
|
+
version: 0.9.10
|
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-10-
|
11
|
+
date: 2016-10-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: luban-cli
|