kuber_kit 0.5.10 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 790b99f8456fde1e3c0f8f81308e6bcd7d6c8d6b4e274da4f667f0297f703b2a
4
- data.tar.gz: 6102f785babd0ba638f46b9edc0d2d2740d60bcc7d3a4dd81a8a9e210aa2dc5a
3
+ metadata.gz: 32c19efd73a0f79e6dd009a9e6700c184b78eacde4be6c7eb3e9571a6aa5977d
4
+ data.tar.gz: 6c66868a7a280ecaccc6dcb44ee75a929ecbb057545f412dab2f57e4e8c45bc9
5
5
  SHA512:
6
- metadata.gz: c61ead9e24a6f88c1ae0e8a517eb030b035d8ce68c1babefcb0de9b4a36a8638f41f57a47000f75cd2f681c4e3086477a2afd9113d5e9850bce7ad3242c2c0aa
7
- data.tar.gz: 96436dd5394baff8c2a8a2fe285909b4474df72f8548bfbecd0a2a9c28f2e6e763b0beec8b9d0ecaa6f12e69ca5c8c40974e16d1bf060911f6cf400f36a6eabc
6
+ metadata.gz: 8b1316dd6e65c9f81db7450c4e86c398357cd429054965ddff80634744f1ab5b1acedb638cd51c9c65040edd0c09c67429d5f884eef6c443ddb0e6bf558bd878
7
+ data.tar.gz: dac99cdc86d70f8f9424f6cb9aee0e7f5630e5407f878266c6373740015a5664c3ea6c27a29c9f39985b738bc7665281f9f9ced846436f251598da16bc6517f8
data/CHANGELOG.md CHANGED
@@ -1,3 +1,7 @@
1
+ **0.6.0**
2
+ - Cleanup old image build dirs
3
+ - Add rotation to deployment log file
4
+
1
5
  **0.5.10**
2
6
  - Fix a regression when deployment result would not be properly returned as json.
3
7
 
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- kuber_kit (0.5.10)
4
+ kuber_kit (0.6.0)
5
5
  cli-ui
6
6
  contracts-lite
7
7
  dry-auto_inject (~> 0.7.0)
data/TODO.md CHANGED
@@ -1,5 +1,3 @@
1
- - cleanup image builds older than some date
2
- - add some rotation for deploy log
3
1
  - env files should use a separate deployment method (with change detection)
4
2
  - add automatical confirmation support for service deployer
5
3
  - template should be able to set default attributes
data/lib/kuber_kit.rb CHANGED
@@ -79,6 +79,7 @@ module KuberKit
79
79
  end
80
80
 
81
81
  module Tools
82
+ autoload :BuildDirCleaner, 'tools/build_dir_cleaner'
82
83
  autoload :FilePresenceChecker, 'tools/file_presence_checker'
83
84
  autoload :LoggerFactory, 'tools/logger_factory'
84
85
  autoload :ProcessCleaner, 'tools/process_cleaner'
@@ -153,6 +154,7 @@ module KuberKit
153
154
  autoload :ActionHandler, 'service_deployer/action_handler'
154
155
  autoload :StrategyDetector, 'service_deployer/strategy_detector'
155
156
  autoload :Deployer, 'service_deployer/deployer'
157
+ autoload :DeploymentOptionsSelector, 'service_deployer/deployment_options_selector'
156
158
  autoload :ServiceListResolver, 'service_deployer/service_list_resolver'
157
159
  autoload :ServiceDependencyResolver, 'service_deployer/service_dependency_resolver'
158
160
 
@@ -30,7 +30,7 @@ class KuberKit::Actions::ImageCompiler
30
30
  ui.print_error("Error", e.message)
31
31
 
32
32
  compilation_result.failed!(e.message)
33
-
33
+
34
34
  false
35
35
  end
36
36
 
@@ -3,6 +3,7 @@ class KuberKit::Actions::ServiceDeployer
3
3
  "actions.image_compiler",
