luban 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
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