kuber_kit 0.5.10 → 0.6.3

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: b49fec2466dab5c48794df5e7005bc7084fe0e3056cdaaaee5ed8a41141f421f
4
+ data.tar.gz: a6c5d9f5a88e472050bc0077ed33a8116ab3d046a9772a76f581cf1edfdccbac
5
5
  SHA512:
6
- metadata.gz: c61ead9e24a6f88c1ae0e8a517eb030b035d8ce68c1babefcb0de9b4a36a8638f41f57a47000f75cd2f681c4e3086477a2afd9113d5e9850bce7ad3242c2c0aa
7
- data.tar.gz: 96436dd5394baff8c2a8a2fe285909b4474df72f8548bfbecd0a2a9c28f2e6e763b0beec8b9d0ecaa6f12e69ca5c8c40974e16d1bf060911f6cf400f36a6eabc
6
+ metadata.gz: f5554eda2be4b918168ff3a353486f7e5aceab2d9d1e006f2601d8af1849b26369d3fd861a30157e549eb4409fc24358f13ad25267e8c72b7df9e03bf1391166
7
+ data.tar.gz: f1fd125a176cf1debd8156db61c5d2a83b24671d6113bb12797a8ede8367c94698ad542139b3294739c5d1ab1bd99e654be49e87512ae5ff8a0930d893666602
data/CHANGELOG.md CHANGED
@@ -1,3 +1,18 @@
1
+ **0.6.3**
2
+ - Fix updating artifacts when there is only local artifacts
3
+
4
+ **0.6.2**
5
+ - Added an ability to return build vars as a hash value.
6
+ - Skip local artifacts while updating configuration, it sometimes produce an error
7
+
8
+ **0.6.1**
9
+ - Improve performance of artifacts update by updating in threads.
10
+ - Added an ability to define default services
11
+
12
+ **0.6.0**
13
+ - Cleanup old image build dirs
14
+ - Add rotation to deployment log file
15
+
1
16
  **0.5.10**
2
17
  - Fix a regression when deployment result would not be properly returned as json.
3
18
 
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.3)
5
5
  cli-ui
6
6
  contracts-lite
7
7
  dry-auto_inject (~> 0.7.0)
@@ -18,7 +18,7 @@ GEM
18
18
  concurrent-ruby (1.1.9)
19
19
  contracts-lite (0.15.0)
20
20
  diff-lcs (1.4.4)
21
- docile (1.3.2)
21
+ docile (1.4.0)
22
22
  dry-auto_inject (0.7.0)
23
23
  dry-container (>= 0.3.4)
24
24
  dry-configurable (0.12.1)
@@ -33,7 +33,7 @@ GEM
33
33
  net-ssh (6.1.0)
34
34
  pastel (0.8.0)
35
35
  tty-color (~> 0.5)
36
- pry (0.13.1)
36
+ pry (0.14.1)
37
37
  coderay (~> 1.1)
38
38
  method_source (~> 1.0)
39
39
  rake (10.5.0)
@@ -41,21 +41,21 @@ GEM
41
41
  rspec-core (~> 3.10.0)
42
42
  rspec-expectations (~> 3.10.0)
43
43
  rspec-mocks (~> 3.10.0)
44
- rspec-core (3.10.0)
44
+ rspec-core (3.10.1)
45
45
  rspec-support (~> 3.10.0)
46
- rspec-expectations (3.10.0)
46
+ rspec-expectations (3.10.1)
47
47
  diff-lcs (>= 1.2.0, < 2.0)
48
48
  rspec-support (~> 3.10.0)
49
- rspec-mocks (3.10.0)
49
+ rspec-mocks (3.10.2)
50
50
  diff-lcs (>= 1.2.0, < 2.0)
51
51
  rspec-support (~> 3.10.0)
52
- rspec-support (3.10.0)
53
- simplecov (0.20.0)
52
+ rspec-support (3.10.2)
53
+ simplecov (0.21.2)
54
54
  docile (~> 1.1)
55
55
  simplecov-html (~> 0.11)
56
56
  simplecov_json_formatter (~> 0.1)
57
57
  simplecov-html (0.12.3)
58
- simplecov_json_formatter (0.1.2)
58
+ simplecov_json_formatter (0.1.3)
59
59
  thor (1.1.0)
60
60
  tty-color (0.6.0)
