kuber_kit 0.5.10 → 0.6.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.
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