luban 0.4.4 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (29) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +12 -0
  3. data/lib/luban/deployment/cli/application/base.rb +23 -0
  4. data/lib/luban/deployment/cli/command.rb +2 -2
  5. data/lib/luban/deployment/cli/project.rb +23 -2
  6. data/lib/luban/deployment/cli/service/base.rb +30 -1
  7. data/lib/luban/deployment/helpers/configuration.rb +3 -3
  8. data/lib/luban/deployment/helpers/generator.rb +134 -0
  9. data/lib/luban/deployment/helpers.rb +2 -1
  10. data/lib/luban/deployment/runner.rb +24 -5
  11. data/lib/luban/deployment/templates/application/config/deploy/__stage/packages/.gitkeep +0 -0
  12. data/lib/luban/deployment/templates/application/config/deploy/__stage/profile/.gitkeep +0 -0
  13. data/lib/luban/deployment/templates/application/config/deploy/__stage/templates/.gitkeep +0 -0
  14. data/lib/luban/deployment/templates/application/config/deploy/__stage.rb.erb +4 -0
  15. data/lib/luban/deployment/templates/application/config/deploy.rb.erb +1 -0
  16. data/lib/luban/deployment/templates/application/config/templates/profile/.gitkeep +0 -0
  17. data/lib/luban/deployment/templates/application/lib/application.rb.erb +4 -0
  18. data/lib/luban/deployment/templates/project/CHANGELOG.md.erb +6 -0
  19. data/lib/luban/deployment/templates/project/Gemfile +3 -0
  20. data/lib/luban/deployment/templates/project/LICENSE.txt.erb +21 -0
  21. data/lib/luban/deployment/templates/project/Lubanfile.rb.erb +1 -0
  22. data/lib/luban/deployment/templates/project/README.md.erb +4 -0
  23. data/lib/luban/deployment/templates/project/apps/.gitkeep +0 -0
  24. data/lib/luban/deployment/templates/project/config/deploy/__stage.rb.erb +1 -0
  25. data/lib/luban/deployment/templates/project/config/deploy.rb.erb +4 -0
  26. data/lib/luban/deployment/templates/project/config/templates/.gitkeep +0 -0
  27. data/lib/luban/deployment/templates/project/lib/project.rb.erb +3 -0
  28. data/lib/luban/deployment/version.rb +1 -1
  29. metadata +20 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 585aa96ddd38e14f5d9881007237a4760ab220e6
4
- data.tar.gz: dc579d8755192ad2d36d3cbff05a70cd393f0e41
3
+ metadata.gz: 03a9c57a554704d306e2a27b7e7275d3f40597aa
4
+ data.tar.gz: 0daf44cc27a95855104af6c961e7fde2955c5e37
5
5
  SHA512:
6
- metadata.gz: 804e27345bfa3221dbd8c870bec37ec10cf6e1837a097bfe0b6a4d468a058beeabf15214fb29949172043a0a619670efbfda3942fa8681ba8110b22ad09fa8f0
7
- data.tar.gz: 5cb57933081f512293b4be83edfbd7094049d6a01c304eb8b419f300f0666b4d380effd8a3e7c3829730959735d1cd52088417e89b199c19116b50d5ffc083d2
6
+ metadata.gz: 4a7b0b50e21b604f2309086267db37960632dd69783e12aa3f0a844e19417c0825260d1a20cd8b1bb7344f146a3c9313a1641e68e4bf506e2dff1fb5bd9db0c8
7
+ data.tar.gz: 5af9a462115a938ef504bcd38d78732fa3bd95ea773a2e4e8a8ce900ab472004aacab5802a6fb4652e65ea202738880dcab879d5e683d5761dfdc9b87becc3d7
data/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # Change log
2
2
 
3
+ ## Version 0.5.0 (Jun 22, 2016)
4
+
5
+ Minor enhancements:
6
+ * Added a series of subcommands, #init to
7
+ * Initialize a Luban deployment project
8
+ * Initialize a Luban deployment application
9
+ * Initialize a Luban deployment service
10
+ * Added deployment project and application skeleton and templates
11
+
12
+ Bug fixes:
13
+ * Corrected the checking for profile existence for a deployment application/service
14
+
3
15
  ## Version 0.4.4 (Jun 17, 2016)