61
61
  tty-cursor (0.7.1)
data/TODO.md CHANGED
@@ -1,7 +1,3 @@
1
- - cleanup image builds older than some date
2
- - add some rotation for deploy log
3
- - env files should use a separate deployment method (with change detection)
4
1
  - add automatical confirmation support for service deployer
5
2
  - template should be able to set default attributes
6
- - template should be able to depend on image?
7
- - kit status should show the list of services and their status, with ability to select & view logs
3
+ - template should be able to depend on image?
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'
@@ -121,7 +122,7 @@ module KuberKit
121
122
 
122
123
  module ArtifactsSync
123
124
  autoload :AbstractArtifactResolver, 'artifacts_sync/abstract_artifact_resolver'
124
- autoload :ArtifactsUpdater, 'artifacts_sync/artifacts_updater'
125
+ autoload :ArtifactUpdater, 'artifacts_sync/artifact_updater'
125
126
  autoload :GitArtifactResolver, 'artifacts_sync/git_artifact_resolver'
126
127
  autoload :NullArtifactResolver, 'artifacts_sync/null_artifact_resolver'
127
128
  end
@@ -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
 
@@ -5,7 +5,7 @@ class KuberKit::Actions::ConfigurationLoader
5
5
  "core.service_store",
6
6
  "core.configuration_store",
7
7
  "tools.workdir_detector",
8
- "artifacts_sync.artifacts_updater",
8
+ "artifacts_sync.artifact_updater",
9
9
  "shell.local_shell",
10
10
  "ui",
11
11
  "configs"
@@ -43,11 +43,7 @@ class KuberKit::Actions::ConfigurationLoader
43
43
  load_infrastructure(infra_path)
44
44
 
45
45
  if load_inventory
46
- ui.create_task("Updating artifacts") do |task|
47
- artifacts = KuberKit.current_configuration.artifacts.values
48
- artifacts_updater.update(local_shell, artifacts)
49
- task.update_title("Updated #{artifacts.count} artifacts")
50
- end
46
+ update_artifacts(KuberKit.current_configuration.artifacts.values)
51
47
 
52
48
  ui.create_task("Loading image definitions") do |task|
53
49
  files = image_store.load_definitions(images_path)
@@ -101,4 +97,21 @@ class KuberKit::Actions::ConfigurationLoader
101
97
  rescue KuberKit::Shell::AbstractShell::DirNotFoundError
102
98
  ui.print_warning("ConfigurationLoader", "Directory with infrastructure not found: #{infra_path}")
103
99
  end
100
+
101
+ def update_artifacts(artifacts)
102
+ # Skip local artifacts, they sometimes produce error in CLI::UI::SpinGroup task,
103
+ # because the task is executed too quickly
104
+ not_local_artifacts = artifacts.reject{ |a| a.is_a?(KuberKit::Core::Artifacts::Local) }
105
+
106
+ return unless not_local_artifacts.any?
107
+
108
+ artifact_task_group = ui.create_task_group
109
+ not_local_artifacts.each do |artifact|
110
+ artifact_task_group.add("Updating #{artifact.name.to_s.yellow}") do |task|
111
+ artifact_updater.update(local_shell, artifact)
112
+ task.update_title("Updated #{artifact.name.to_s.green}")
113
+ end
114
+ end
115
+ artifact_task_group.wait
116
+ end
104
117
  end
@@ -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,18 +24,20 @@ 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
+ default_services = current_configuration.default_services.map(&:to_s)
30
31
  disabled_services = current_configuration.disabled_services.map(&:to_s)
31
32
  disabled_services += skip_services if skip_services
33
+
32
34
 
33
35
  service_names = service_list_resolver.resolve(
34
36
  services: services || [],
35
37
  tags: tags || [],
36
38
  enabled_services: current_configuration.enabled_services.map(&:to_s),
37
- disabled_services: disabled_services
39
+ disabled_services: disabled_services,
40
+ default_services: default_services
38
41
  ).map(&:to_sym)
39
42
 
40
43
  # Return the list of services with all dependencies.
@@ -45,20 +48,12 @@ class KuberKit::Actions::ServiceDeployer
45
48
  return false
46
49
  end
47
50
 
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)
51
+ unless allow_deployment?(require_confirmation: require_confirmation, service_names: all_service_names)
52
+ return false
58
53
  end