4
4
  "service_deployer.service_list_resolver",
5
5
  "service_deployer.service_dependency_resolver",
6
+ "service_deployer.deployment_options_selector",
6
7
  "core.service_store",
7
8
  "shell.local_shell",
8
9
  "tools.process_cleaner",
@@ -23,10 +24,9 @@ class KuberKit::Actions::ServiceDeployer
23
24
  current_configuration = KuberKit.current_configuration
24
25
 
25
26
  if services.empty? && tags.empty?
26
- services, tags = show_tags_selection
27
+ services, tags = deployment_options_selector.call()
27
28
  end
28
29
 
29
-
30
30
  disabled_services = current_configuration.disabled_services.map(&:to_s)
31
31
  disabled_services += skip_services if skip_services
32
32
 
@@ -45,20 +45,12 @@ class KuberKit::Actions::ServiceDeployer
45
45
  return false
46
46
  end
47
47
 
48
- services_list = all_service_names.map(&:to_s).map(&:yellow).join(", ")
49
- ui.print_info "ServiceDeployer", "The following services will be deployed: #{services_list}"
50
-
51
- if require_confirmation
52
- result = ui.prompt("Please confirm to continue deployment", ["confirm".green, "cancel".red])
53
- return false unless ["confirm".green, "confirm", "yes"].include?(result)
54
- end
55
-
56
- services = all_service_names.map do |service_name|
57
- service_store.get_service(service_name.to_sym)
48
+ unless allow_deployment?(require_confirmation: require_confirmation, service_names: all_service_names)
49
+ return false
58
50
  end
59
51
 
60
- images_names = services.map(&:images).flatten.uniq
61
-
52
+ # Compile images for all services and dependencies
53
+ images_names = get_image_names(service_names: all_service_names)
62
54
  unless skip_compile
63
55
  compilation_result = compile_images(images_names)
64
56
 
@@ -77,11 +69,13 @@ class KuberKit::Actions::ServiceDeployer
77
69
  rescue KuberKit::Error => e
78
70
  ui.print_error("Error", e.message)
79
71
 
80
- compilation_result.failed!(e.message)
81
-
72
+ deployment_result.failed!(e.message)
73
+
82
74
  false
83
75
  rescue Interrupt => e
84
76
  process_cleaner.clean
77
+
78
+ false
85
79
  end
86
80
 
87
81
  private
@@ -109,46 +103,23 @@ class KuberKit::Actions::ServiceDeployer
109
103
  image_compiler.call(images_names, {})
110
104
  end
111
105
 
112
- def show_tags_selection()
113
- specific_service_option = "deploy specific service"
114
- all_services_option = "deploy all services"
115
-
116
- tags = [specific_service_option, all_services_option]
117
- tags += service_store
118
- .all_definitions
119
- .values
120
- .map(&:to_service_attrs)
121
- .map(&:tags)
122
- .flatten
123
- .uniq
124
- .sort
125
- .map(&:to_s)
126
-
127
- selected_tag = ui.prompt("Please select which tag to deploy", tags)
128
-
129
- if selected_tag == specific_service_option
130
- show_service_selection
131
- elsif selected_tag == all_services_option
132
- [["*"], []]
133
- else
134
- [[], [selected_tag]]
106
+ def get_image_names(service_names:)
107
+ services = service_names.map do |service_name|
108
+ service_store.get_service(service_name.to_sym)
135
109
  end
110
+
111
+ services.map(&:images).flatten.uniq
136
112
  end
137
113
 
138
- def show_service_selection()
139
- services = service_store
140
- .all_definitions
141
- .values
142
- .map(&:service_name)
143
- .uniq
144
- .sort
145
- .map(&:to_s)
146
-
147
- if services.empty?
148
- return [[], []]
114
+ def allow_deployment?(require_confirmation:, service_names:)
115
+ services_list = service_names.map(&:to_s).map(&:yellow).join(", ")
116
+ ui.print_info "ServiceDeployer", "The following services will be deployed: #{services_list}"
117
+
118
+ unless require_confirmation
119
+ return true
149
120
  end
