luban 0.2.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.
Files changed (61) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +9 -0
  3. data/Gemfile +4 -0
  4. data/LICENSE.txt +21 -0
  5. data/README.md +37 -0
  6. data/Rakefile +1 -0
  7. data/bin/console +14 -0
  8. data/bin/setup +7 -0
  9. data/exe/luban +3 -0
  10. data/lib/luban/deployment/cli/application/authenticator.rb +106 -0
  11. data/lib/luban/deployment/cli/application/base.rb +179 -0
  12. data/lib/luban/deployment/cli/application/builder.rb +67 -0
  13. data/lib/luban/deployment/cli/application/publisher.rb +215 -0
  14. data/lib/luban/deployment/cli/application/repository.rb +175 -0
  15. data/lib/luban/deployment/cli/application/scm/git.rb +49 -0
  16. data/lib/luban/deployment/cli/application/scm/rsync.rb +47 -0
  17. data/lib/luban/deployment/cli/application.rb +5 -0
  18. data/lib/luban/deployment/cli/command.rb +360 -0
  19. data/lib/luban/deployment/cli/package/binary.rb +241 -0
  20. data/lib/luban/deployment/cli/package/dependency.rb +49 -0
  21. data/lib/luban/deployment/cli/package/dependency_set.rb +71 -0
  22. data/lib/luban/deployment/cli/package/installer/core.rb +98 -0
  23. data/lib/luban/deployment/cli/package/installer/install.rb +330 -0
  24. data/lib/luban/deployment/cli/package/installer/paths.rb +81 -0
  25. data/lib/luban/deployment/cli/package/installer.rb +3 -0
  26. data/lib/luban/deployment/cli/package/service.rb +17 -0
  27. data/lib/luban/deployment/cli/package/worker.rb +43 -0
  28. data/lib/luban/deployment/cli/package.rb +6 -0
  29. data/lib/luban/deployment/cli/project.rb +94 -0
  30. data/lib/luban/deployment/cli.rb +4 -0
  31. data/lib/luban/deployment/configuration/core.rb +67 -0
  32. data/lib/luban/deployment/configuration/filter.rb +54 -0
  33. data/lib/luban/deployment/configuration/question.rb +38 -0
  34. data/lib/luban/deployment/configuration/server.rb +70 -0
  35. data/lib/luban/deployment/configuration/server_set.rb +86 -0
  36. data/lib/luban/deployment/configuration.rb +5 -0
  37. data/lib/luban/deployment/error.rb +5 -0
  38. data/lib/luban/deployment/helpers/configuration.rb +159 -0
  39. data/lib/luban/deployment/helpers/utils.rb +180 -0
  40. data/lib/luban/deployment/helpers.rb +2 -0
  41. data/lib/luban/deployment/packages/bundler.rb +81 -0
  42. data/lib/luban/deployment/packages/git.rb +37 -0
  43. data/lib/luban/deployment/packages/openssl.rb +59 -0
  44. data/lib/luban/deployment/packages/ruby.rb +125 -0
  45. data/lib/luban/deployment/packages/rubygems.rb +89 -0
  46. data/lib/luban/deployment/packages/yaml.rb +33 -0
  47. data/lib/luban/deployment/parameters.rb +160 -0
  48. data/lib/luban/deployment/runner.rb +99 -0
  49. data/lib/luban/deployment/templates/envrc.erb +30 -0
  50. data/lib/luban/deployment/templates/unset_envrc.erb +28 -0
  51. data/lib/luban/deployment/version.rb +5 -0
  52. data/lib/luban/deployment/worker/base.rb +71 -0
  53. data/lib/luban/deployment/worker/controller.rb +11 -0
  54. data/lib/luban/deployment/worker/local.rb +19 -0
  55. data/lib/luban/deployment/worker/remote.rb +55 -0
  56. data/lib/luban/deployment/worker/task.rb +25 -0
  57. data/lib/luban/deployment/worker.rb +4 -0
  58. data/lib/luban/deployment.rb +8 -0
  59. data/lib/luban.rb +4 -0
  60. data/luban.gemspec +29 -0
  61. metadata +174 -0