59
54
 
60
- images_names = services.map(&:images).flatten.uniq
61
-
55
+ # Compile images for all services and dependencies
56
+ images_names = get_image_names(service_names: all_service_names)
62
57
  unless skip_compile
63
58
  compilation_result = compile_images(images_names)
64
59
 
@@ -77,11 +72,13 @@ class KuberKit::Actions::ServiceDeployer
77
72
  rescue KuberKit::Error => e
78
73
  ui.print_error("Error", e.message)
79
74
 
80
- compilation_result.failed!(e.message)
81
-
75
+ deployment_result.failed!(e.message)
76
+
82
77
  false
83
78
  rescue Interrupt => e
84
79
  process_cleaner.clean
80
+
81
+ false
85
82
  end
86
83
 
87
84
  private
@@ -109,46 +106,23 @@ class KuberKit::Actions::ServiceDeployer
109
106
  image_compiler.call(images_names, {})
110
107
  end
111
108
 
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]]
109
+ def get_image_names(service_names:)
110
+ services = service_names.map do |service_name|
111
+ service_store.get_service(service_name.to_sym)
135
112
  end
113
+
114
+ services.map(&:images).flatten.uniq
136
115
  end
137
116
 
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 [[], []]
117
+ def allow_deployment?(require_confirmation:, service_names:)
118
+ services_list = service_names.map(&:to_s).map(&:yellow).join(", ")
119
+ ui.print_info "ServiceDeployer", "The following services will be deployed: #{services_list}"
120
+
121
+ unless require_confirmation
122
+ return true
149
123
  end
150
124
 
151
- selected_service = ui.prompt("Please select which service to deploy", services)
152
- [[selected_service], []]
125
+ result = ui.prompt("Please confirm to continue deployment", ["confirm".green, "cancel".red])
126
+ return ["confirm".green, "confirm", "yes"].include?(result)
153
127
  end
154
128
  end
@@ -1,4 +1,4 @@
1
- class KuberKit::ArtifactsSync::ArtifactsUpdater
1
+ class KuberKit::ArtifactsSync::ArtifactUpdater
2
2
  ResolverNotFoundError = Class.new(KuberKit::NotFoundError)
3
3
 