150
121
 
151
- selected_service = ui.prompt("Please select which service to deploy", services)
152
- [[selected_service], []]
122
+ result = ui.prompt("Please confirm to continue deployment", ["confirm".green, "cancel".red])
123
+ return ["confirm".green, "confirm", "yes"].include?(result)
153
124
  end
154
125
  end
@@ -121,6 +121,10 @@ class KuberKit::Container
121
121
  KuberKit::Core::ContextHelper::ContextHelperFactory.new
122
122
  end
123
123
 
124
+ register "tools.build_dir_cleaner" do
125
+ KuberKit::Tools::BuildDirCleaner.new
126
+ end
127
+
124
128
  register "tools.file_presence_checker" do
125
129
  KuberKit::Tools::FilePresenceChecker.new
126
130
  end
@@ -273,6 +277,10 @@ class KuberKit::Container
273
277
  KuberKit::ServiceDeployer::Deployer.new
274
278
  end
275
279
 
280
+ register "service_deployer.deployment_options_selector" do
281
+ KuberKit::ServiceDeployer::DeploymentOptionsSelector.new
282
+ end
283
+
276
284
  register "service_deployer.service_list_resolver" do
277
285
  KuberKit::ServiceDeployer::ServiceListResolver.new
278
286
  end
@@ -2,12 +2,15 @@ class KuberKit::ImageCompiler::ActionHandler
2
2
  include KuberKit::Import[
3
3
  "image_compiler.compiler",
4
4
  "core.image_store",
5
+ "tools.build_dir_cleaner",
5
6
  "configs",
6
7
  ]
7
8
 
8
9
  Contract KuberKit::Shell::AbstractShell, Symbol, String => Any
9
10
  def call(shell, image_name, build_id)
10
11
  image = image_store.get_image(image_name)
12
+
13
+ build_dir_cleaner.call(parent_dir: configs.image_compile_dir)
11
14
 
12
15
  compile_dir = generate_compile_dir(build_id: build_id)
13
16
 
@@ -0,0 +1,49 @@
1
+ class KuberKit::ServiceDeployer::DeploymentOptionsSelector
2
+ include KuberKit::Import[
3
+ "core.service_store",
4
+ "ui"
5
+ ]
6
+
7
+ OPTION_SPECIFIC_SERVICE = "deploy specific service".freeze
8
+ OPTION_ALL_SERVICES = "deploy all services"
9
+
10
+ def call()
11
+ tags = [OPTION_SPECIFIC_SERVICE, OPTION_ALL_SERVICES]
12
+ tags += service_store
13
+ .all_definitions
14
+ .values
15
+ .map(&:to_service_attrs)
16
+ .map(&:tags)
17
+ .flatten
18
+ .uniq
19
+ .sort
20
+ .map(&:to_s)
21
+
22
+ selected_tag = ui.prompt("Please select which tag to deploy", tags)
23
+
24
+ if selected_tag == OPTION_SPECIFIC_SERVICE
25
+ show_service_selection
26
+ elsif selected_tag == OPTION_ALL_SERVICES
27
+ [["*"], []]
28
+ else
29
+ [[], [selected_tag]]
30
+ end
31
+ end
32
+
33
+ def show_service_selection()
34
+ services = service_store
35
+ .all_definitions
36
+ .values
37
+ .map(&:service_name)
38
+ .uniq
39
+ .sort
40
+ .map(&:to_s)
41
+
42
+ if services.empty?
43
+ return [[], []]
44
+ end
45
+
46
+ selected_service = ui.prompt("Please select which service to deploy", services)
47
+ [[selected_service], []]
48
+ end
49
+ end
@@ -100,6 +100,18 @@ class KuberKit::Shell::LocalShell < KuberKit::Shell::AbstractShell
100
100
  end
101
101
  end
102
102
 
