kuber_kit 0.1.2 → 0.1.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/TODO.md +2 -1
- data/example/app_data/service.yml +22 -4
- data/example/services/ruby_app.rb +3 -0
- data/lib/kuber_kit.rb +6 -0
- data/lib/kuber_kit/actions/service_deployer.rb +14 -1
- data/lib/kuber_kit/configs.rb +3 -1
- data/lib/kuber_kit/container.rb +8 -0
- data/lib/kuber_kit/core/configuration.rb +11 -9
- data/lib/kuber_kit/core/configuration_definition.rb +13 -6
- data/lib/kuber_kit/core/configuration_factory.rb +9 -7
- data/lib/kuber_kit/core/context_helper/base_helper.rb +2 -0
- data/lib/kuber_kit/core/context_helper/service_helper.rb +1 -2
- data/lib/kuber_kit/core/service.rb +4 -0
- data/lib/kuber_kit/image_compiler/compiler.rb +1 -1
- data/lib/kuber_kit/image_compiler/image_builder.rb +2 -3
- data/lib/kuber_kit/service_deployer/deployer.rb +4 -8
- data/lib/kuber_kit/service_deployer/service_reader.rb +1 -0
- data/lib/kuber_kit/service_deployer/service_restarter.rb +37 -0
- data/lib/kuber_kit/service_deployer/strategies/abstract.rb +5 -0
- data/lib/kuber_kit/service_deployer/strategies/kubernetes.rb +18 -0
- data/lib/kuber_kit/shell/kubectl_commands.rb +30 -0
- data/lib/kuber_kit/version.rb +1 -1
- metadata +5 -2
- data/example/services/auth_app.rb +0 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2c4c480432ebb2d98461e9549271f26e607e3790464fde89b30631a675e9bc85
|
4
|
+
data.tar.gz: 04b4f46724bd31dd72467ffa0f073dd495dcaafecc7213ca57a6c70bbce1e4f7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ef5601a6e9bd63a49154f6ae14ce77eebcbc0702bd89578fd413ec23226f7db0c37b60cffcd20d314bf1cfbd6fb98a8e050f9912be668aa3dce31dd6a5056cae
|
7
|
+
data.tar.gz: 7b17416b8b1d98b706409b1b88c44679b61f1689bf6c38d449320789d843f8f9b74dd519e61af364639e9cf78e95e28fd6499817980e2d211a85f0bd98d0b210
|
data/Gemfile.lock
CHANGED
data/TODO.md
CHANGED
@@ -1,7 +1,25 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
|
2
|
+
apiVersion: apps/v1
|
3
|
+
kind: Deployment
|
3
4
|
metadata:
|
4
|
-
|
5
|
+
labels:
|
6
|
+
app: <%= service_uri %>
|
7
|
+
name: <%= service_uri %>
|
5
8
|
spec:
|
9
|
+
replicas: 1
|
6
10
|
selector:
|
7
|
-
|
11
|
+
matchLabels:
|
12
|
+
app: <%= service_uri %>
|
13
|
+
strategy: {}
|
14
|
+
template:
|
15
|
+
metadata:
|
16
|
+
labels:
|
17
|
+
app: <%= service_uri %>
|
18
|
+
spec:
|
19
|
+
containers:
|
20
|
+
- name: <%= service_uri %>
|
21
|
+
image: <%= service_name %>:latest
|
22
|
+
imagePullPolicy: Always
|
23
|
+
restartPolicy: Always
|
24
|
+
imagePullSecrets:
|
25
|
+
- name: regcred
|
data/lib/kuber_kit.rb
CHANGED
@@ -116,8 +116,14 @@ module KuberKit
|
|
116
116
|
|
117
117
|
module ServiceDeployer
|
118
118
|
autoload :Deployer, 'service_deployer/deployer'
|
119
|
+
autoload :ServiceRestarter, 'service_deployer/service_restarter'
|
119
120
|
autoload :ServiceReader, 'service_deployer/service_reader'
|
120
121
|
autoload :ServiceListResolver, 'service_deployer/service_list_resolver'
|
122
|
+
|
123
|
+
module Strategies
|
124
|
+
autoload :Abstract, 'service_deployer/strategies/abstract'
|
125
|
+
autoload :Kubernetes, 'service_deployer/strategies/kubernetes'
|
126
|
+
end
|
121
127
|
end
|
122
128
|
|
123
129
|
module Actions
|
@@ -3,6 +3,7 @@ class KuberKit::Actions::ServiceDeployer
|
|
3
3
|
"service_deployer.service_list_resolver",
|
4
4
|
"service_deployer.deployer",
|
5
5
|
"shell.local_shell",
|
6
|
+
"tools.logger",
|
6
7
|
"ui"
|
7
8
|
]
|
8
9
|
|
@@ -15,8 +16,20 @@ class KuberKit::Actions::ServiceDeployer
|
|
15
16
|
services: services || [],
|
16
17
|
tags: tags || []
|
17
18
|
)
|
19
|
+
|
20
|
+
task_group = ui.create_task_group
|
21
|
+
|
18
22
|
service_names.each do |service_name|
|
19
|
-
|
23
|
+
|
24
|
+
logger.info("Started deploying: #{service_name.to_s.green}")
|
25
|
+
task_group.add("Deploying #{service_name.to_s.yellow}") do |task|
|
26
|
+
deployer.deploy(local_shell, service_name.to_sym)
|
27
|
+
|
28
|
+
task.update_title("Deployed #{service_name.to_s.green}")
|
29
|
+
logger.info("Finished deploying: #{service_name.to_s.green}")
|
30
|
+
end
|
20
31
|
end
|
32
|
+
|
33
|
+
task_group.wait
|
21
34
|
end
|
22
35
|
end
|
data/lib/kuber_kit/configs.rb
CHANGED
@@ -21,11 +21,12 @@ class KuberKit::Configs
|
|
21
21
|
CONFIGURATIONS_DIRNAME = "configurations".freeze
|
22
22
|
ARTIFACT_CLONE_DIR = "/tmp/kuber_kit/artifacts"
|
23
23
|
SERVICE_CONFIG_DIR = "/tmp/kuber_kit/services"
|
24
|
+
DEPLOY_STRATEGY = :kubernetes
|
24
25
|
|
25
26
|
attr_accessor :image_dockerfile_name, :image_build_context_dir, :image_tag,
|
26
27
|
:docker_ignore_list, :image_compile_dir,
|
27
28
|
:kuber_kit_dirname, :images_dirname, :services_dirname, :infra_dirname, :configurations_dirname,
|
28
|
-
:artifact_clone_dir, :service_config_dir
|
29
|
+
:artifact_clone_dir, :service_config_dir, :deploy_strategy
|
29
30
|
|
30
31
|
def initialize
|
31
32
|
@image_dockerfile_name = IMAGE_DOCKERFILE_NAME
|
@@ -40,5 +41,6 @@ class KuberKit::Configs
|
|
40
41
|
@configurations_dirname = CONFIGURATIONS_DIRNAME
|
41
42
|
@artifact_clone_dir = ARTIFACT_CLONE_DIR
|
42
43
|
@service_config_dir = SERVICE_CONFIG_DIR
|
44
|
+
@deploy_strategy = DEPLOY_STRATEGY
|
43
45
|
end
|
44
46
|
end
|
data/lib/kuber_kit/container.rb
CHANGED
@@ -193,6 +193,10 @@ class KuberKit::Container
|
|
193
193
|
KuberKit::ServiceDeployer::Deployer.new
|
194
194
|
end
|
195
195
|
|
196
|
+
register "service_deployer.service_restarter" do
|
197
|
+
KuberKit::ServiceDeployer::ServiceRestarter.new
|
198
|
+
end
|
199
|
+
|
196
200
|
register "service_deployer.service_reader" do
|
197
201
|
KuberKit::ServiceDeployer::ServiceReader.new
|
198
202
|
end
|
@@ -201,6 +205,10 @@ class KuberKit::Container
|
|
201
205
|
KuberKit::ServiceDeployer::ServiceListResolver.new
|
202
206
|
end
|
203
207
|
|
208
|
+
register "service_deployer.strategies.kubernetes" do
|
209
|
+
KuberKit::ServiceDeployer::Strategies::Kubernetes.new
|
210
|
+
end
|
211
|
+
|
204
212
|
register "ui" do
|
205
213
|
if KuberKit.debug_mode?
|
206
214
|
KuberKit::UI::Simple.new
|
@@ -1,5 +1,5 @@
|
|
1
1
|
class KuberKit::Core::Configuration
|
2
|
-
attr_reader :name, :artifacts, :registries, :env_files, :templates, :kubecfg_path
|
2
|
+
attr_reader :name, :artifacts, :registries, :env_files, :templates, :kubecfg_path, :deploy_strategy
|
3
3
|
|
4
4
|
Contract KeywordArgs[
|
5
5
|
name: Symbol,
|
@@ -7,14 +7,16 @@ class KuberKit::Core::Configuration
|
|
7
7
|
registries: Hash,
|
8
8
|
env_files: Hash,
|
9
9
|
templates: Hash,
|
10
|
-
kubecfg_path: Maybe[String]
|
10
|
+
kubecfg_path: Maybe[String],
|
11
|
+
deploy_strategy: Symbol
|
11
12
|
] => Any
|
12
|
-
def initialize(name:, artifacts:, registries:, env_files:, templates:, kubecfg_path:)
|
13
|
-
@name
|
14
|
-
@artifacts
|
15
|
-
@registries
|
16
|
-
@env_files
|
17
|
-
@templates
|
18
|
-
@kubecfg_path
|
13
|
+
def initialize(name:, artifacts:, registries:, env_files:, templates:, kubecfg_path:, deploy_strategy:)
|
14
|
+
@name = name
|
15
|
+
@artifacts = artifacts
|
16
|
+
@registries = registries
|
17
|
+
@env_files = env_files
|
18
|
+
@templates = templates
|
19
|
+
@kubecfg_path = kubecfg_path
|
20
|
+
@deploy_strategy = deploy_strategy
|
19
21
|
end
|
20
22
|
end
|
@@ -14,12 +14,13 @@ class KuberKit::Core::ConfigurationDefinition
|
|
14
14
|
|
15
15
|
def to_attrs
|
16
16
|
OpenStruct.new(
|
17
|
-
name:
|
18
|
-
artifacts:
|
19
|
-
registries:
|
20
|
-
env_files:
|
21
|
-
templates:
|
22
|
-
kubecfg_path:
|
17
|
+
name: @configuration_name,
|
18
|
+
artifacts: @artifacts,
|
19
|
+
registries: @registries,
|
20
|
+
env_files: @env_files,
|
21
|
+
templates: @templates,
|
22
|
+
kubecfg_path: @kubecfg_path,
|
23
|
+
deploy_strategy: @deploy_strategy
|
23
24
|
)
|
24
25
|
end
|
25
26
|
|
@@ -64,4 +65,10 @@ class KuberKit::Core::ConfigurationDefinition
|
|
64
65
|
|
65
66
|
self
|
66
67
|
end
|
68
|
+
|
69
|
+
def deploy_strategy(path)
|
70
|
+
@deploy_strategy = path
|
71
|
+
|
72
|
+
self
|
73
|
+
end
|
67
74
|
end
|
@@ -5,7 +5,8 @@ class KuberKit::Core::ConfigurationFactory
|
|
5
5
|
"core.registry_store",
|
6
6
|
"core.artifact_store",
|
7
7
|
"core.env_file_store",
|
8
|
-
"core.template_store"
|
8
|
+
"core.template_store",
|
9
|
+
"configs"
|
9
10
|
]
|
10
11
|
|
11
12
|
def create(definition)
|
@@ -17,12 +18,13 @@ class KuberKit::Core::ConfigurationFactory
|
|
17
18
|
templates = fetch_templates(configuration_attrs.templates)
|
18
19
|
|
19
20
|
KuberKit::Core::Configuration.new(
|
20
|
-
name:
|
21
|
-
artifacts:
|
22
|
-
registries:
|
23
|
-
env_files:
|
24
|
-
templates:
|
25
|
-
kubecfg_path:
|
21
|
+
name: configuration_attrs.name,
|
22
|
+
artifacts: artifacts,
|
23
|
+
registries: registries,
|
24
|
+
env_files: env_files,
|
25
|
+
templates: templates,
|
26
|
+
kubecfg_path: configuration_attrs.kubecfg_path,
|
27
|
+
deploy_strategy: configuration_attrs.deploy_strategy || configs.deploy_strategy
|
26
28
|
)
|
27
29
|
end
|
28
30
|
|
@@ -15,7 +15,7 @@ class KuberKit::ImageCompiler::Compiler
|
|
15
15
|
context_helper = context_helper_factory.build_image_context(shell)
|
16
16
|
image_build_dir_creator.create(shell, image, image_build_dir, context_helper: context_helper)
|
17
17
|
|
18
|
-
image_builder.build(shell, image, image_build_dir, context_helper: context_helper
|
18
|
+
image_builder.build(shell, image, image_build_dir, context_helper: context_helper)
|
19
19
|
image_build_dir_creator.cleanup(shell, image_build_dir)
|
20
20
|
end
|
21
21
|
end
|
@@ -5,10 +5,9 @@ class KuberKit::ImageCompiler::ImageBuilder
|
|
5
5
|
]
|
6
6
|
|
7
7
|
Contract KuberKit::Shell::AbstractShell, KuberKit::Core::Image, String, KeywordArgs[
|
8
|
-
|
9
|
-
context_helper: Maybe[KuberKit::Core::ContextHelper]
|
8
|
+
context_helper: Maybe[KuberKit::Core::ContextHelper::BaseHelper::CONTRACT]
|
10
9
|
] => Any
|
11
|
-
def build(shell, image, build_dir, context_helper: nil
|
10
|
+
def build(shell, image, build_dir, context_helper: nil)
|
12
11
|
image.before_build_callback.call(context_helper, build_dir) if image.before_build_callback
|
13
12
|
|
14
13
|
docker_commands.build(shell, build_dir, ["-t=#{image.registry_url}"])
|
@@ -1,19 +1,15 @@
|
|
1
1
|
class KuberKit::ServiceDeployer::Deployer
|
2
2
|
include KuberKit::Import[
|
3
|
+
"service_deployer.service_restarter",
|
3
4
|
"core.service_store",
|
4
|
-
"service_deployer.service_reader",
|
5
|
-
"shell.kubectl_commands",
|
6
|
-
"configs",
|
7
5
|
]
|
8
6
|
|
7
|
+
Contract KuberKit::Shell::AbstractShell, Symbol => Any
|
9
8
|
def deploy(shell, service_name)
|
10
9
|
service = service_store.get_service(service_name)
|
11
|
-
kubecfg_path = KuberKit.current_configuration.kubecfg_path
|
12
10
|
|
13
|
-
|
14
|
-
file_path = "#{configs.service_config_dir}/#{service.name}.yml"
|
15
|
-
shell.write(file_path, result)
|
11
|
+
strategy_name = KuberKit.current_configuration.deploy_strategy
|
16
12
|
|
17
|
-
|
13
|
+
service_restarter.restart(shell, service, strategy_name)
|
18
14
|
end
|
19
15
|
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
class KuberKit::ServiceDeployer::ServiceRestarter
|
2
|
+
StrategyNotFoundError = Class.new(KuberKit::NotFoundError)
|
3
|
+
|
4
|
+
include KuberKit::Import[
|
5
|
+
"core.service_store",
|
6
|
+
"service_deployer.strategies.kubernetes"
|
7
|
+
]
|
8
|
+
|
9
|
+
def register_strategy(strategy_name, strategy)
|
10
|
+
@@strategies ||= {}
|
11
|
+
|
12
|
+
if !strategy.is_a?(KuberKit::ServiceDeployer::Strategies::Abstract)
|
13
|
+
raise ArgumentError.new("should be an instance of KuberKit::ServiceDeployer::Strategies::Abstract, got: #{strategy.inspect}")
|
14
|
+
end
|
15
|
+
|
16
|
+
@@strategies[strategy_name] = strategy
|
17
|
+
end
|
18
|
+
|
19
|
+
Contract KuberKit::Shell::AbstractShell, KuberKit::Core::Service, Symbol => Any
|
20
|
+
def restart(shell, service, strategy_name)
|
21
|
+
add_default_strategies
|
22
|
+
|
23
|
+
restarter = @@strategies[strategy_name]
|
24
|
+
|
25
|
+
raise StrategyNotFoundError, "Can't find strategy with name #{strategy_name}" if restarter.nil?
|
26
|
+
|
27
|
+
restarter.restart(shell, service)
|
28
|
+
end
|
29
|
+
|
30
|
+
def add_default_strategies
|
31
|
+
register_strategy(:kubernetes, kubernetes)
|
32
|
+
end
|
33
|
+
|
34
|
+
def reset!
|
35
|
+
@@strategies = {}
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
class KuberKit::ServiceDeployer::Strategies::Kubernetes < KuberKit::ServiceDeployer::Strategies::Abstract
|
2
|
+
include KuberKit::Import[
|
3
|
+
"service_deployer.service_reader",
|
4
|
+
"shell.kubectl_commands",
|
5
|
+
"configs",
|
6
|
+
]
|
7
|
+
|
8
|
+
Contract KuberKit::Shell::AbstractShell, KuberKit::Core::Service => Any
|
9
|
+
def restart(shell, service)
|
10
|
+
service_config = service_reader.read(shell, service)
|
11
|
+
config_path = "#{configs.service_config_dir}/#{service.name}.yml"
|
12
|
+
shell.write(config_path, service_config)
|
13
|
+
|
14
|
+
kubecfg_path = KuberKit.current_configuration.kubecfg_path
|
15
|
+
kubectl_commands.apply_file(shell, config_path, kubecfg_path: kubecfg_path)
|
16
|
+
kubectl_commands.rolling_restart(shell, service.uri, kubecfg_path: kubecfg_path)
|
17
|
+
end
|
18
|
+
end
|
@@ -1,3 +1,6 @@
|
|
1
|
+
require 'json'
|
2
|
+
require 'shellwords'
|
3
|
+
|
1
4
|
class KuberKit::Shell::KubectlCommands
|
2
5
|
def apply_file(shell, file_path, kubecfg_path: nil)
|
3
6
|
command_parts = []
|
@@ -9,4 +12,31 @@ class KuberKit::Shell::KubectlCommands
|
|
9
12
|
|
10
13
|
shell.exec!(command_parts.join(" "))
|
11
14
|
end
|
15
|
+
|
16
|
+
def rolling_restart(shell, deployment_name, kubecfg_path: nil)
|
17
|
+
patch_deployment(shell, deployment_name, {
|
18
|
+
spec: {
|
19
|
+
template: {
|
20
|
+
metadata: {
|
21
|
+
labels: {
|
22
|
+
redeploy: "$(date +%s)"
|
23
|
+
}
|
24
|
+
}
|
25
|
+
}
|
26
|
+
}
|
27
|
+
}, kubecfg_path: kubecfg_path)
|
28
|
+
end
|
29
|
+
|
30
|
+
def patch_deployment(shell, deployment_name, specs, kubecfg_path: nil)
|
31
|
+
command_parts = []
|
32
|
+
if kubecfg_path
|
33
|
+
command_parts << "KUBECFG=#{kubecfg_path}"
|
34
|
+
end
|
35
|
+
|
36
|
+
specs_json = JSON.dump(specs).gsub('"', '\"')
|
37
|
+
|
38
|
+
command_parts << %Q{kubectl patch deployment #{deployment_name} -p "#{specs_json}"}
|
39
|
+
|
40
|
+
shell.exec!(command_parts.join(" "))
|
41
|
+
end
|
12
42
|
end
|
data/lib/kuber_kit/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kuber_kit
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Iskander Khaziev
|
@@ -163,7 +163,7 @@ files:
|
|
163
163
|
- example/infrastructure/env_files.rb
|
164
164
|
- example/infrastructure/registries.rb
|
165
165
|
- example/infrastructure/templates.rb
|
166
|
-
- example/services/
|
166
|
+
- example/services/ruby_app.rb
|
167
167
|
- kuber_kit.gemspec
|
168
168
|
- lib/kuber_kit.rb
|
169
169
|
- lib/kuber_kit/actions/configuration_loader.rb
|
@@ -230,6 +230,9 @@ files:
|
|
230
230
|
- lib/kuber_kit/service_deployer/deployer.rb
|
231
231
|
- lib/kuber_kit/service_deployer/service_list_resolver.rb
|
232
232
|
- lib/kuber_kit/service_deployer/service_reader.rb
|
233
|
+
- lib/kuber_kit/service_deployer/service_restarter.rb
|
234
|
+
- lib/kuber_kit/service_deployer/strategies/abstract.rb
|
235
|
+
- lib/kuber_kit/service_deployer/strategies/kubernetes.rb
|
233
236
|
- lib/kuber_kit/shell/abstract_shell.rb
|
234
237
|
- lib/kuber_kit/shell/bash_commands.rb
|
235
238
|
- lib/kuber_kit/shell/command_counter.rb
|