4
4
  include KuberKit::Import[
@@ -18,18 +18,16 @@ class KuberKit::ArtifactsSync::ArtifactsUpdater
18
18
  @@resolvers[artifact_class] = artifact_resolver
19
19
  end
20
20
 
21
- def update(shell, artifacts)
21
+ def update(shell, artifact)
22
22
  add_default_resolvers
23
23
 
24
- artifacts.each do |artifact|
25
- resolver = @@resolvers[artifact.class]
24
+ resolver = @@resolvers[artifact.class]
26
25
 
27
- ui.print_debug "ArtifactUpdater", "Updating artifact #{artifact.name.to_s.green}"
28
-
29
- raise ResolverNotFoundError, "Can't find resolver for artifact #{artifact}" if resolver.nil?
26
+ ui.print_debug "ArtifactUpdater", "Updating artifact #{artifact.name.to_s.green}"
27
+
28
+ raise ResolverNotFoundError, "Can't find resolver for artifact #{artifact}" if resolver.nil?
30
29
 
31
- resolver.resolve(shell, artifact)
32
- end
30
+ resolver.resolve(shell, artifact)
33
31
  end
34
32
 
35
33
  def add_default_resolvers
data/lib/kuber_kit/cli.rb CHANGED
@@ -45,7 +45,7 @@ class KuberKit::CLI < Thor
45
45
 
46
46
  if KuberKit::Container['actions.configuration_loader'].call(options)
47
47
  require_confirmation = options[:require_confirmation] ||
48
- KuberKit.current_configuration.deployer_require_confirimation ||
48
+ KuberKit.current_configuration.deployer_require_confirmation ||
49
49
  false
50
50
  started_at = Time.now.to_i
51
51
  action_result = KuberKit::Container['actions.service_deployer'].call(
@@ -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
@@ -213,8 +217,8 @@ class KuberKit::Container
213
217
  KuberKit::ImageCompiler::VersionTagBuilder.new
214
218
  end
215
219
 
216
- register "artifacts_sync.artifacts_updater" do
217
- KuberKit::ArtifactsSync::ArtifactsUpdater.new
220
+ register "artifacts_sync.artifact_updater" do
221
+ KuberKit::ArtifactsSync::ArtifactUpdater.new
218
222
  end
219
223
 
220
224
  register "artifacts_sync.git_artifact_resolver" do
@@ -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
@@ -1,7 +1,8 @@
1
1
  class KuberKit::Core::Configuration
2
2
  attr_reader :name, :artifacts, :registries, :env_files, :templates, :kubeconfig_path,
3
- :services_attributes, :enabled_services, :disabled_services, :build_servers, :global_build_vars,
4
- :deployer_strategy, :deployer_namespace, :deployer_require_confirimation
3
+ :services_attributes, :enabled_services, :disabled_services, :default_services,
4
+ :build_servers, :global_build_vars,
5
+ :deployer_strategy, :deployer_namespace, :deployer_require_confirmation
5
6
 
6
7
  Contract KeywordArgs[
7
8
  name: Symbol,
@@ -13,15 +14,17 @@ class KuberKit::Core::Configuration
13
14
  services_attributes: HashOf[Symbol => Hash],
14
15
  enabled_services: ArrayOf[Symbol],
15
16
  disabled_services: ArrayOf[Symbol],
17
+ default_services: ArrayOf[Symbol],
16
18
  build_servers: ArrayOf[KuberKit::Core::BuildServers::AbstractBuildServer],
17
19
  global_build_vars: HashOf[Symbol => Any],
18
20
  deployer_strategy: Symbol,
19
21
  deployer_namespace: Maybe[Symbol],
20
- deployer_require_confirimation: Bool,
22
+ deployer_require_confirmation: Bool,
21
23
  ] => Any
22
24
  def initialize(name:, artifacts:, registries:, env_files:, templates:, kubeconfig_path:,
23
- services_attributes:, enabled_services:, disabled_services:, build_servers:, global_build_vars:,
24
- deployer_strategy:, deployer_namespace:, deployer_require_confirimation:)
25
+ services_attributes:, enabled_services:, disabled_services:, default_services:,
26
+ build_servers:, global_build_vars:,
27
+ deployer_strategy:, deployer_namespace:, deployer_require_confirmation:)
25
28
  @name = name
26
29
  @artifacts = artifacts
27
30
  @registries = registries
@@ -32,10 +35,11 @@ class KuberKit::Core::Configuration
32
35
  @services_attributes = services_attributes
33
36
  @enabled_services = enabled_services
34
37
  @disabled_services = disabled_services
38
+ @default_services = default_services
35
39
  @global_build_vars = global_build_vars
36
40
  @deployer_strategy = deployer_strategy
37
41
  @deployer_namespace = deployer_namespace
38
- @deployer_require_confirimation = deployer_require_confirimation
42
+ @deployer_require_confirmation = deployer_require_confirmation
39
43
  end
40
44
 
41
45
  def service_attributes(service_name)
@@ -13,6 +13,7 @@ class KuberKit::Core::ConfigurationDefinition
13
13
  @build_servers = []
14
14
  @enabled_services = []
15
15
  @disabled_services = []
16
+ @default_services = []
16
17
  @services_attributes = {}
17
18
  end
18
19
 
@@ -26,12 +27,13 @@ class KuberKit::Core::ConfigurationDefinition
26
27
  kubeconfig_path: @kubeconfig_path,
27
28
  enabled_services: @enabled_services,
28
29
  disabled_services: @disabled_services,
30
+ default_services: @default_services,
29
31
  build_servers: @build_servers,
30
32
  services_attributes: @services_attributes,
31
33
  global_build_vars: @global_build_vars,
32
34
  deployer_strategy: @deployer_strategy,
33
35
  deployer_namespace: @deployer_namespace,
34
- deployer_require_confirimation: @deployer_require_confirimation || false,
36
+ deployer_require_confirmation: @deployer_require_confirmation || false,
35
37
  )
36
38
  end
37
39
 
@@ -97,11 +99,12 @@ class KuberKit::Core::ConfigurationDefinition
97
99
  self
98
100
  end
99
101
 
100
- def deployer_require_confirimation
101
- @deployer_require_confirimation = true
102
+ def deployer_require_confirmation
103
+ @deployer_require_confirmation = true
102
104
 
103
105
  self