@@ -0,0 +1,59 @@
1
+ module Luban
2
+ module Deployment
3
+ module Packages
4
+ class Openssl < Luban::Deployment::Package::Binary
5
+ class Installer < Luban::Deployment::Package::Installer
6
+ OSXArchArgs = {
7
+ x86_64: %w(darwin64-x86_64-cc enable-ec_nistp_64_gcc_128),
8
+ i386: %w(darwin-i386-cc)
9
+ }
10
+
11
+ def configure_executable
12
+ @configure_executable = osx? ? './Configure' : './config'
13
+
14
+ end
15
+
16
+ def openssl_executable
17
+ @openssl_executable ||= bin_path.join('openssl')
18
+ end
19
+
20
+ def source_repo
21
+ #@source_repo ||= "https://www.openssl.org"
22
+ @source_repo ||= "http://www.openssl.org"
23
+ end
24
+
25
+ def source_url_root
26
+ @source_url_root ||= "source"
27
+ end
28
+
29
+ def installed?
30
+ return false unless file?(openssl_executable)
31
+ match?("#{openssl_executable} version", package_version)
32
+ end
33
+
34
+ def default_configure_opts
35
+ @default_configure_opts ||= %w(no-ssl2 zlib-dynamic shared enable-cms)
36
+ end
37
+
38
+ protected
39
+
40
+ def configure_build_options
41
+ super
42
+ @configure_opts.unshift(OSXArchArgs[hardware_name.to_sym]) if osx?
43
+ end
44
+
45
+ def make_package!
46
+ super and test(:make, "depend >> #{install_log_file_path} 2>&1")
47
+ end
48
+
49
+ def cleanup_temp!
50
+ super
51
+ # Clean up man pages
52
+ manpages_path = install_path.join('ssl/man')
53
+ rmdir(manpages_path) if directory?(manpages_path)
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,125 @@
1
+ module Luban
2
+ module Deployment
3
+ module Packages
4
+ class Ruby < Luban::Deployment::Package::Binary
5
+ apply_to '1.8.6' do
6
+ after_install do
7
+ depend_on 'rubygems', version: '1.3.7'
8
+ end
9
+ end
10
+
11
+ apply_to '1.8.7' do
12
+ after_install do
13
+ depend_on 'rubygems', version: '1.6.2'
14
+ end
15
+ end
16
+
17
+ apply_to '1.9.1' do
18
+ before_install do
19
+ depend_on 'yaml', version: '0.1.6'
20
+ end
21
+ after_install do
22
+ depend_on 'rubygems', version: '1.3.7'
23
+ end
24
+ end
25
+
26
+ apply_to '1.9.2' do
27
+ before_install do
28
+ depend_on 'yaml', version: '0.1.6'
29
+ end
30
+ after_install do
31
+ depend_on 'rubygems', version: '1.8.23'
32
+ end
33
+ end
34
+
35
+ apply_to [">= 1.9.3", "< 2.1.2"] do
36
+ before_install do
37
+ depend_on 'yaml', version: '0.1.6'
38
+ end
39
+ end
40
+
41
+ apply_to '>= 1.9.3' do
42
+ before_install do
43
+ depend_on 'openssl', version: '1.0.2g'
44
+ #depend_on 'yaml', version: '0.1.6'
45
+ end
46
+ end
47
+
48
+ apply_to :all do
49
+ after_install do
50
+ depend_on 'bundler', version: '1.11.2'
51
+ end
52
+ end
53
+
54
+ protected
55
+
56
+ def setup_install_tasks
57
+ super
58
+ commands[:install].switch :install_doc, "Install Ruby document"
59
+ commands[:install].option :bundler, "Bundler version"
60
+ end
61
+
62
+ def decompose_version(version)
63
+ major_version, patch_level = version.split('-')
64
+ patch_level = '' if patch_level.nil?
65
+ patch_level = $1 if patch_level.match(/^p(\d+)$/)
66
+ { major_version: major_version, patch_level: patch_level }
67
+ end
68
+
69
+ class Installer < Luban::Deployment::Package::Installer
70
+ attr_reader :opt_dirs
71
+
72
+ def install_doc?
73
+ task.opts.install_doc
74
+ end
75
+
76
+ def ruby_executable
77
+ @ruby_executable ||= bin_path.join('ruby')
78
+ end
79
+
80
+ def gem_executable
81
+ @gem_executable ||= bin_path.join('gem')
82
+ end
83
+
84
+ def source_repo
85
+ @source_repo ||= "https://cache.ruby-lang.org"
86
+ end
87
+
88
+ def source_url_root
89
+ @source_url_root ||= "pub/ruby/#{package_major_version.gsub(/\.\d+$/, '')}"
90
+ end
91
+
92
+ def installed?
93
+ return false unless file?(ruby_executable)
94
+ pattern = Regexp.escape(package_major_version)
95
+ unless package_patch_level.empty?
96
+ pattern += ".*#{Regexp.escape(package_patch_level)}"
97
+ end
98
+ match?("#{ruby_executable} -v", Regexp.new(pattern))
99
+ end
100
+
101
+ def with_opt_dir(dir)
102
+ @opt_dirs << dir
103
+ end
104
+ alias_method :with_openssl_dir, :with_opt_dir
105
+ alias_method :with_yaml_dir, :with_opt_dir
106
+
107
+ protected
108
+
109
+ def configure_build_options
110
+ super
111
+ unless install_doc?
112
+ @configure_opts.unshift("--disable-install-doc")
113
+ end
114
+ @opt_dirs = []
115
+ end
116
+
117
+ def compose_build_options
118
+ @configure_opts << "--with-opt-dir=#{@opt_dirs.join(':')}"
119
+ super
120
+ end
121
+ end
122
+ end
123
+ end
124
+ end
125
+ end
@@ -0,0 +1,89 @@
1
+ module Luban
2
+ module Deployment
3
+ module Packages
4
+ class Rubygems < Luban::Deployment::Package::Binary
5
+ protected
6
+
7
+ def setup_install_tasks
8
+ super
9
+ commands[:install].switch :install_doc, "Install Rubygems document"
10
+ end
11
+
12
+ class Installer < Luban::Deployment::Package::Installer
13
+ def install_doc?
14
+ task.opts.install_doc
15
+ end
16
+
17
+ def package_path
18
+ parent.package_path
19
+ end
20
+
21
+ def install_path
22
+ parent.install_path
23
+ end
24
+
25
+ def rubygems_executable
26
+ @rubygems_executable ||= bin_path.join('gem')
27
+ end
28
+
29
+ def ruby_executable
30
+ parent.ruby_executable
31
+ end
32
+
33
+ def src_file_extname
34
+ @src_file_extname ||= 'tgz'
35
+ end
36
+
37
+ def source_repo
38
+ #@source_repo ||= "http://production.cf.rubygems.org"
39
+ @source_repo ||= "https://rubygems.org"
40
+ end
41
+
42
+ def source_url_root
43
+ @source_url_root ||= "rubygems"
44
+ end
45
+
46
+ def installed?
47
+ return false unless file?(rubygems_executable)
48
+ match?("#{rubygems_executable} -v", package_version)
49
+ end
50
+
51
+ protected
52
+
53
+ def configure_build_options
54
+ super
55
+ unless install_doc?
56
+ @configure_opts.push('--no-rdoc', '--no-ri')
57
+ end
58
+ end
59
+
60
+ def validate
61
+ if parent.nil?
62
+ abort "Aborted! Parent package for Rubygems MUST be provided."
63
+ end
64
+ unless parent.is_a?(Ruby::Installer)
65
+ abort "Aborted! Parent package for Rubygems MUST be an instance of #{Ruby::Installer.name}"
66
+ end
67
+ end
68
+
69
+ def configure_package!
70
+ test(ruby_executable,
71
+ "setup.rb config #{configure_opts.reject(&:empty?).join(' ')} >> #{install_log_file_path} 2>&1")
72
+ end
73
+
74
+ def make_package!
75
+ test(ruby_executable,
76
+ "setup.rb setup >> #{install_log_file_path} 2>&1")
77
+ end
78
+
79
+ def install_package!
80
+ test(ruby_executable,
81
+ "setup.rb install >> #{install_log_file_path} 2>&1")
82
+ end
83
+
84
+ def update_binstubs!; end
85
+ end
86
+ end
87
+ end
88
+ end
89
+ end
@@ -0,0 +1,33 @@
1
+ module Luban
2
+ module Deployment
3
+ module Packages
4
+ class Yaml < Luban::Deployment::Package::Binary
5
+ class Installer < Luban::Deployment::Package::Installer
6
+ def header_file
7
+ @header_file ||= include_path.join('yaml.h')
8
+ end
9
+
10
+ def shared_obj_file
11
+ @shared_obj_file ||= lib_path.join("libyaml.#{lib_extension}")
12
+ end
13
+
14
+ def source_repo
15
+ @source_repo ||= "http://pyyaml.org"
16
+ end
17
+
18
+ def source_url_root
19
+ @source_url_root ||= "download/libyaml"
20
+ end
21
+
22
+ def installed?
23
+ file?(header_file) and file?(shared_obj_file)
24
+ end
25
+
26
+ protected
27
+
28
+ def update_binstubs!; end
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,160 @@
1
+ module Luban
2
+ module Deployment
3
+ module Parameters
4
+ module Base
5
+ def parameter(*params)
6
+ params.each do |param|
7
+ define_method(param) do |value = nil|
8
+ value.nil? ? fetch(__method__) : set(__method__, value)
9
+ end
10
+ end
11
+ end
12
+ end
13
+
14
+ module General
15
+ extend Base
16
+
17
+ DefaultLubanRootPath = Pathname.new('/opt/luban')
18
+
19
+ def self.included(mod)
20
+ mod.extend(Base)
21
+ end
22
+
23
+ parameter :luban_roles
24
+ parameter :luban_root_path
25
+
26
+ parameter :stages
27
+ parameter :production_stages
28
+ parameter :applications
29
+
30
+ parameter :work_dir
31
+ parameter :apps_path
32
+ parameter :project
33
+ parameter :user
34
+ parameter :config_finder
35
+
36
+ def production_stage?(stage)
37
+ production_stages.include?(stage)
38
+ end
39
+
40
+ protected
41
+
42
+ def set_default_general_parameters
43
+ set_default :luban_roles, %i(app)
44
+ set_default :luban_root_path, DefaultLubanRootPath
45
+ set_default :user, ENV['USER']
46
+ set_default :config_finder, {}
47
+ end
48
+
49
+ def validate_general_parameters
50
+ if user != ENV['USER']
51
+ abort "Aborted! Given deployment user (#{user.inspect}) is NOT the current user #{ENV['USER'].inspect}" +
52
+ "Please switch to the deployment user before any deployments."
53
+ end
54
+ if project.nil?
55
+ abort "Aborted! Please specify the project name: project 'project name'"
56
+ end
57
+ if luban_root_path.is_a?(String)
58
+ luban_root_path Pathname.new(luban_root_path)
59
+ end
60
+ unless luban_root_path.is_a?(Pathname)
61
+ abort "Aborted! Luban root path should be a String or a Pathname: luban_root_path Pathname.new('/opt/luban')"
62
+ end
63
+ end
64
+ end
65
+
66
+ module Project
67
+ extend Base
68
+
69
+ parameter :stage
70
+
71
+ parameter :process_monitor
72
+ parameter :process_monitor_env
73
+ parameter :lubhub_protocol
74
+ parameter :lubhub_host
75
+ parameter :lubhub_port
76
+
77
+ parameter :sshkit_backend
78
+ parameter :authen_key_type
79
+ parameter :default_env
80
+ parameter :log_format
81
+ parameter :log_level
82
+ parameter :pty
83
+ parameter :connection_timeout
84
+ parameter :ssh_options
85
+ parameter :shell_setup
86
+ parameter :use_sudo
87
+
88
+ # To download all package sources directly from the package providers,
89
+ # Just do NOT set any Lubpack related variables.
90
+ #
91
+ # To specify the Lubpack of your own, you can
92
+ # lubhub_protocol 'http'
93
+ # lubhub_host 'your.lubhub.com'
94
+ # lubhub_port 8080
95
+ def lubhub
96
+ lubhub_host.nil? ? nil : "#{lubhub_protocol}://#{lubhub_host}:#{lubhub_port}"
97
+ end
98
+ alias_method :lubhub_repo, :lubhub
99
+
100
+ protected
101
+
102
+ def set_default_project_parameters
103
+ set_default :lubhub_protocol, 'http'
104
+ set_default :lubhub_port, 8080
105
+ set_default :sshkit_backend, SSHKit::Backend::Netssh
106
+ set_default :authen_key_type, 'rsa'
107
+ set_default :default_env, { path: '$PATH:/usr/local/bin' }
108
+ set_default :log_format, :pretty
109
+ set_default :log_level, :info
110
+ set_default :pty, false
111
+ set_default :connection_timeout, 30 # second
112
+ set_default :ssh_options, {}
113
+ set_default :shell_setup, 'bash -l' # Use Bash interactive shell by default
114
+ set_default :use_sudo, false # Turn off sudo by default
115
+
116
+ setup_default_project_config_finder
117
+ end
118
+
119
+ def setup_default_project_config_finder
120
+ config_finder[:project] ||=
121
+ Luban::Deployment::Helpers::Configuration::Finder.project(self)
122
+ end
123
+
124
+ def validate_project_parameters; end
125
+ end
126
+
127
+ module Application
128
+ extend Base
129
+
130
+ parameter :application
131
+ parameter :scm_role
132
+ parameter :keep_releases
133
+ parameter :linked_dirs
134
+ parameter :linked_files
135
+
136
+ protected
137
+
138
+ def set_default_application_parameters
139
+ set_default :scm_role, :scm
140
+ set_default :keep_releases, 3
141
+ set_default :linked_dirs, []
142
+ set_default :linked_files, []
143
+
144
+ setup_default_application_config_finder
145
+ end
146
+
147
+ def setup_default_application_config_finder
148
+ config_finder[:application] ||=
149
+ Luban::Deployment::Helpers::Configuration::Finder.application(self)
150
+ end
151
+
152
+ def validate_application_parameters
153
+ if application.nil?
154
+ abort "Aborted! Please specify the application name - application 'app name'"
155
+ end
156
+ end
157
+ end
158
+ end
159
+ end
160
+ end
@@ -0,0 +1,99 @@
1
+ require 'luban/cli'
2
+
3
+ module Luban
4
+ module Deployment
5
+ class Runner < Luban::CLI::Application
6
+ using Luban::CLI::CoreRefinements
7
+ include Luban::Deployment::Helpers::Configuration
8
+ include Luban::Deployment::Parameters::General
9
+
10
+ def default_rc
11
+ @default_rc ||= { 'luban_roles' => %i(app),
12
+ 'luban_root_path' => Parameters::General::DefaultLubanRootPath,
13
+ 'stages' => %w(development staging production),
14
+ 'production_stages' => %w(production)
15
+ }
16
+ end
17
+
18
+ def lubanfile; @lubanfile ||= 'Lubanfile.rb'; end
19
+
20
+ def config_file
21
+ @config_file ||= work_dir.join(lubanfile)
22
+ end
23
+
24
+ protected
25
+
26
+ def on_configure
27
+ super
28
+ set_work_dir
29
+ load_configuration_file(config_file)
30
+ set_default_parameters
31
+ load_libraries
32
+ setup_cli
33
+ end
34
+
35
+ def set_default_parameters
36
+ %i(luban_roles luban_root_path
37
+ stages production_stages).each { |p| set_default p, rc[p.to_s] }
38
+
39
+ set_default :applications, find_applications
40
+ set_default :project, File.basename(work_dir)
41
+ set_default :user, (rc['user'] || ENV['USER'])
42
+ end
43
+
44
+ def find_applications
45
+ apps_path.children.select(&:directory?).map(&:basename).map(&:to_s)
46
+ end
47
+
48
+ def set_work_dir
49
+ project_root = find_lubanfile
50
+ if project_root.nil?
51
+ abort "Aborted! NOT a Luban project (or any of the parent directories): #{lubanfile} is NOT found."
52
+ else
53
+ work_dir Pathname.new(project_root)
54
+ apps_path work_dir.join('apps')
55
+ end
56
+ end
57
+
58
+ def find_lubanfile
59
+ original = current = Dir.pwd
60
+ until File.exist?(lubanfile)
61
+ Dir.chdir('..')
62
+ return nil if Dir.pwd == current
63
+ current = Dir.pwd
64
+ end
65
+ current
66
+ ensure
67
+ Dir.chdir(original)
68
+ end
69
+
70
+ def load_libraries
71
+ require "#{work_dir}/lib/project"
72
+ end
73
+
74
+ def project_base_class
75
+ Object.const_get(project.camelcase)
76
+ end
77
+
78
+ def setup_cli
79
+ version Luban::Deployment::VERSION
80
+ desc "Manage the deployment of project #{project.camelcase}"
81
+ setup_projects
82
+ end
83
+
84
+ def setup_projects
85
+ stages.each { |stg| setup_project(stg) }
86
+ end
87
+
88
+ def setup_project(stg)
89
+ stg = stg.to_sym
90
+ commands[stg] = project_class(stg).new(self, stg)
91
+ end
92
+
93
+ def project_class(stg)
94
+ mod = Object.const_set(stg.camelcase, Module.new)
95
+ mod.const_set(project.camelcase, Class.new(project_base_class))
96
+ end
97
+ end
98
+ end
99
+ end
@@ -0,0 +1,30 @@
1
+ # Project environment activation resource file for <%= stage %>.<%= project %>/<%= application %>
2
+ # Revision: <%= revision %>
3
+ # Created at <%= Time.now().strftime("%d/%m/%Y %H:%M:%S") %>
4
+
5
+ echo_line() {
6
+ if [ "$PS1" ]; then
7
+ printf "$1\n"
8
+ fi
9
+ }
10
+
11
+ if [ -n "${LUBAN_ROOT:+x}" ]; then
12
+ if [[ "$LUBAN_ROOT" == "<%= app_path %>" ]]; then
13
+ echo_line "Project environment for <%= project %> has ALREADY been activated!"
14
+ else
15
+ local current_env=${LUBAN_ROOT##*env/}
16
+ echo_line "Project environment $current_env is STILL active!"
17
+ echo_line "Please de-activate it first:"
18
+ echo_line "\tunset_lubenv $current_env"
19
+ echo_line "\t\tor"
20
+ echo_line "\tsource $LUBAN_ROOT/.unset_envrc"
21
+ fi
22
+ else
23
+ LUBAN_ROOT="<%= app_path %>"
24
+ PATH="$LUBAN_ROOT/bin:$PATH"
25
+ export LUBAN_ROOT
26
+ export PATH
27
+
28
+ echo_line "Project environment <%= stage %>.<%= project %>/<%= application %> is activated!"
29
+ fi
30
+
@@ -0,0 +1,28 @@
1
+ # Project environment de-activation resource file for <%= stage %>.<%= project %>/<%= application %>
2
+ # Revision: <%= revision %>
3
+ # Created at <%= Time.now().strftime("%d/%m/%Y %H:%M:%S") %>
4
+
5
+ echo_line() {
6
+ if [ "$PS1" ]; then
7
+ printf "$1\n"
8
+ fi
9
+ }
10
+
11
+ if [ -n "${LUBAN_ROOT:+x}" ]; then
12
+ if [[ "$LUBAN_ROOT" =~ "<%= app_path %>" ]]; then
13
+ PATH=${PATH//$LUBAN_ROOT\/bin:/}
14
+ unset LUBAN_ROOT
15
+ export PATH
16
+ echo_line "Project environment <%= stage %>.<%= project %>/<%= application %> is de-activated!"
17
+ else
18
+ local current_env=${LUBAN_ROOT##*env/}
19
+ echo_line "ACTUALLY, project environment $curent_env is active!"
20
+ echo_line "Please run the following command instead to de-activate it:"
21
+ echo_line "\tunset_lubenv $current_env"
22
+ echo_line "\t\tor"
23
+ echo_line "\tsource $LUBAN_ROOT/.unset_envrc"
24
+ fi
25
+ else
26
+ echo_line "Project environment <%= stage %>.<%= project %>/<%= application %> has ALREADY been de-activated!"
27
+ fi
28
+
@@ -0,0 +1,5 @@
1
+ module Luban
2
+ module Deployment
3
+ VERSION = "0.2.0"
4
+ end
5
+ end
@@ -0,0 +1,71 @@
1
+ module Luban
2
+ module Deployment
3
+ module Worker
4
+ class Base
5
+ include Luban::Deployment::Helpers::Configuration
6
+ include Luban::Deployment::Helpers::Utils
7
+ include Luban::Deployment::Parameters::General
8
+ include Luban::Deployment::Parameters::Project
9
+ include Luban::Deployment::Parameters::Application
10
+
11
+ attr_reader :task
12
+
13
+ def initialize(config:, backend:, **task, &blk)
14
+ @config = config
15
+ @backend = backend
16
+ @run_blk = blk
17
+ @task = create_task(task)
18
+ init
19
+ validate
20
+ end
21
+
22
+ def force?; task.opts.force; end
23
+ def dry_run?; task.opts.dry_run; end
24
+
25
+ def osx?; os_name == 'Darwin'; end
26
+ def linux?; os_name == 'Linux'; end
27
+
28
+ def run
29
+ update_result(__return__: @run_blk ? run_with_block : run_with_command).to_h
30
+ end
31
+
32
+ protected
33
+
34
+ def create_task(task)
35
+ Task.new(task).tap { |t| t.result.hostname = hostname }
36
+ end
37
+
38
+ def init; end
39
+ def validate; end
40
+ def before_run; end
41
+ def after_run; end
42
+
43
+ def run_with_block
44
+ before_run
45
+ r = instance_eval &@run_blk
46
+ after_run
47
+ r
48
+ end
49
+
50
+ def run_with_command
51
+ before_run
52
+ send("before_#{task.cmd}") if respond_to?("before_#{task.cmd}", true)
53
+ r = send(task.cmd)
54
+ send("after_#{task.cmd}") if respond_to?("after_#{task.cmd}", true)
55
+ after_run
56
+ r
57
+ end
58
+
59
+ def update_result(message = nil, status: :succeeded, level: :info, **attrs)
60
+ task.result.tap do |r|
61
+ r.status = status
62
+ r.level = level
63
+ r.message = message unless message.nil?
64
+ attrs.each_pair { |k, v| r.send("#{k}=", v) }
65
+ send(level, message) unless message.nil? or message.empty?
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end