4
16
 
5
17
  Bug fixes:
@@ -116,6 +116,14 @@ module Luban
116
116
  end
117
117
  end
118
118
 
119
+ def init_services(args:, opts:)
120
+ show_app_environment
121
+ service = args[:service]
122
+ (service.nil? ? services.values : [services[service]]).each do |s|
123
+ s.init_service(args: args, opts: opts)
124
+ end
125
+ end
126
+
119
127
  protected
120
128
 
121
129
  def set_parameters
@@ -157,6 +165,21 @@ module Luban
157
165
  long_desc "Manage the deployment of application #{display_name} in #{parent.class.name}"
158
166
  end
159
167
 
168
+ def setup_tasks
169
+ setup_init_services
170
+ super
171
+ end
172
+
173
+ def setup_init_services
174
+ return unless has_services?
175
+ service_names = services.keys
176
+ command :init do
177
+ desc 'Initialize deployment services'
178
+ argument :service, 'Service name', within: service_names, required: false, type: :symbol
179
+ action! :init_services
180
+ end
181
+ end
182
+
160
183
  def show_app_environment
161
184
  puts "#{display_name} in #{parent.class.name}"
162
185
  end
@@ -57,13 +57,13 @@ module Luban
57
57
 
58
58
  task :which do
59
59
  desc "Show the real path for the given executable"
60
- argument :executable, "Executable to which", short: :e, required: true
60
+ argument :executable, "Executable to which"
61
61
  action! :which
62
62
  end
63
63
 
64
64
  task :whence do
65
65
  desc "List packages with the given executable"
66
- argument :executable, "Executable to whence", short: :e, required: true
66
+ argument :executable, "Executable to whence"
67
67
  action! :whence
68
68
  end
69
69
  end
@@ -62,6 +62,12 @@ module Luban
62
62
  end
63
63
  end
64
64
 
65
+ def init_application(args:, opts:)
66
+ singleton_class.send(:include, Luban::Deployment::Helpers::Generator::Application)
67
+ define_singleton_method(:application) { args[:application] }
68
+ create_application_skeleton
69
+ end
70
+
65
71
  protected
66
72
 
67
73
  def validate_parameters
@@ -80,7 +86,7 @@ module Luban
80
86
 
81
87
  def load_libraries
82
88
  applications.each do |app|
83
- require "#{work_dir}/apps/#{app}/lib/application"
89
+ require "#{apps_path}/#{app}/lib/application"
84
90
  end
85
91
  end
86
92
 
@@ -90,6 +96,7 @@ module Luban
90
96
 
91
97
  def setup_cli
92
98
  setup_applications
99
+ setup_init_application
93
100
  super
94
101
  end
95
102
 
@@ -100,9 +107,23 @@ module Luban
100
107
  def setup_applications
101
108
  @apps = {}
102
109
  applications.map(&:to_sym).each do |app|
103
- @apps[app] = command(app, base: application_base_class(app))
110
+ if application_initialized?(app)
111
+ @apps[app] = command(app, base: application_base_class(app))
112
+ end
113
+ end
114
+ end
115
+
116
+ def setup_init_application
117
+ command :init do
118
+ desc 'Initialize a Luban deployment application'
119
+ argument :application, 'Application name', required: true
120
+ action! :init_application
104
121
  end
105
122
  end
123
+
124
+ def application_initialized?(app)
125
+ File.file?("#{apps_path}/#{app}/config/deploy/#{stage}.rb")
126
+ end
106
127
  end
107
128
  end
108
129
  end
@@ -24,11 +24,36 @@ module Luban
24
24
  end
25
25
  service_action :update_profile, dispatch_to: :configurator, locally: true
26
26
 
27
+ def has_templates?
28
+ respond_to?(:default_templates_path, true)
29
+ end
30
+
31
+ def init_service(args:, opts:)
32
+ return unless has_templates?
33
+ require 'fileutils'
34
+ puts " Initializing #{name} profile"
35
+ templates_path = config_finder[:application].profile_templates_path.join(name.to_s)
36
+ profile_path = config_finder[:application].stage_profile_path.join(name.to_s)
37
+ [templates_path, profile_path].each { |p| FileUtils.mkdir(p) unless p.directory? }
38
+ init_templates.each do |src_path|
39
+ next unless src_path.file?
40
+ dst_path = (src_path.extname == '.erb' ? templates_path : profile_path).
41
+ join(src_path.basename)
42
+ print " - #{dst_path.basename}"
43
+ if dst_path.file?
44
+ puts " [skipped]"
45
+ else
46
+ FileUtils.cp(src_path, dst_path)
47
+ puts " [created]"
48
+ end
49
+ end
50
+ end
51
+
27
52
  protected