104
106
  end
107
+ alias_method :deployer_require_confirimation, :deployer_require_confirmation
105
108
 
106
109
  def enabled_services(services)
107
110
  if services.is_a?(Hash)
@@ -118,6 +121,11 @@ class KuberKit::Core::ConfigurationDefinition
118
121
  raise KuberKit::Error, "#enabled_services method accepts only Array or Hash"
119
122
  end
120
123
 
124
+ def default_services(services)
125
+ @default_services += services.map(&:to_sym)
126
+ return self
127
+ end
128
+
121
129
  def disabled_services(services)
122
130
  @disabled_services += services.map(&:to_sym)
123
131
  return self
@@ -30,10 +30,11 @@ class KuberKit::Core::ConfigurationFactory
30
30
  services_attributes: configuration_attrs.services_attributes,
31
31
  enabled_services: configuration_attrs.enabled_services,
32
32
  disabled_services: configuration_attrs.disabled_services,
33
+ default_services: configuration_attrs.default_services,
33
34
  global_build_vars: configuration_attrs.global_build_vars || {},
34
35
  deployer_strategy: configuration_attrs.deployer_strategy || configs.deployer_strategy,
35
36
  deployer_namespace: configuration_attrs.deployer_namespace,
36
- deployer_require_confirimation: configuration_attrs.deployer_require_confirimation,
37
+ deployer_require_confirmation: configuration_attrs.deployer_require_confirmation,
37
38
  )
38
39
  end
39
40
 
@@ -23,6 +23,14 @@ class KuberKit::Core::ContextHelper::ContextVars
23
23
  value
24
24
  end
25
25
 
26
+ def to_h
27
+ if @context_vars.is_a?(Hash)
28
+ return @context_vars
29
+ else
30
+ return {value: @context_vars}
31
+ end
32
+ end
33
+
26
34
  private
27
35
 
28
36
  def format_arg(name)
@@ -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
@@ -7,9 +7,10 @@ class KuberKit::ServiceDeployer::ServiceListResolver
7
7
  services: Optional[ArrayOf[String]],
8
8
  tags: Optional[ArrayOf[String]],
9
9
  enabled_services: Optional[ArrayOf[String]],
10
- disabled_services: Optional[ArrayOf[String]]
10
+ disabled_services: Optional[ArrayOf[String]],
11
+ default_services: Optional[ArrayOf[String]]
11
12
  ] => ArrayOf[String]
12
- def resolve(services: [], tags: [], enabled_services: [], disabled_services: [])
13
+ def resolve(services: [], tags: [], enabled_services: [], disabled_services: [], default_services: [])
13
14
  all_definitions = service_store.all_definitions.values
14
15
 
15
16
  included_services, excluded_services = split_by_inclusion(services)
@@ -41,6 +42,10 @@ class KuberKit::ServiceDeployer::ServiceListResolver
41
42
  included_services = included_services.select{ |s| !disabled_services.include?(s) }
42
43
  end
43
44
 
45
+ if included_services.any?
46
+ included_services += default_services
47
+ end
48
+
44
49
  included_services
45
50
  end
46
51
 
@@ -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
 
@@ -46,6 +46,7 @@ class KuberKit::UI::Simple
46
46
  class TaskGroup
47
47
  def initialize(task_class)
48
48
  @task_class = task_class
49
+ @tasks
49
50
  end
50
51
 
51
52
  def add(task_title, &task_block)
@@ -1,3 +1,3 @@
1
1
  module KuberKit
2
- VERSION = "0.5.10"
2
+ VERSION = "0.6.3"
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.3
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-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: contracts-lite
@@ -236,7 +236,7 @@ files:
236
236
  - lib/kuber_kit/actions/service_reader.rb
237
237
  - lib/kuber_kit/actions/template_reader.rb
238
238
  - lib/kuber_kit/artifacts_sync/abstract_artifact_resolver.rb
239
- - lib/kuber_kit/artifacts_sync/artifacts_updater.rb
239
+ - lib/kuber_kit/artifacts_sync/artifact_updater.rb
240
240
  - lib/kuber_kit/artifacts_sync/git_artifact_resolver.rb
241
241
  - lib/kuber_kit/artifacts_sync/null_artifact_resolver.rb
242
242
  - lib/kuber_kit/cli.rb
@@ -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