luban 0.3.3 → 0.3.5
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/.gitignore +1 -0
- data/CHANGELOG.md +16 -1
- data/lib/luban/deployment/cli/application/base.rb +34 -15
- data/lib/luban/deployment/cli/application/builder.rb +2 -2
- data/lib/luban/deployment/cli/application/publisher.rb +15 -4
- data/lib/luban/deployment/cli/application/scm/rsync.rb +1 -1
- data/lib/luban/deployment/cli/command.rb +28 -21
- data/lib/luban/deployment/cli/package/{binary.rb → base.rb} +6 -7
- data/lib/luban/deployment/cli/package/installer/core.rb +1 -1
- data/lib/luban/deployment/cli/package/installer/paths.rb +0 -8
- data/lib/luban/deployment/cli/package/installer.rb +8 -0
- data/lib/luban/deployment/cli/package/worker.rb +14 -0
- data/lib/luban/deployment/cli/package.rb +1 -2
- data/lib/luban/deployment/cli/project.rb +17 -3
- data/lib/luban/deployment/cli/service/base.rb +49 -0
- data/lib/luban/deployment/cli/service/configurator.rb +57 -0
- data/lib/luban/deployment/cli/service/controller.rb +99 -0
- data/lib/luban/deployment/cli/service/installer.rb +9 -0
- data/lib/luban/deployment/cli/service/worker.rb +37 -0
- data/lib/luban/deployment/cli/service.rb +5 -0
- data/lib/luban/deployment/cli.rb +1 -0
- data/lib/luban/deployment/helpers/configuration.rb +40 -9
- data/lib/luban/deployment/helpers/utils.rb +2 -2
- data/lib/luban/deployment/packages/bundler.rb +2 -4
- data/lib/luban/deployment/packages/git.rb +2 -4
- data/lib/luban/deployment/packages/openssl.rb +2 -4
- data/lib/luban/deployment/packages/ruby.rb +2 -4
- data/lib/luban/deployment/packages/rubygems.rb +5 -7
- data/lib/luban/deployment/packages/yaml.rb +1 -1
- data/lib/luban/deployment/parameters.rb +2 -0
- data/lib/luban/deployment/version.rb +1 -1
- data/lib/luban/deployment/worker/base.rb +1 -1
- data/lib/luban/deployment/worker/paths.rb +50 -0
- metadata +10 -5
- data/lib/luban/deployment/cli/package/service.rb +0 -17
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 77cb6b05848cfa60305de26ee0962a064a001f68
|
4
|
+
data.tar.gz: 375494b42b12ca2a917b2432bbac689b979d64d3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7ae1e7277dcd129b2f2ad2e21b46fdcd9779820aa9077506a61df285404cc7b0b781ae751b0a63f08aa99586de50b480f7b01ec1e20e4fce01c60d4a8fdb495c
|
7
|
+
data.tar.gz: 64600972a5b28ccefc5dcc4423f7262b35e0b274d9341bd280accd80f83dd72f10adbd6070c7631fa6aa75a006b7b411d2544d04ead9fc179a6a4395a7985905
|
data/.gitignore
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,20 @@
|
|
1
1
|
# Change log
|
2
2
|
|
3
|
+
## Version 0.3.5 (May 06, 2016)
|
4
|
+
|
5
|
+
New features:
|
6
|
+
* Created Luban::Deployment::Service::Base to handle service package deployment
|
7
|
+
* Added logrotate support
|
8
|
+
* Generated profile locally before publishing to remote servers for a given service package
|
9
|
+
|
10
|
+
Minor enhancements:
|
11
|
+
* Renamed Luban::Deployment::Package::Binary to Luban::Deployment::Package::Base for clarity
|
12
|
+
* Added convenient class method #default_executable to define executable method for a given package
|
13
|
+
* Minor code refactoring and cleanup
|
14
|
+
|
15
|
+
Bug fixes:
|
16
|
+
* Fixed a bug in md5 calculation on a given folder
|
17
|
+
|
3
18
|
## Version 0.3.3 (Apr 18, 2016)
|
4
19
|
|
5
20
|
Bug fixes:
|
@@ -19,7 +34,7 @@ Bug fixes:
|
|
19
34
|
## Version 0.3.1 (Apr 13, 2016)
|
20
35
|
|
21
36
|
Minor enhancements:
|
22
|
-
*
|
37
|
+
* Added SSH auth method "password" in addition to "keyboard-interactive"
|
23
38
|
* Removed support for production stages
|
24
39
|
|
25
40
|
Bug fixes:
|
@@ -40,7 +40,7 @@ module Luban
|
|
40
40
|
command(name, base: Luban::Deployment::Package::Base.package_class(name))
|
41
41
|
end
|
42
42
|
pkg.update_package_options(version, opts)
|
43
|
-
services[name] = pkg if pkg.is_a?(Luban::Deployment::
|
43
|
+
services[name] = pkg if pkg.is_a?(Luban::Deployment::Service::Base)
|
44
44
|
packages[name] = pkg
|
45
45
|
end
|
46
46
|
alias_method :require_package, :package
|
@@ -84,7 +84,8 @@ module Luban
|
|
84
84
|
end
|
85
85
|
end
|
86
86
|
|
87
|
-
|
87
|
+
(Luban::Deployment::Command::Tasks::Install::Actions -
|
88
|
+
%i(setup build destroy)).each do |action|
|
88
89
|
define_method(action) do |args:, opts:|
|
89
90
|
show_app_environment
|
90
91
|
packages.each_value { |p| p.send(__method__, args: args, opts: opts) }
|
@@ -104,7 +105,15 @@ module Luban
|
|
104
105
|
|
105
106
|
def deploy(args:, opts:)
|
106
107
|
show_app_environment
|
107
|
-
|
108
|
+
deploy_profile(args: args, opts: opts) if has_profile?
|
109
|
+
deploy_release(args: args, opts: opts) if has_source?
|
110
|
+
end
|
111
|
+
|
112
|
+
Luban::Deployment::Command::Tasks::Control::Actions.each do |action|
|
113
|
+
define_method(action) do |args:, opts:|
|
114
|
+
show_app_environment
|
115
|
+
services.each_value { |s| s.send(__method__, args: args, opts: opts) }
|
116
|
+
end
|
108
117
|
end
|
109
118
|
|
110
119
|
protected
|
@@ -133,8 +142,9 @@ module Luban
|
|
133
142
|
end
|
134
143
|
|
135
144
|
def set_default_profile
|
136
|
-
|
137
|
-
|
145
|
+
if config_finder[:application].has_profile?
|
146
|
+
profile(config_finder[:application].stage_profile_path, scm: :rsync)
|
147
|
+
end
|
138
148
|
end
|
139
149
|
|
140
150
|
def load_configuration
|
@@ -151,8 +161,8 @@ module Luban
|
|
151
161
|
puts "#{display_name} in #{parent.class.name}"
|
152
162
|
end
|
153
163
|
|
154
|
-
%i(build destroy cleanup).each do |
|
155
|
-
|
164
|
+
%i(build destroy cleanup).each do |task|
|
165
|
+
dispatch_task "#{task}!", to: :builder, as: task
|
156
166
|
end
|
157
167
|
|
158
168
|
def build_repositories(args:, opts:)
|
@@ -160,24 +170,33 @@ module Luban
|
|
160
170
|
build_repository!(args: args, opts: opts.merge(repository: source)) if has_source?
|
161
171
|
end
|
162
172
|
|
163
|
-
def
|
164
|
-
|
165
|
-
|
173
|
+
def deploy_profile(args:, opts:)
|
174
|
+
update_profile!(args: args, opts: opts)
|
175
|
+
deploy_profile!(args: args, opts: opts.merge(repository: profile))
|
176
|
+
end
|
177
|
+
|
178
|
+
def update_profile!(args:, opts:)
|
179
|
+
services.each_value { |s| s.send(:update_profile, args: args, opts: opts) }
|
166
180
|
end
|
167
181
|
|
168
182
|
def deploy_release(args:, opts:)
|
183
|
+
deploy_release!(args: args, opts: opts.merge(repository: source))
|
184
|
+
end
|
185
|
+
|
186
|
+
def deploy_release!(args:, opts:)
|
169
187
|
package_release!(args: args, opts: opts)[:release].tap do |release|
|
170
188
|
unless release.nil?
|
171
189
|
publish_release!(args: args, opts: opts.merge(release: release))
|
172
190
|
end
|
173
191
|
end
|
174
192
|
end
|
193
|
+
alias_method :deploy_profile!, :deploy_release!
|
175
194
|
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
195
|
+
dispatch_task :promptless_authen!, to: :authenticator, as: :promptless_authen
|
196
|
+
dispatch_task :public_key!, to: :authenticator, as: :public_key, locally: true
|
197
|
+
dispatch_task :build_repository!, to: :repository, as: :build, locally: true
|
198
|
+
dispatch_task :package_release!, to: :repository, as: :package, locally: true
|
199
|
+
dispatch_task :publish_release!, to: :publisher, as: :publish
|
181
200
|
end
|
182
201
|
end
|
183
202
|
end
|
@@ -41,8 +41,8 @@ module Luban
|
|
41
41
|
protected
|
42
42
|
|
43
43
|
def bootstrap
|
44
|
-
assure_dirs(
|
45
|
-
app_bin_path, app_tmp_path,
|
44
|
+
assure_dirs(logrotate_path, downloads_path,
|
45
|
+
tmp_path, app_bin_path, app_tmp_path,
|
46
46
|
releases_path, shared_path)
|
47
47
|
assure_linked_dirs
|
48
48
|
end
|
@@ -120,18 +120,18 @@ module Luban
|
|
120
120
|
|
121
121
|
def create_symlinks
|
122
122
|
send("create_#{release_name}_symlinks")
|
123
|
+
create_shared_symlinks_for(:directory, linked_dirs)
|
124
|
+
create_shared_symlinks_for(:directory, bundle_linked_dirs) if file?(gemfile)
|
123
125
|
end
|
124
126
|
|
125
127
|
def create_profile_symlinks
|
126
128
|
create_release_symlink(shared_path)
|
127
|
-
|
128
|
-
create_shared_symlinks_for(:directory, bundle_linked_dirs) if file?(gemfile)
|
129
|
+
create_etc_symlinks
|
129
130
|
end
|
130
131
|
|
131
132
|
def create_app_symlinks
|
132
133
|
create_release_symlink(app_path)
|
133
|
-
create_shared_symlinks_for(:directory,
|
134
|
-
create_shared_symlinks_for(:directory, bundle_linked_dirs) if file?(gemfile)
|
134
|
+
create_shared_symlinks_for(:directory, %w(profile))
|
135
135
|
create_shared_symlinks_for(:file, linked_files)
|
136
136
|
end
|
137
137
|
|
@@ -148,6 +148,17 @@ module Luban
|
|
148
148
|
end
|
149
149
|
end
|
150
150
|
|
151
|
+
def create_etc_symlinks
|
152
|
+
create_logrotate_symlinks
|
153
|
+
end
|
154
|
+
|
155
|
+
def create_logrotate_symlinks
|
156
|
+
logrotate_files.each do |path|
|
157
|
+
target_file = "#{stage}.#{project}.#{application}.#{path.basename}"
|
158
|
+
assure_symlink(path, logrotate_path.join(target_file))
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
151
162
|
def update_releases_log
|
152
163
|
execute %{echo "[$(date -u)][#{user}] #{release_log_message}" >> #{releases_log_path}}
|
153
164
|
end
|
@@ -3,8 +3,9 @@ module Luban
|
|
3
3
|
class Command < Luban::CLI::Command
|
4
4
|
module Tasks
|
5
5
|
module Install
|
6
|
-
%i(build destroy cleanup binstubs
|
7
|
-
|
6
|
+
Actions = %i(setup build destroy cleanup binstubs
|
7
|
+
show_current show_summary which whence)
|
8
|
+
Actions.each do |action|
|
8
9
|
define_method(action) do |args:, opts:|
|
9
10
|
raise NotImplementedError, "#{self.class.name}##{__method__} is an abstract method."
|
10
11
|
end
|
@@ -69,7 +70,8 @@ module Luban
|
|
69
70
|
end
|
70
71
|
|
71
72
|
module Deploy
|
72
|
-
%i(deploy)
|
73
|
+
Actions = %i(deploy)
|
74
|
+
Actions.each do |action|
|
73
75
|
define_method(action) do |args:, opts:|
|
74
76
|
raise NotImplementedError, "#{self.class.name}##{__method__} is an abstract method."
|
75
77
|
end
|
@@ -88,9 +90,10 @@ module Luban
|
|
88
90
|
end
|
89
91
|
|
90
92
|
module Control
|
91
|
-
%i(start_process stop_process
|
92
|
-
|
93
|
-
|
93
|
+
Actions = %i(start_process stop_process kill_process
|
94
|
+
restart_process check_process
|
95
|
+
monitor_process unmonitor_process)
|
96
|
+
Actions.each do |action|
|
94
97
|
define_method(action) do |args:, opts:|
|
95
98
|
raise NotImplementedError, "#{self.class.name}##{__method__} is an abstract method."
|
96
99
|
end
|
@@ -116,14 +119,14 @@ module Luban
|
|
116
119
|
action! :restart_process
|
117
120
|
end
|
118
121
|
|
119
|
-
task :
|
120
|
-
desc "
|
121
|
-
action! :
|
122
|
+
task :kill do
|
123
|
+
desc "Kill process forcely"
|
124
|
+
action! :kill_process
|
122
125
|
end
|
123
126
|
|
124
|
-
task :
|
125
|
-
desc "
|
126
|
-
action! :
|
127
|
+
task :status do
|
128
|
+
desc "Check process status"
|
129
|
+
action! :check_process
|
127
130
|
end
|
128
131
|
|
129
132
|
task :monitor do
|
@@ -151,7 +154,7 @@ module Luban
|
|
151
154
|
|
152
155
|
def task(cmd, **opts, &blk)
|
153
156
|
command(cmd, **opts, &blk).tap do |c|
|
154
|
-
|
157
|
+
add_common_task_options(c)
|
155
158
|
if !c.summary.nil? and c.description.empty?
|
156
159
|
c.long_desc "#{c.summary} in #{self.class.name}"
|
157
160
|
end
|
@@ -174,10 +177,10 @@ module Luban
|
|
174
177
|
end
|
175
178
|
end
|
176
179
|
|
177
|
-
def
|
178
|
-
define_method(
|
179
|
-
run_task(cmd:
|
180
|
-
worker_class: self.class.worker_class(
|
180
|
+
def dispatch_task(task, to:, as: task, locally: false, &blk)
|
181
|
+
define_method(task) do |args:, opts:|
|
182
|
+
run_task(cmd: as, args: args, opts: opts, locally: locally,
|
183
|
+
worker_class: self.class.worker_class(to), &blk)
|
181
184
|
end
|
182
185
|
end
|
183
186
|
end
|
@@ -198,6 +201,7 @@ module Luban
|
|
198
201
|
r = worker_class.new(task_msg.merge(backend: backend), &blk).run
|
199
202
|
rescue StandardError => e
|
200
203
|
r = {
|
204
|
+
hostname: backend.host.hostname,
|
201
205
|
status: :failed,
|
202
206
|
message: backtrace ? "#{e.message}\n#{e.backtrace.join("\n")}" : e.message,
|
203
207
|
error: e
|
@@ -263,8 +267,8 @@ module Luban
|
|
263
267
|
setup_control_tasks if controllable?
|
264
268
|
end
|
265
269
|
|
266
|
-
%i(install deploy control).each do |
|
267
|
-
define_method("setup_#{
|
270
|
+
%i(install deploy control).each do |action|
|
271
|
+
define_method("setup_#{action}_tasks") do
|
268
272
|
raise NotImplementedError, "#{self.class.name}##{__method__} is an abstract method."
|
269
273
|
end
|
270
274
|
end
|
@@ -339,9 +343,12 @@ module Luban
|
|
339
343
|
sshkit.backend.configure do |backend|
|
340
344
|
backend.pty = pty
|
341
345
|
backend.connection_timeout = connection_timeout
|
342
|
-
backend.ssh_options
|
343
|
-
backend.ssh_options
|
346
|
+
if backend.respond_to?(:ssh_options)
|
347
|
+
backend.ssh_options =
|
348
|
+
backend.ssh_options.merge(user: user).merge!(ssh_options)
|
349
|
+
end
|
344
350
|
end
|
351
|
+
#bundle_bins.each { |cmd| sshkit.command_map.prefix[cmd.to_sym].push("bundle exec") }
|
345
352
|
end
|
346
353
|
|
347
354
|
configure_airbrussh if format == :airbrussh
|
@@ -1,7 +1,7 @@
|
|
1
1
|
module Luban
|
2
2
|
module Deployment
|
3
3
|
module Package
|
4
|
-
class
|
4
|
+
class Base < Luban::Deployment::Command
|
5
5
|
using Luban::CLI::CoreRefinements
|
6
6
|
|
7
7
|
class << self
|
@@ -90,12 +90,12 @@ module Luban
|
|
90
90
|
|
91
91
|
def versions; package_options.keys; end
|
92
92
|
|
93
|
-
|
94
|
-
|
93
|
+
dispatch_task :download_package, to: :installer, as: :download, locally: true
|
94
|
+
dispatch_task :install_package, to: :installer, as: :install
|
95
95
|
|
96
96
|
%i(uninstall cleanup_all update_binstubs
|
97
|
-
get_summary which_current whence_origin).each do |
|
98
|
-
|
97
|
+
get_summary which_current whence_origin).each do |task|
|
98
|
+
dispatch_task task, to: :installer
|
99
99
|
end
|
100
100
|
|
101
101
|
def install(args:, opts:)
|
@@ -200,6 +200,7 @@ module Luban
|
|
200
200
|
def setup_install_tasks
|
201
201
|
super
|
202
202
|
|
203
|
+
undef_task :setup
|
203
204
|
undef_task :build
|
204
205
|
undef_task :destroy
|
205
206
|
|
@@ -242,8 +243,6 @@ module Luban
|
|
242
243
|
end
|
243
244
|
end
|
244
245
|
end
|
245
|
-
|
246
|
-
Base = Binary
|
247
246
|
end
|
248
247
|
end
|
249
248
|
end
|
@@ -32,14 +32,6 @@ module Luban
|
|
32
32
|
@download_url ||= File.join(source_repo, source_url_root, src_file_name)
|
33
33
|
end
|
34
34
|
|
35
|
-
def install_path
|
36
|
-
@install_path ||= package_versions_path.join(package_version)
|
37
|
-
end
|
38
|
-
|
39
|
-
def bin_path
|
40
|
-
@bin_path ||= install_path.join('bin')
|
41
|
-
end
|
42
|
-
|
43
35
|
def lib_path
|
44
36
|
@lib_path ||= install_path.join('lib')
|
45
37
|
end
|
@@ -12,6 +12,12 @@ module Luban
|
|
12
12
|
def worker_class(worker, **opts)
|
13
13
|
Luban::Deployment::Package::Base.worker_class(worker, **opts)
|
14
14
|
end
|
15
|
+
|
16
|
+
def default_executable(name)
|
17
|
+
define_method("#{name}_executable") do
|
18
|
+
@default_executable ||= bin_path.join(name)
|
19
|
+
end
|
20
|
+
end
|
15
21
|
end
|
16
22
|
|
17
23
|
def package_name; task.opts.name; end
|
@@ -40,6 +46,14 @@ module Luban
|
|
40
46
|
@package_versions_path ||= package_path.join('versions')
|
41
47
|
end
|
42
48
|
|
49
|
+
def install_path
|
50
|
+
@install_path ||= package_versions_path.join(package_version)
|
51
|
+
end
|
52
|
+
|
53
|
+
def bin_path
|
54
|
+
@bin_path ||= install_path.join('bin')
|
55
|
+
end
|
56
|
+
|
43
57
|
def package_tmp_path
|
44
58
|
@package_tmp_path ||= package_path.join('tmp')
|
45
59
|
end
|
@@ -36,9 +36,7 @@ module Luban
|
|
36
36
|
end
|
37
37
|
end
|
38
38
|
|
39
|
-
%i(
|
40
|
-
show_current show_summary which whence
|
41
|
-
).each do |action|
|
39
|
+
(Luban::Deployment::Command::Tasks::Install::Actions | %i(destroy_project)).each do |action|
|
42
40
|
define_method(action) do |args:, opts:|
|
43
41
|
apps.each_value do |app|
|
44
42
|
app.send(__method__, args: args, opts: opts) if app.installable?
|
@@ -48,6 +46,22 @@ module Luban
|
|
48
46
|
|
49
47
|
alias_method :destroy, :destroy_project
|
50
48
|
|
49
|
+
Luban::Deployment::Command::Tasks::Deploy::Actions.each do |action|
|
50
|
+
define_method(action) do |args:, opts:|
|
51
|
+
apps.each_value do |app|
|
52
|
+
app.send(__method__, args: args, opts: opts) if app.deployable?
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
Luban::Deployment::Command::Tasks::Control::Actions.each do |action|
|
58
|
+
define_method(action) do |args:, opts:|
|
59
|
+
apps.each_value do |app|
|
60
|
+
app.send(__method__, args: args, opts: opts) if app.controllable?
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
51
65
|
protected
|
52
66
|
|
53
67
|
def validate_parameters
|
@@ -0,0 +1,49 @@
|
|
1
|
+
module Luban
|
2
|
+
module Deployment
|
3
|
+
module Service
|
4
|
+
class Base < Luban::Deployment::Package::Base
|
5
|
+
include Luban::Deployment::Command::Tasks::Deploy
|
6
|
+
include Luban::Deployment::Command::Tasks::Control
|
7
|
+
|
8
|
+
ControlActions = Luban::Deployment::Command::Tasks::Control::Actions
|
9
|
+
ProfileActions = %i(update_profile)
|
10
|
+
|
11
|
+
(ControlActions | ProfileActions).each do |m|
|
12
|
+
define_method(m) do |args:, opts:|
|
13
|
+
if current_version
|
14
|
+
send("#{__method__}!", args: args, opts: opts.merge(version: current_version))
|
15
|
+
else
|
16
|
+
abort "Aborted! No current version of #{display_name} is specified."
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
protected
|
22
|
+
|
23
|
+
def on_configure
|
24
|
+
super
|
25
|
+
include_default_templates_path if respond_to?(:default_templates_path, true)
|
26
|
+
end
|
27
|
+
|
28
|
+
def include_default_templates_path
|
29
|
+
if default_templates_path.is_a?(Pathname)
|
30
|
+
default_templates_paths.unshift(default_templates_path)
|
31
|
+
else
|
32
|
+
abort "Aborted! Default templates path for #{self.class.name} MUST be a Pathname."
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def set_parameters
|
37
|
+
super
|
38
|
+
linked_dirs.push('log', 'pids')
|
39
|
+
end
|
40
|
+
|
41
|
+
ControlActions.each do |task|
|
42
|
+
dispatch_task "#{task}!", to: :controller, as: task
|
43
|
+
end
|
44
|
+
|
45
|
+
dispatch_task :update_profile!, to: :configurator, as: :update_profile, locally: true
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
module Luban
|
2
|
+
module Deployment
|
3
|
+
module Service
|
4
|
+
class Configurator < Worker
|
5
|
+
def stage_profile_path
|
6
|
+
@stage_profile_path ||=
|
7
|
+
config_finder[:application].stage_profile_path.join(service_name)
|
8
|
+
end
|
9
|
+
|
10
|
+
def profile_templates_path
|
11
|
+
@profile_templates_path ||=
|
12
|
+
config_finder[:application].profile_templates_path.join(service_name)
|
13
|
+
end
|
14
|
+
|
15
|
+
def stage_profile_templates_path
|
16
|
+
@stage_profile_templates_path ||=
|
17
|
+
config_finder[:application].stage_profile_templates_path.join(service_name)
|
18
|
+
end
|
19
|
+
|
20
|
+
def profile_templates(format: "erb")
|
21
|
+
return @profile_templates unless @profile_templates.nil?
|
22
|
+
@profile_templates = []
|
23
|
+
[profile_templates_path, stage_profile_templates_path].each do |path|
|
24
|
+
Dir.chdir(path) { @profile_templates |= Dir["**/*.#{format}"] } if path.directory?
|
25
|
+
end
|
26
|
+
@profile_templates
|
27
|
+
end
|
28
|
+
|
29
|
+
def update_profile
|
30
|
+
assure_dirs(stage_profile_path)
|
31
|
+
render_profile
|
32
|
+
update_logrotate_files
|
33
|
+
end
|
34
|
+
|
35
|
+
protected
|
36
|
+
|
37
|
+
def render_profile
|
38
|
+
profile_templates.each { |template_file| render_profile_by_template(template_file) }
|
39
|
+
end
|
40
|
+
|
41
|
+
def render_profile_by_template(template_file)
|
42
|
+
profile_file = stage_profile_path.join(template_file).sub_ext('')
|
43
|
+
assure_dirs(profile_file.dirname)
|
44
|
+
upload_by_template(file_to_upload: profile_file,
|
45
|
+
template_file: find_template_file(File.join(service_name, template_file)),
|
46
|
+
auto_revision: true)
|
47
|
+
end
|
48
|
+
|
49
|
+
def update_logrotate_files
|
50
|
+
if file?(stage_profile_path.join(logrotate_file_name))
|
51
|
+
logrotate_files.push(logrotate_file_path)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,99 @@
|
|
1
|
+
module Luban
|
2
|
+
module Deployment
|
3
|
+
module Service
|
4
|
+
class Controller < Worker
|
5
|
+
%i(process_stopped? process_started?
|
6
|
+
monitor_process unmonitor_process).each do |m|
|
7
|
+
define_method(m) do
|
8
|
+
raise NotImplementedError, "#{self.class.name}##{__method__} is an abstract method."
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def start_process
|
13
|
+
if process_started?
|
14
|
+
update_result "Skipped! Already started #{package_full_name}", status: :skipped
|
15
|
+
return
|
16
|
+
end
|
17
|
+
|
18
|
+
output = start_process!
|
19
|
+
if check_until { process_started? }
|
20
|
+
update_result "Successfully started #{package_full_name}: #{output}"
|
21
|
+
else
|
22
|
+
update_result "Failed to start #{package_full_name}: #{output}",
|
23
|
+
status: :failed, level: :error
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def stop_process
|
28
|
+
if process_stopped?
|
29
|
+
update_result "Skipped! Already stopped #{package_full_name}", status: :skipped
|
30
|
+
return
|
31
|
+
end
|
32
|
+
|
33
|
+
output = stop_process!
|
34
|
+
if check_until { process_stopped? }
|
35
|
+
update_result "Successfully stopped #{package_full_name}: #{output}"
|
36
|
+
else
|
37
|
+
update_result "Failed to stop #{package_full_name}: #{output}",
|
38
|
+
status: :failed, level: :error
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def restart_process
|
43
|
+
if process_started?
|
44
|
+
output = stop_process!
|
45
|
+
unless check_until { process_stopped? }
|
46
|
+
update_result "Failed to stop #{package_full_name}: #{output}",
|
47
|
+
status: :failed, level: :error
|
48
|
+
return
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
output = start_process!
|
53
|
+
if check_until { process_started? }
|
54
|
+
update_result "Successfully restarted #{package_full_name}: #{output}"
|
55
|
+
else
|
56
|
+
update_result "Failed to restart #{package_full_name}: #{output}",
|
57
|
+
status: :failed, level: :error
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def check_process
|
62
|
+
update_result check_process!
|
63
|
+
end
|
64
|
+
|
65
|
+
def kill_process
|
66
|
+
output = kill_process!
|
67
|
+
if check_until { process_stopped? }
|
68
|
+
update_result "Successfully kill processs (#{output})."
|
69
|
+
else
|
70
|
+
update_result "Failed to kill process: #{output}"
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
def check_until(pending_seconds = 30)
|
75
|
+
succeeded = false
|
76
|
+
pending_seconds.times do
|
77
|
+
sleep 1
|
78
|
+
break if (succeeded = yield)
|
79
|
+
end
|
80
|
+
succeeded
|
81
|
+
end
|
82
|
+
|
83
|
+
protected
|
84
|
+
|
85
|
+
%i(start_process! stop_process! check_process!).each do |m|
|
86
|
+
define_method(m) do
|
87
|
+
raise NotImplementedError, "#{self.class.name}##{__method__} is an abstract method."
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
def kill_process!
|
92
|
+
pid = capture(pid_file_path)
|
93
|
+
output = capture(:kill, "-9 #{pid}")
|
94
|
+
output.empty? ? pid : output
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module Luban
|
2
|
+
module Deployment
|
3
|
+
module Service
|
4
|
+
module Paths
|
5
|
+
include Luban::Deployment::Worker::Paths::Remote::Service
|
6
|
+
|
7
|
+
def service_name
|
8
|
+
@service_name = package_name.downcase
|
9
|
+
end
|
10
|
+
|
11
|
+
def profile_path
|
12
|
+
@profile_path ||= super.join(service_name)
|
13
|
+
end
|
14
|
+
|
15
|
+
def control_file_name
|
16
|
+
@control_file_name ||= "#{service_name}.conf"
|
17
|
+
end
|
18
|
+
|
19
|
+
def logrotate_file_name
|
20
|
+
@logrotate_file_name ||= "#{service_name}.logrotate"
|
21
|
+
end
|
22
|
+
|
23
|
+
def pid_file_name
|
24
|
+
@pid_file_name ||= "#{service_name}.pid"
|
25
|
+
end
|
26
|
+
|
27
|
+
def log_file_name
|
28
|
+
@log_file_name ||= "#{service_name}.log"
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
class Worker < Luban::Deployment::Package::Worker
|
33
|
+
include Paths
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
data/lib/luban/deployment/cli.rb
CHANGED
@@ -70,11 +70,13 @@ module Luban
|
|
70
70
|
|
71
71
|
def find_template_file(file_name)
|
72
72
|
path = find_template_file_by_config_finder(file_name) ||
|
73
|
-
find_default_template_file(file_name)
|
73
|
+
Finder.find_default_template_file(file_name)
|
74
74
|
raise RuntimeError, "Template file is NOT found: #{file_name}." if path.nil?
|
75
75
|
path
|
76
76
|
end
|
77
77
|
|
78
|
+
def default_templates_paths; Finder.default_templates_paths; end
|
79
|
+
|
78
80
|
protected
|
79
81
|
|
80
82
|
def find_template_file_by_config_finder(file_name)
|
@@ -82,19 +84,48 @@ module Luban
|
|
82
84
|
config_finder[:project].find_template_file(file_name)
|
83
85
|
end
|
84
86
|
|
85
|
-
def find_default_template_file(file_name)
|
86
|
-
path = File.expand_path(File.join(File.dirname(__FILE__), '..',
|
87
|
-
'templates', file_name))
|
88
|
-
return path if File.file?(path)
|
89
|
-
end
|
90
|
-
|
91
87
|
class Finder
|
88
|
+
def self.default_templates_paths
|
89
|
+
@default_templates_paths ||=
|
90
|
+
[Pathname.new(File.join(File.dirname(__FILE__), '..', 'templates')).realpath]
|
91
|
+
end
|
92
|
+
|
93
|
+
def self.find_default_template_file(file_name)
|
94
|
+
path = default_templates_paths.find { |p| p.join(file_name).file? }
|
95
|
+
return path.join(file_name) unless path.nil?
|
96
|
+
end
|
97
|
+
|
92
98
|
class Project < Finder
|
93
99
|
def base_path; base_path ||= target.work_dir; end
|
94
100
|
end
|
95
101
|
|
96
102
|
class Application < Finder
|
103
|
+
attr_reader :profile_templates_path
|
104
|
+
attr_reader :stage_profile_path
|
105
|
+
attr_reader :stage_profile_templates_path
|
106
|
+
|
97
107
|
def base_path; base_path ||= target.apps_path.join(target.application); end
|
108
|
+
|
109
|
+
def has_profile?
|
110
|
+
stage_profile_templates_path.directory? or
|
111
|
+
stage_profile_path.directory? or
|
112
|
+
profile_templates_path.directory?
|
113
|
+
end
|
114
|
+
|
115
|
+
def find_template_file(file_name)
|
116
|
+
return file_path if (file_path = stage_profile_templates_path.join(file_name)).file?
|
117
|
+
return file_path if (file_path = profile_templates_path.join(file_name)).file?
|
118
|
+
super
|
119
|
+
end
|
120
|
+
|
121
|
+
protected
|
122
|
+
|
123
|
+
def set_config_paths
|
124
|
+
super
|
125
|
+
@profile_templates_path = @templates_path.join('profile')
|
126
|
+
@stage_profile_path = @stage_config_path.join('profile')
|
127
|
+
@stage_profile_templates_path = @stage_templates_path.join('profile')
|
128
|
+
end
|
98
129
|
end
|
99
130
|
|
100
131
|
def self.project(target); Project.new(target); end
|
@@ -137,8 +168,8 @@ module Luban
|
|
137
168
|
end
|
138
169
|
|
139
170
|
def find_template_file(file_name)
|
140
|
-
return file_path if
|
141
|
-
return file_path if
|
171
|
+
return file_path if (file_path = stage_templates_path.join(file_name)).file?
|
172
|
+
return file_path if (file_path = templates_path.join(file_name)).file?
|
142
173
|
end
|
143
174
|
|
144
175
|
protected
|
@@ -131,7 +131,7 @@ module Luban
|
|
131
131
|
end
|
132
132
|
|
133
133
|
def revision_match?(file_to_upload, revision)
|
134
|
-
file?(file_to_upload) and match?("grep \"Revision: \" #{file_to_upload}", revision)
|
134
|
+
file?(file_to_upload) and match?("grep \"Revision: \" #{file_to_upload}; true", revision)
|
135
135
|
end
|
136
136
|
|
137
137
|
[:test, :make, :within, :with, :as, :execute,
|
@@ -142,7 +142,7 @@ module Luban
|
|
142
142
|
end
|
143
143
|
|
144
144
|
def capture(*args, &blk)
|
145
|
-
backend.capture(*args, &blk).chomp
|
145
|
+
backend.capture(*args, raise_on_non_zero_exit: false, &blk).chomp
|
146
146
|
end
|
147
147
|
|
148
148
|
def md5_matched?(file_path, md5)
|
@@ -1,7 +1,7 @@
|
|
1
1
|
module Luban
|
2
2
|
module Deployment
|
3
3
|
module Packages
|
4
|
-
class Bundler < Luban::Deployment::Package::
|
4
|
+
class Bundler < Luban::Deployment::Package::Base
|
5
5
|
protected
|
6
6
|
|
7
7
|
def setup_install_tasks
|
@@ -26,9 +26,7 @@ module Luban
|
|
26
26
|
parent.install_path
|
27
27
|
end
|
28
28
|
|
29
|
-
|
30
|
-
@bundler_executable ||= bin_path.join('bundle')
|
31
|
-
end
|
29
|
+
default_executable 'bundler'
|
32
30
|
|
33
31
|
def gem_executable
|
34
32
|
parent.gem_executable
|
@@ -1,7 +1,7 @@
|
|
1
1
|
module Luban
|
2
2
|
module Deployment
|
3
3
|
module Packages
|
4
|
-
class Git < Luban::Deployment::Package::
|
4
|
+
class Git < Luban::Deployment::Package::Base
|
5
5
|
apply_to :all do
|
6
6
|
before_install do
|
7
7
|
depend_on 'openssl', version: '1.0.2g'
|
@@ -9,9 +9,7 @@ module Luban
|
|
9
9
|
end
|
10
10
|
|
11
11
|
class Installer < Luban::Deployment::Package::Installer
|
12
|
-
|
13
|
-
@git_executable ||= bin_path.join('git')
|
14
|
-
end
|
12
|
+
default_executable 'git'
|
15
13
|
|
16
14
|
def source_repo
|
17
15
|
@source_repo ||= "https://www.kernel.org"
|
@@ -1,7 +1,7 @@
|
|
1
1
|
module Luban
|
2
2
|
module Deployment
|
3
3
|
module Packages
|
4
|
-
class Openssl < Luban::Deployment::Package::
|
4
|
+
class Openssl < Luban::Deployment::Package::Base
|
5
5
|
class Installer < Luban::Deployment::Package::Installer
|
6
6
|
OSXArchArgs = {
|
7
7
|
x86_64: %w(darwin64-x86_64-cc enable-ec_nistp_64_gcc_128),
|
@@ -13,9 +13,7 @@ module Luban
|
|
13
13
|
|
14
14
|
end
|
15
15
|
|
16
|
-
|
17
|
-
@openssl_executable ||= bin_path.join('openssl')
|
18
|
-
end
|
16
|
+
default_executable 'openssl'
|
19
17
|
|
20
18
|
def source_repo
|
21
19
|
#@source_repo ||= "https://www.openssl.org"
|
@@ -1,7 +1,7 @@
|
|
1
1
|
module Luban
|
2
2
|
module Deployment
|
3
3
|
module Packages
|
4
|
-
class Ruby < Luban::Deployment::Package::
|
4
|
+
class Ruby < Luban::Deployment::Package::Base
|
5
5
|
apply_to '1.8.6' do
|
6
6
|
after_install do
|
7
7
|
depend_on 'rubygems', version: '1.3.7'
|
@@ -73,9 +73,7 @@ module Luban
|
|
73
73
|
task.opts.install_doc
|
74
74
|
end
|
75
75
|
|
76
|
-
|
77
|
-
@ruby_executable ||= bin_path.join('ruby')
|
78
|
-
end
|
76
|
+
default_executable 'ruby'
|
79
77
|
|
80
78
|
def gem_executable
|
81
79
|
@gem_executable ||= bin_path.join('gem')
|
@@ -1,7 +1,7 @@
|
|
1
1
|
module Luban
|
2
2
|
module Deployment
|
3
3
|
module Packages
|
4
|
-
class Rubygems < Luban::Deployment::Package::
|
4
|
+
class Rubygems < Luban::Deployment::Package::Base
|
5
5
|
protected
|
6
6
|
|
7
7
|
def setup_install_tasks
|
@@ -22,10 +22,8 @@ module Luban
|
|
22
22
|
parent.install_path
|
23
23
|
end
|
24
24
|
|
25
|
-
|
26
|
-
|
27
|
-
end
|
28
|
-
|
25
|
+
default_executable 'gem'
|
26
|
+
|
29
27
|
def ruby_executable
|
30
28
|
parent.ruby_executable
|
31
29
|
end
|
@@ -44,8 +42,8 @@ module Luban
|
|
44
42
|
end
|
45
43
|
|
46
44
|
def installed?
|
47
|
-
return false unless file?(
|
48
|
-
match?("#{
|
45
|
+
return false unless file?(gem_executable)
|
46
|
+
match?("#{gem_executable} -v", package_version)
|
49
47
|
end
|
50
48
|
|
51
49
|
protected
|
@@ -1,7 +1,7 @@
|
|
1
1
|
module Luban
|
2
2
|
module Deployment
|
3
3
|
module Packages
|
4
|
-
class Yaml < Luban::Deployment::Package::
|
4
|
+
class Yaml < Luban::Deployment::Package::Base
|
5
5
|
class Installer < Luban::Deployment::Package::Installer
|
6
6
|
def header_file
|
7
7
|
@header_file ||= include_path.join('yaml.h')
|
@@ -108,6 +108,7 @@ module Luban
|
|
108
108
|
parameter :keep_releases
|
109
109
|
parameter :linked_dirs
|
110
110
|
parameter :linked_files
|
111
|
+
parameter :logrotate_files
|
111
112
|
|
112
113
|
protected
|
113
114
|
|
@@ -116,6 +117,7 @@ module Luban
|
|
116
117
|
set_default :keep_releases, 3
|
117
118
|
set_default :linked_dirs, []
|
118
119
|
set_default :linked_files, []
|
120
|
+
set_default :logrotate_files, []
|
119
121
|
|
120
122
|
setup_default_application_config_finder
|
121
123
|
end
|
@@ -60,7 +60,7 @@ module Luban
|
|
60
60
|
task.result.tap do |r|
|
61
61
|
r.status = status
|
62
62
|
r.level = level
|
63
|
-
r.message = message unless message.nil?
|
63
|
+
r.message = message unless message.nil? or !r.message.nil?
|
64
64
|
attrs.each_pair { |k, v| r.send("#{k}=", v) }
|
65
65
|
send(level, message) unless message.nil? or message.empty?
|
66
66
|
end
|
@@ -25,6 +25,10 @@ module Luban
|
|
25
25
|
@etc_path ||= luban_root_path.join('etc')
|
26
26
|
end
|
27
27
|
|
28
|
+
def logrotate_path
|
29
|
+
@logrotate_path = etc_path.join('logrotate')
|
30
|
+
end
|
31
|
+
|
28
32
|
def tmp_path
|
29
33
|
@tmp_path ||= luban_root_path.join('tmp')
|
30
34
|
end
|
@@ -68,6 +72,52 @@ module Luban
|
|
68
72
|
def luban_install_path
|
69
73
|
@luban_install_path ||= project_path.join('.luban')
|
70
74
|
end
|
75
|
+
|
76
|
+
module Service
|
77
|
+
def profile_path
|
78
|
+
@profile_path ||= shared_path.join('profile')
|
79
|
+
end
|
80
|
+
|
81
|
+
def log_path
|
82
|
+
@log_path ||= shared_path.join('log')
|
83
|
+
end
|
84
|
+
|
85
|
+
def log_file_path
|
86
|
+
@log_file_path ||= log_path.join(log_file_name)
|
87
|
+
end
|
88
|
+
|
89
|
+
def log_file_name
|
90
|
+
raise NotImplementedError, "#{self.class.name}#log_file_name is an abstract method."
|
91
|
+
end
|
92
|
+
|
93
|
+
def pids_path
|
94
|
+
@pids_path ||= shared_path.join('pids')
|
95
|
+
end
|
96
|
+
|
97
|
+
def pid_file_path
|
98
|
+
@pid_file_path ||= pids_path.join(pid_file_name)
|
99
|
+
end
|
100
|
+
|
101
|
+
def pid_file_name
|
102
|
+
raise NotImplementedError, "#{self.class.name}#pid_file_name is an abstract method."
|
103
|
+
end
|
104
|
+
|
105
|
+
def control_file_path
|
106
|
+
@control_file_path ||= profile_path.join(control_file_name)
|
107
|
+
end
|
108
|
+
|
109
|
+
def control_file_name
|
110
|
+
raise NotImplementedError, "#{self.class.name}#control_file_name is an abstract method."
|
111
|
+
end
|
112
|
+
|
113
|
+
def logrotate_file_path
|
114
|
+
@logrotate_file_path ||= profile_path.join(logrotate_file_name)
|
115
|
+
end
|
116
|
+
|
117
|
+
def logrotate_file_name
|
118
|
+
raise NotImplementedError, "#{self.class.name}#logrotate_file_name is an abstract method."
|
119
|
+
end
|
120
|
+
end
|
71
121
|
end
|
72
122
|
end
|
73
123
|
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.3.
|
4
|
+
version: 0.3.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-
|
11
|
+
date: 2016-05-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: luban-cli
|
@@ -110,16 +110,21 @@ files:
|
|
110
110
|
- lib/luban/deployment/cli/application/scm/rsync.rb
|
111
111
|
- lib/luban/deployment/cli/command.rb
|
112
112
|
- lib/luban/deployment/cli/package.rb
|
113
|
-
- lib/luban/deployment/cli/package/
|
113
|
+
- lib/luban/deployment/cli/package/base.rb
|
114
114
|
- lib/luban/deployment/cli/package/dependency.rb
|
115
115
|
- lib/luban/deployment/cli/package/dependency_set.rb
|
116
116
|
- lib/luban/deployment/cli/package/installer.rb
|
117
117
|
- lib/luban/deployment/cli/package/installer/core.rb
|
118
118
|
- lib/luban/deployment/cli/package/installer/install.rb
|
119
119
|
- lib/luban/deployment/cli/package/installer/paths.rb
|
120
|
-
- lib/luban/deployment/cli/package/service.rb
|
121
120
|
- lib/luban/deployment/cli/package/worker.rb
|
122
121
|
- lib/luban/deployment/cli/project.rb
|
122
|
+
- lib/luban/deployment/cli/service.rb
|
123
|
+
- lib/luban/deployment/cli/service/base.rb
|
124
|
+
- lib/luban/deployment/cli/service/configurator.rb
|
125
|
+
- lib/luban/deployment/cli/service/controller.rb
|
126
|
+
- lib/luban/deployment/cli/service/installer.rb
|
127
|
+
- lib/luban/deployment/cli/service/worker.rb
|
123
128
|
- lib/luban/deployment/configuration.rb
|
124
129
|
- lib/luban/deployment/configuration/core.rb
|
125
130
|
- lib/luban/deployment/configuration/filter.rb
|
@@ -166,7 +171,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
166
171
|
version: '0'
|
167
172
|
requirements: []
|
168
173
|
rubyforge_project:
|
169
|
-
rubygems_version: 2.
|
174
|
+
rubygems_version: 2.5.1
|
170
175
|
signing_key:
|
171
176
|
specification_version: 4
|
172
177
|
summary: Ruby framework for server automation and application deployment
|
@@ -1,17 +0,0 @@
|
|
1
|
-
module Luban
|
2
|
-
module Deployment
|
3
|
-
module Package
|
4
|
-
class Service < Binary
|
5
|
-
include Luban::Deployment::Command::Tasks::Deploy
|
6
|
-
include Luban::Deployment::Command::Tasks::Control
|
7
|
-
|
8
|
-
%i(deploy).each do |m|
|
9
|
-
define_task_method(m, worker: :deployer)
|
10
|
-
end
|
11
|
-
|
12
|
-
protected
|
13
|
-
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|