28
53
 
29
54
  def on_configure
30
55
  super
31
- include_default_templates_path if respond_to?(:default_templates_path, true)
56
+ include_default_templates_path if has_templates?
32
57
  end
33
58
 
34
59
  def include_default_templates_path
@@ -43,6 +68,10 @@ module Luban
43
68
  super
44
69
  linked_dirs.push('log', 'pids')
45
70
  end
71
+
72
+ def init_templates
73
+ default_templates_path.children
74
+ end
46
75
  end
47
76
  end
48
77
  end
@@ -107,9 +107,9 @@ module Luban
107
107
  def base_path; base_path ||= target.apps_path.join(target.application); end
108
108
 
109
109
  def has_profile?
110
- stage_profile_templates_path.directory? or
111
- stage_profile_path.directory? or
112
- profile_templates_path.directory?
110
+ !Dir["#{stage_profile_templates_path}/**/*"].empty? or
111
+ !Dir["#{stage_profile_path}/**/*"].empty? or
112
+ !Dir["#{profile_templates_path}/**/*"].empty?
113
113
  end
114
114
 
115
115
  def find_template_file(file_name)
@@ -0,0 +1,134 @@
1
+ require 'fileutils'
2
+
3
+ module Luban
4
+ module Deployment
5
+ module Helpers
6
+ module Generator
7
+ using Luban::CLI::CoreRefinements
8
+
9
+ module Base
10
+ protected
11
+
12
+ def skeletons_path
13
+ @skeletons_path ||=
14
+ Pathname.new(__FILE__).dirname.join('..').join('templates').realpath
15
+ end
16
+
17
+ def copy_dir(src_path, dst_path, stages: [], depth: 1)
18
+ indent = ' ' * depth
19
+ print indent + "- #{dst_path.basename}"
20
+ mkdir(dst_path)
21
+ src_files = []
22
+ src_path.each_child do |p|
23
+ if p.directory?
24
+ if placeholder?(p.basename)
25
+ stages.each do |s|
26
+ copy_dir(p, dst_path.join(staged_basename(s, p.basename)), depth: depth + 1)
27
+ end
28
+ else
29
+ copy_dir(p, dst_path.join(p.basename), stages: stages, depth: depth + 1)
30
+ end
31
+ else
32
+ src_files << p
33
+ end
34
+ end
35
+ src_files.each do |f|
36
+ basename = f.basename
37
+ action = :copy_file
38
+ if basename.extname == '.erb'
39
+ basename = basename.sub_ext('')
40
+ action = :render_file
41
+ end
42
+ if placeholder?(basename)
43
+ stages.each do |stage|
44
+ n = staged_basename(stage, basename)
45
+ print indent + " - #{n}"
46
+ send(action, f, dst_path.join(n), context: binding)
47
+ end
48
+ else
49
+ print indent + " - #{basename}"
50
+ send(action, f, dst_path.join(basename))
51
+ end
52
+ end
53
+ end
54
+
55
+ def mkdir(path)
56
+ if path.directory?
57
+ puts " [skipped]"
58
+ else
59
+ FileUtils.mkdir(path)
60
+ puts " [created]"
61
+ end
62
+ end
63
+
64
+ def copy_file(src_path, dst_path)
65
+ if dst_path.file?
66
+ puts " [skipped]"
67
+ else
68
+ FileUtils.cp(src_path, dst_path)
69
+ puts " [created]"
70
+ end
71
+ end
72
+
73
+ def render_file(template_path, output_path, context: binding)
74
+ if output_path.file?
75
+ puts " [skipped]"
76
+ else
77
+ require 'erb'
78
+ File.open(output_path, 'w') do |f|
79
+ f.write ERB.new(File.read(template_path), nil, '<>').result(context)
80
+ end
81
+ puts " [created]"
82
+ end
83
+ end
84
+
85
+ def placeholder?(basename)
86
+ basename.to_s =~ /^__stage/
87
+ end
88
+
89
+ def staged_basename(stage, basename)
90
+ basename.to_s.sub!(/^__stage/, stage)
91
+ end
92
+ end
93
+
94
+ module Project
95
+ include Base
96
+
97
+ def project_skeleton_path
98
+ @project_skeleton_path ||= skeletons_path.join('project')
99
+ end
100
+
101
+ def project_target_path
102
+ @project_target_path ||= (work_dir or Pathname.pwd.join(project))
103
+ end
104
+
105
+ def create_project_skeleton
106
+ puts "Creating skeleton for project #{project.camelcase}"
107
+ copy_dir(project_skeleton_path, project_target_path, stages: stages)
108
+ end
109
+ end
110
+
111
+ module Application
112
+ include Base
113
+
114
+ def application_skeleton_path
115
+ @application_skeleton_path ||= skeletons_path.join('application')
116
+ end
117
+
118
+ def application_target_path
119
+ @application_target_path ||= apps_path.join(application)
120
+ end
121
+
122
+ def application_name
123
+ "#{project}:#{application}".camelcase
124
+ end
125
+
126
+ def create_application_skeleton
127
+ puts "Creating skeleton for #{stage} application #{application_name}"
128
+ copy_dir(application_skeleton_path, application_target_path, stages: [stage])
129
+ end
130
+ end
131
+ end
132
+ end
133
+ end
134
+ end
@@ -1,2 +1,3 @@
1
1
  require_relative 'helpers/configuration'