103
+ def list_dirs(path)
104
+ command = %Q{find -L #{path} -type f}
105
+ command += " -name '#{name}'" if name
106
+ exec!(command).split(/[\r\n]+/)
107
+ rescue => e
108
+ if e.message.include?("No such file or directory")
109
+ raise DirNotFoundError.new("Dir not found: #{path}")
110
+ else
111
+ raise e
112
+ end
113
+ end
114
+
103
115
  def wrap_command_with_pid(command)
104
116
  "KIT=#{Process.pid} #{command}"
105
117
  end
@@ -0,0 +1,26 @@
1
+ class KuberKit::Tools::BuildDirCleaner
2
+ include KuberKit::Import[
3
+ "shell.bash_commands",
4
+ "shell.local_shell",
5
+ ]
6
+
7
+ KEEP_DIRS_COUNT = 10
8
+
9
+ def call(parent_dir:)
10
+ dirs_to_delete = get_ancient_builds_dirs(parent_dir: parent_dir)
11
+
12
+ dirs_to_delete.each do |dir|
13
+ bash_commands.rm_rf(local_shell, dir)
14
+ end
15
+ end
16
+
17
+ private
18
+ def get_ancient_builds_dirs(parent_dir:)
19
+ all_dirs = Dir.glob("#{parent_dir}/*")
20
+ skip_dirs = all_dirs
21
+ .sort_by{ |f| File.ctime(f) }
22
+ .reverse[0...KEEP_DIRS_COUNT]
23
+
24
+ all_dirs - skip_dirs
25
+ end
26
+ end
@@ -10,16 +10,17 @@ class KuberKit::Tools::LoggerFactory
10
10
  Logger::FATAL => String::Colors::PURPLE,
11
11
  }
12
12
 
13
+ MAX_LOGS_TO_KEEP = 3
14
+ MAX_LOG_FILE_SIZE = 512000
15
+
13
16
  include KuberKit::Import[
14
17
  "configs",
15
18
  ]
16
19
 
17
- def create(stdout = nil, level = nil)
18
- if !stdout
19
- prepare_log_file(configs.log_file_path)
20
- end
20
+ def create(level: nil)
21
+ prepare_log_file(configs.log_file_path)
21
22
 
22
- logger = Logger.new(stdout || configs.log_file_path)
23
+ logger = Logger.new(configs.log_file_path, MAX_LOGS_TO_KEEP, MAX_LOG_FILE_SIZE)
23
24
 
24
25
  logger.level = level || Logger::DEBUG
25
26
 
@@ -1,3 +1,3 @@
1
1
  module KuberKit
2
- VERSION = "0.5.10"
2
+ VERSION = "0.6.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kuber_kit
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.10
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Iskander Khaziev
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-06-21 00:00:00.000000000 Z
11
+ date: 2021-07-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: contracts-lite
@@ -306,6 +306,7 @@ files:
306
306
  - lib/kuber_kit/preprocessing/text_preprocessor.rb
307
307
  - lib/kuber_kit/service_deployer/action_handler.rb
308
308
  - lib/kuber_kit/service_deployer/deployer.rb
309
+ - lib/kuber_kit/service_deployer/deployment_options_selector.rb
309
310
  - lib/kuber_kit/service_deployer/service_dependency_resolver.rb
310
311
  - lib/kuber_kit/service_deployer/service_list_resolver.rb
311
312
  - lib/kuber_kit/service_deployer/strategies/abstract.rb
@@ -331,6 +332,7 @@ files:
331
332
  - lib/kuber_kit/template_reader/reader.rb
332
333
  - lib/kuber_kit/template_reader/strategies/abstract.rb
333
334
  - lib/kuber_kit/template_reader/strategies/artifact_file.rb
335
+ - lib/kuber_kit/tools/build_dir_cleaner.rb
334
336
  - lib/kuber_kit/tools/file_presence_checker.rb
335
337
  - lib/kuber_kit/tools/logger_factory.rb
336
338
  - lib/kuber_kit/tools/process_cleaner.rb