2
- require_relative 'helpers/utils'
2
+ require_relative 'helpers/utils'
3
+ require_relative 'helpers/generator'
@@ -20,6 +20,12 @@ module Luban
20
20
  @config_file ||= work_dir.join(lubanfile)
21
21
  end
22
22
 
23
+ def init_project(args:, opts:)
24
+ set_default :project, args[:project]
25
+ singleton_class.send(:include, Luban::Deployment::Helpers::Generator::Project)
26
+ create_project_skeleton
27
+ end
28
+
23
29
  protected
24
30
 
25
31
  def on_configure
@@ -31,12 +37,14 @@ module Luban
31
37
  end
32
38
  end
33
39
 
34
- def set_default_parameters
40
+ def set_default_common_parameters
35
41
  %i(luban_roles luban_root_path stages).each { |p| set_default p, rc[p.to_s] }
42
+ set_default :user, (rc['user'] || ENV['USER'])
43
+ end
36
44
 
45
+ def set_default_project_parameters
37
46
  set_default :applications, find_applications
38
47
  set_default :project, File.basename(work_dir)
39
- set_default :user, (rc['user'] || ENV['USER'])
40
48
  end
41
49
 
42
50
  def find_applications
@@ -73,11 +81,13 @@ module Luban
73
81
 
74
82
  def setup_cli_with_projects
75
83
  load_configuration_file(config_file)
76
- set_default_parameters
84
+ set_default_common_parameters
85
+ set_default_project_parameters
77
86
  load_libraries
78
87
 
79
88
  version Luban::Deployment::VERSION
80
89
  desc "Manage the deployment of project #{project.camelcase}"
90
+ setup_init_project(false)
81
91
  setup_projects
82
92
  end
83
93
 
@@ -96,10 +106,19 @@ module Luban
96
106
  end
97
107
 
98
108
  def setup_cli_without_projects
109
+ set_default_common_parameters
110
+
99
111
  version Luban::Deployment::VERSION
100
112
  desc "Framework to manage project deployment"
101
- action do
102
- abort "Aborted! NOT a Luban project (or any of the parent directories): #{lubanfile} is NOT found."
113
+
114
+ setup_init_project
115
+ end
116
+
117
+ def setup_init_project(new_project = true)
118
+ command :init do
119
+ desc 'Initialize a Luban deployment project'
120
+ argument :project, 'Project name', required: true if new_project
121
+ action! :init_project
103
122
  end
104
123
  end
105
124
  end
@@ -0,0 +1,4 @@
1
+ # Deployment configuration for <%= stage %> application <%= application_name %>
2
+
3
+ # Application servers
4
+ role :app, `hostname -f`.chomp
@@ -0,0 +1 @@
1
+ # Deployment configuration for application <%= application_name %>
@@ -0,0 +1,4 @@
1
+ class <%= project.camelcase %>
2
+ class <%= application.camelcase %> < Luban::Deployment::Application
3
+ end
4
+ end
@@ -0,0 +1,6 @@
1
+ # Change log
2
+
3
+ ## Version 0.1.0 (<%= Time.now().strftime("%b %d, %Y") %>)
4
+
5
+ New features:
6
+ * Craeted Luban deployment project to manage the <%= project.camelcase %> enivironment.
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'luban'
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) <%= Time.now.year %> <%= user.capitalize %>
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
@@ -0,0 +1 @@
1
+ stages %w(<%= stages.join(' ') %>)
@@ -0,0 +1,4 @@
1
+ <%= project.camelcase %>
2
+ ====
3
+
4
+ Luban deployment project to manage the <%= project.camelcase %> enivironment.
@@ -0,0 +1 @@
1
+ # Deployment configuration for <%= stage %> project <%= project.camelcase %>
@@ -0,0 +1,4 @@
1
+ # Deployment configuration for project <%= project.camelcase %>
2
+
3
+ # Specify process monitor
4
+ # process_monitor_via 'monit'
@@ -0,0 +1,3 @@
1
+ class <%= project.camelcase %> < Luban::Deployment::Project
2
+ VERSION = '0.1.0'
3
+ end
@@ -1,5 +1,5 @@
1
1
  module Luban
2
2
  module Deployment
3
- VERSION = "0.4.4"
3
+ VERSION = "0.5.0"
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: luban
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.4
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rubyist Lei
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-06-17 00:00:00.000000000 Z
11
+ date: 2016-06-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: luban-cli
@@ -134,6 +134,7 @@ files:
134
134
  - lib/luban/deployment/error.rb
135
135
  - lib/luban/deployment/helpers.rb
136
136
  - lib/luban/deployment/helpers/configuration.rb
137
+ - lib/luban/deployment/helpers/generator.rb
137
138
  - lib/luban/deployment/helpers/utils.rb
138
139
  - lib/luban/deployment/packages/bundler.rb
139
140
  - lib/luban/deployment/packages/git.rb
@@ -143,8 +144,25 @@ files:
143
144
  - lib/luban/deployment/packages/yaml.rb
144
145
  - lib/luban/deployment/parameters.rb
145
146
  - lib/luban/deployment/runner.rb
147
+ - lib/luban/deployment/templates/application/config/deploy.rb.erb
148
+ - lib/luban/deployment/templates/application/config/deploy/__stage.rb.erb
149
+ - lib/luban/deployment/templates/application/config/deploy/__stage/packages/.gitkeep
150
+ - lib/luban/deployment/templates/application/config/deploy/__stage/profile/.gitkeep
151
+ - lib/luban/deployment/templates/application/config/deploy/__stage/templates/.gitkeep
152
+ - lib/luban/deployment/templates/application/config/templates/profile/.gitkeep
153
+ - lib/luban/deployment/templates/application/lib/application.rb.erb
146
154
  - lib/luban/deployment/templates/envrc.erb
147
155
  - lib/luban/deployment/templates/header.erb
156
+ - lib/luban/deployment/templates/project/CHANGELOG.md.erb
157
+ - lib/luban/deployment/templates/project/Gemfile
158
+ - lib/luban/deployment/templates/project/LICENSE.txt.erb
159
+ - lib/luban/deployment/templates/project/Lubanfile.rb.erb
160
+ - lib/luban/deployment/templates/project/README.md.erb
161
+ - lib/luban/deployment/templates/project/apps/.gitkeep
162
+ - lib/luban/deployment/templates/project/config/deploy.rb.erb
163
+ - lib/luban/deployment/templates/project/config/deploy/__stage.rb.erb
164
+ - lib/luban/deployment/templates/project/config/templates/.gitkeep
165
+ - lib/luban/deployment/templates/project/lib/project.rb.erb
148
166
  - lib/luban/deployment/templates/unset_envrc.erb
149
167
  - lib/luban/deployment/version.rb
150
168
  - lib/luban/deployment/worker.rb