indocker 0.1.11 → 0.1.16

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.
Files changed (41) hide show
  1. checksums.yaml +4 -4
  2. data/.ruby-version +1 -0
  3. data/Gemfile +0 -1
  4. data/Gemfile.lock +8 -2
  5. data/example/indocker/bounded_contexts/shared/bad_container_build/container.rb +2 -1
  6. data/example/indocker/bounded_contexts/shared/bad_container_start/container.rb +2 -1
  7. data/example/indocker/bounded_contexts/shared/daemon_container/Dockerfile +4 -0
  8. data/example/indocker/bounded_contexts/shared/daemon_container/container.rb +6 -0
  9. data/example/indocker/bounded_contexts/shared/daemon_container/image.rb +3 -0
  10. data/example/indocker/bounded_contexts/shared/good_container/container.rb +2 -1
  11. data/example/indocker/bounded_contexts/shared/ruby/container.rb +2 -1
  12. data/example/indocker/configurations/external.rb +6 -1
  13. data/example/indocker/infrastructure/artifacts.rb +10 -0
  14. data/example/indocker/setup.rb +1 -0
  15. data/indocker.gemspec +1 -0
  16. data/lib/indocker.rb +26 -13
  17. data/lib/indocker/build_context.rb +9 -43
  18. data/lib/indocker/container_deployer.rb +10 -28
  19. data/lib/indocker/crontab_redeploy_rules_builder.rb +2 -1
  20. data/lib/indocker/deploy_context.rb +4 -32
  21. data/lib/indocker/deployment_checker.rb +4 -2
  22. data/lib/indocker/docker_run_args.rb +2 -2
  23. data/lib/indocker/images/image_compiler.rb +0 -1
  24. data/lib/indocker/{configuration_deployer.rb → launchers/configuration_deployer.rb} +36 -41
  25. data/lib/indocker/{container_runner.rb → launchers/container_runner.rb} +2 -3
  26. data/lib/indocker/{images_compiler.rb → launchers/images_compiler.rb} +3 -3
  27. data/lib/indocker/{network.rb → networks/network.rb} +1 -1
  28. data/lib/indocker/{network_helper.rb → networks/network_helper.rb} +1 -1
  29. data/lib/indocker/server_pools/build_server_connection.rb +15 -0
  30. data/lib/indocker/{build_context_pool.rb → server_pools/build_server_pool.rb} +8 -8
  31. data/lib/indocker/server_pools/deploy_server_connection.rb +17 -0
  32. data/lib/indocker/server_pools/deploy_server_pool.rb +41 -0
  33. data/lib/indocker/server_pools/server_connection.rb +37 -0
  34. data/lib/indocker/ssh_result_logger.rb +18 -0
  35. data/lib/indocker/ssh_session.rb +3 -5
  36. data/lib/indocker/version.rb +1 -1
  37. data/lib/indocker/{volume_helper.rb → volumes/volume_helper.rb} +1 -1
  38. metadata +33 -12
  39. data/example/spec/indocker_spec.rb +0 -39
  40. data/example/spec/spec_helper.rb +0 -39
  41. data/lib/indocker/server_pool.rb +0 -38
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8625d37ada817f2f83c30f154bd2ed9a104a023e5b554f4c91f3708ed4aa2770
4
- data.tar.gz: 24950eb94bd956f7f10ad81da4330bffa78495a4852733a1bec5d0713cce4896
3
+ metadata.gz: e93eba781605cba8bdb795ed40a03b16d3602508ca427639b42ead50c25b7ec6
4
+ data.tar.gz: 3e5dc1f5582c8ee45fa4e3583cfea13abf3121e52341eecdc98b8660db700d94
5
5
  SHA512:
6
- metadata.gz: e50ef7ed88a688bb1119e55b1d1662d6827e5667cc66c61dc85933687e9d4834c785c03c7fb917a2709adf04d909f7e611f8c844741b1532211dddad340dc149
7
- data.tar.gz: 1e52f25fff3bf09ddb7f1d097b46ad0e858555892d3b4721a628c8817a16e165694dbf3650e940eb83cb6ac05d8ded47c6359ada9d3cba39d3885ff95e9e88d0
6
+ metadata.gz: 4da7e1049911e4d0c12d89d977cfb568687f61568866ec82f737694c1023984ad97d205d25eaa35e19ebc46843d0743d1df07c833c48d293a5c10ca5de0fd792
7
+ data.tar.gz: 1a8205455ebf5da34c8039a87c45772807920e362e8814bee275ef578647a15edf9970a9c53196b5805aeba8d4b3b047e30e329b0637d393a390c9d32c68353f
@@ -0,0 +1 @@
1
+ 2.5.0
data/Gemfile CHANGED
@@ -6,6 +6,5 @@ git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
6
6
  gemspec
7
7
 
8
8
  group :test do
9
- gem 'rspec'
10
9
  gem 'pry'
11
10
  end
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- indocker (0.1.11)
4
+ indocker (0.1.16)
5
5
  net-ssh
6
6
 
7
7
  GEM
@@ -9,6 +9,7 @@ GEM
9
9
  specs:
10
10
  coderay (1.1.3)
11
11
  diff-lcs (1.3)
12
+ docile (1.3.2)
12
13
  method_source (1.0.0)
13
14
  net-ssh (6.1.0)
14
15
  pry (0.13.1)
@@ -28,6 +29,10 @@ GEM
28
29
  diff-lcs (>= 1.2.0, < 2.0)
29
30
  rspec-support (~> 3.9.0)
30
31
  rspec-support (3.9.2)
32
+ simplecov (0.18.5)
33
+ docile (~> 1.1)
34
+ simplecov-html (~> 0.11)
35
+ simplecov-html (0.12.2)
31
36
 
32
37
  PLATFORMS
33
38
  ruby
@@ -37,7 +42,8 @@ DEPENDENCIES
37
42
  indocker!
38
43
  pry
39
44
  rake (~> 12.3.3)
40
- rspec
45
+ rspec (~> 3.0)
46
+ simplecov (~> 0.18.5)
41
47
 
42
48
  BUNDLED WITH
43
49
  1.17.3
@@ -2,4 +2,5 @@ Indocker
2
2
  .define_container(:bad_container_build)
3
3
  .tags('bad_container_build', 'console=true')
4
4
  .image(:bad_container_build)
5
- .networks(:app_net)
5
+ .networks(:app_net)
6
+ .daemonize(false)
@@ -2,4 +2,5 @@ Indocker
2
2
  .define_container(:bad_container_start)
3
3
  .tags('bad_container_start', 'console=true')
4
4
  .image(:bad_container_start)
5
- .networks(:app_net)
5
+ .networks(:app_net)
6
+ .daemonize(false)
@@ -0,0 +1,4 @@
1
+ FROM ruby:2.5.0
2
+
3
+ RUN mkdir /app
4
+ WORKDIR /app
@@ -0,0 +1,6 @@
1
+ Indocker
2
+ .define_container(:daemon_container)
3
+ .tags('daemon_container', 'console=true')
4
+ .image(:daemon_container)
5
+ .networks(:app_net)
6
+ .daemonize(true)
@@ -0,0 +1,3 @@
1
+ Indocker
2
+ .define_image(:daemon_container)
3
+ .registry(:default)
@@ -2,4 +2,5 @@ Indocker
2
2
  .define_container(:good_container)
3
3
  .tags('good_container', 'console=true')
4
4
  .image(:good_container)
5
- .networks(:app_net)
5
+ .networks(:app_net)
6
+ .daemonize(false)
@@ -2,4 +2,5 @@ Indocker
2
2
  .define_container(:ruby)
3
3
  .tags('ruby', 'console=true')
4
4
  .image(:ruby)
5
- .networks(:app_net)
5
+ .networks(:app_net)
6
+ .daemonize(false)
@@ -14,5 +14,10 @@ Indocker
14
14
  },
15
15
  bad_container_start: {
16
16
  servers: [:external],
17
+ },
18
+ daemon_container: {
19
+ servers: [:external],
17
20
  }
18
- )
21
+ ).artifacts(
22
+ indocker_readme: [:external],
23
+ )
@@ -0,0 +1,10 @@
1
+ Indocker.add_artifact(
2
+ Indocker::Artifacts::Git.new(
3
+ name: :indocker_readme,
4
+ remote_name: 'origin',
5
+ remote_url: 'https://github.com/ArtStation/indocker.git',
6
+ branch: :master,
7
+ source_path: './README.md',
8
+ target_path: File.join(Indocker.deploy_dir, 'README.md'),
9
+ )
10
+ )
@@ -18,6 +18,7 @@ require_relative 'infrastructure/registries'
18
18
  require_relative 'infrastructure/servers'
19
19
  require_relative 'infrastructure/build_servers'
20
20
  require_relative 'infrastructure/networks'
21
+ require_relative 'infrastructure/artifacts'
21
22
 
22
23
  Indocker.set_bounded_contexts_dir(File.join(__dir__, 'bounded_contexts'))
23
24
 
@@ -27,4 +27,5 @@ Gem::Specification.new do |spec|
27
27
  spec.add_development_dependency "bundler", "~> 1.17"
28
28
  spec.add_development_dependency "rake", "~> 12.3.3"
29
29
  spec.add_development_dependency "rspec", "~> 3.0"
30
+ spec.add_development_dependency "simplecov", "~> 0.18.5"
30
31
  end
@@ -50,6 +50,7 @@ module Indocker
50
50
  autoload :Local, 'volumes/local'
51
51
  autoload :External, 'volumes/external'
52
52
  autoload :Repository, 'volumes/repository'
53
+ autoload :VolumeHelper, 'volumes/volume_helper'
53
54
  end
54
55
 
55
56
  module EnvFiles
@@ -61,30 +62,42 @@ module Indocker
61
62
  autoload :Git, 'artifacts/git'
62
63
  end
63
64
 
65
+ module Networks
66
+ autoload :Network, 'networks/network'
67
+ autoload :NetworkHelper, 'networks/network_helper'
68
+ end
69
+
70
+ module Launchers
71
+ autoload :ConfigurationDeployer, 'launchers/configuration_deployer'
72
+ autoload :ImagesCompiler, 'launchers/images_compiler'
73
+ autoload :ContainerRunner, 'launchers/container_runner'
74
+ end
75
+
76
+ module ServerPools
77
+ autoload :ServerConnection, 'server_pools/server_connection'
78
+ autoload :DeployServerPool, 'server_pools/deploy_server_pool'
79
+ autoload :DeployServerConnection, 'server_pools/deploy_server_connection'
80
+ autoload :BuildServerPool, 'server_pools/build_server_pool'
81
+ autoload :BuildServerConnection, 'server_pools/build_server_connection'
82
+ end
83
+
64
84
  autoload :HashMerger, 'hash_merger'
65
85
  autoload :BuildServer, 'build_server'
66
86
  autoload :Server, 'server'
67
- autoload :ConfigurationDeployer, 'configuration_deployer'
68
87
  autoload :SshSession, 'ssh_session'
69
- autoload :BuildContextPool, 'build_context_pool'
70
88
  autoload :BuildContext, 'build_context'
71
89
  autoload :BuildContextHelper, 'build_context_helper'
72
90
  autoload :Shell, 'shell'
73
91
  autoload :Docker, 'docker'
74
92
  autoload :ContextArgs, 'context_args'
75
- autoload :Network, 'network'
76
93
  autoload :ContainerDeployer, 'container_deployer'
77
- autoload :ServerPool, 'server_pool'
78
94
  autoload :DeployContext, 'deploy_context'
79
95
  autoload :ContainerHelper, 'container_helper'
80
96
  autoload :DockerRunArgs, 'docker_run_args'
81
- autoload :VolumeHelper, 'volume_helper'
82
- autoload :NetworkHelper, 'network_helper'
83
97
  autoload :Rsync, 'rsync'
84
98
  autoload :EnvFileHelper, 'env_file_helper'
85
99
  autoload :IndockerHelper, 'indocker_helper'
86
- autoload :ImagesCompiler, 'images_compiler'
87
- autoload :ContainerRunner, 'container_runner'
100
+ autoload :SshResultLogger, 'ssh_result_logger'
88
101
  autoload :DeploymentProgress, 'deployment_progress'
89
102
  autoload :DeploymentChecker, 'deployment_checker'
90
103
  autoload :DeploymentPolicy, 'deployment_policy'
@@ -171,7 +184,7 @@ module Indocker
171
184
  raise ArgumentError.new("network :#{name} was already defined")
172
185
  end
173
186
 
174
- networks.push(Indocker::Network.new(name))
187
+ networks.push(Indocker::Networks::Network.new(name))
175
188
  end
176
189
 
177
190
  def container_files
@@ -339,7 +352,7 @@ module Indocker
339
352
  require_confirmation: require_confirmation,
340
353
  )
341
354
 
342
- Indocker::ConfigurationDeployer
355
+ Indocker::Launchers::ConfigurationDeployer
343
356
  .new(logger: Indocker.logger, global_logger: Indocker.global_logger)
344
357
  .run(
345
358
  configuration: configuration,
@@ -356,7 +369,7 @@ module Indocker
356
369
  )
357
370
  end
358
371
 
359
- def launched?(contaner_name, servers: [])
372
+ def launched?(contaner_name, servers: nil)
360
373
  silent_logger = Logger.new(File.open(File::NULL, "w"))
361
374
  Indocker::DeploymentChecker
362
375
  .new(silent_logger, silent_logger)
@@ -368,7 +381,7 @@ module Indocker
368
381
  end
369
382
 
370
383
  def compile(images:, skip_dependent:)
371
- Indocker::ImagesCompiler
384
+ Indocker::Launchers::ImagesCompiler
372
385
  .new(Indocker.logger)
373
386
  .compile(
374
387
  configuration: configuration,
@@ -378,7 +391,7 @@ module Indocker
378
391
  end
379
392
 
380
393
  def run(container_name, force_restart)
381
- Indocker::ContainerRunner
394
+ Indocker::Launchers::ContainerRunner
382
395
  .new(Indocker.logger)
383
396
  .run(
384
397
  configuration: configuration,
@@ -1,54 +1,18 @@
1
1
  require 'fileutils'
2
2
 
3
3
  class Indocker::BuildContext
4
- attr_reader :session, :server, :configuration, :helper, :logger
4
+ attr_reader :configuration, :logger, :global_logger, :helper
5
5
 
6
- def initialize(configuration:, build_server:, logger:)
6
+ def initialize(configuration:, logger:, global_logger:)
7
7
  @configuration = configuration
8
8
  @logger = logger
9
9
  @helper = Indocker::BuildContextHelper.new(@configuration, @build_server)
10
- @server = build_server
11
- @compiled_images = Hash.new(false)
12
- end
13
-
14
- def create_session!
15
- return unless @server
16
-
17
- @session = Indocker::SshSession.new(
18
- host: @server.host,
19
- user: @server.user,
20
- port: @server.port,
21
- logger: @logger
22
- )
23
- end
24
-
25
- def exec!(command)
26
- @session.exec!(command)
27
- end
28
-
29
- def close_session
30
- @session.close if @session
31
- end
32
-
33
- def image_compiled?(image)
34
- @compiled_images[image]
35
- end
36
-
37
- def set_busy(flag)
38
- @busy = !!flag
39
- end
40
-
41
- def busy?
42
- !!@busy
43
- end
44
-
45
- def set_compiled(image)
46
- @compiled_images[image] = true
10
+ @global_logger = global_logger
47
11
  end
48
12
 
49
13
  def build_image(image, build_dir, args: [])
50
14
  image_name = image.image_name
51
- registry = image.registry
15
+ registry = image.registry
52
16
  tag = image.tag
53
17
 
54
18
  FileUtils.cd(build_dir) do
@@ -72,13 +36,15 @@ class Indocker::BuildContext
72
36
  res = Indocker::Docker.build(image.local_registry_url, build_args)
73
37
 
74
38
  if res.exit_status != 0
75
- puts "image compilation :#{image.name} failed"
76
- puts res.stdout
39
+ @global_logger.error("image compilation :#{image.name} failed")
40
+ @global_logger.error(res.stdout)
77
41
  exit 1
78
42
  end
79
43
 
80
44
  Indocker::Docker.tag(image.local_registry_url, image.registry_url)
81
- Indocker::Docker.tag(image.local_registry_url, image.local_registry_url)
45
+ if image.registry_url != image.local_registry_url
46
+ Indocker::Docker.tag(image.local_registry_url, image.local_registry_url)
47
+ end
82
48
 
83
49
  if !image.registry.is_local?
84
50
  Indocker::Docker.push(image.registry_url)
@@ -5,7 +5,7 @@ class Indocker::ContainerDeployer
5
5
  @configuration = configuration
6
6
  @logger = logger
7
7
 
8
- @server_pool = Indocker::ServerPool.new(
8
+ @server_pool = Indocker::ServerPools::DeployServerPool.new(
9
9
  configuration: @configuration,
10
10
  logger: logger
11
11
  )
@@ -14,10 +14,6 @@ class Indocker::ContainerDeployer
14
14
  @deployed_servers = {}
15
15
  end
16
16
 
17
- def create_sessions!
18
- @server_pool.create_sessions!
19
- end
20
-
21
17
  def deploy(container, force_restart, skip_force_restart, progress)
22
18
  return if @deployed_containers[container]
23
19
 
@@ -37,37 +33,23 @@ class Indocker::ContainerDeployer
37
33
  end
38
34
 
39
35
  exec_proc.call do
40
- deploy_context = @server_pool.get(server)
36
+ deploy_server = @server_pool.create_connection!(server)
41
37
  @logger.info("Deploying container: #{container.name.to_s.green} to #{server.user}@#{server.host}")
42
38
 
43
- command_output = @logger.debug? ? "" : " > /dev/null"
44
- debug_options = @logger.debug? ? "-d" : ""
45
-
46
- if force_restart && !skip_force_restart.include?(container.name)
47
- force_restart_options = force_restart ? "-f" : ""
48
- end
49
-
50
- result = deploy_context
51
- .session
52
- .exec!(
53
- "cd #{Indocker::IndockerHelper.indocker_dir} && ./bin/remote/run -C #{Indocker.configuration_name} -c #{container.name} #{debug_options} #{command_output} #{force_restart_options}",
54
- on_stdout: proc { |data|
55
- @logger.info("[deploy] #{data}")
56
- },
57
- on_stderr: proc { |data|
58
- @logger.error("[deploy] #{data}")
59
- }
39
+ result = deploy_server
40
+ .run_container_remotely(
41
+ configuration_name: Indocker.configuration_name,
42
+ container_name: container.name,
43
+ force_restart: force_restart && !skip_force_restart.include?(container.name)
60
44
  )
61
-
45
+
62
46
  if result.exit_code != 0
63
- @global_logger.error("[deploy] #{container.name.to_s.green} deployment for server #{server.name} failed")
64
- puts result.stdout_data
65
47
  exit 1
66
48
  end
67
-
49
+
68
50
  @logger.info("Container deployment to #{server.user}@#{server.host} finished: #{container.name.to_s.green}")
69
51
 
70
- deploy_context.close_session
52
+ deploy_server.close_session
71
53
  progress.finish_deploying_container(container, server)
72
54
  end
73
55
  end
@@ -8,7 +8,7 @@ PATH=/usr/local/bundle/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sb
8
8
  CRONTAB
9
9
 
10
10
  LOG_FILE = "/var/log/indocker-redeploy-%{env}.log"
11
- COMMAND = "export TERM=xterm;#{Indocker.deploy_dir}/indocker/bin/deploy -C %{env} -f -B -y -c %{container_name}"
11
+ COMMAND = "export TERM=xterm;%{deploy_dir}/indocker/bin/deploy -C %{env} -f -B -y -c %{container_name}"
12
12
  REDEPLOY_RULE = %Q{%{schedule} echo `date` "- %{command}..." >> %{log_file}; %{command} 1>/dev/null 2>>%{log_file}; echo `date` "- done, exitcode = $?" >> %{log_file}}
13
13
 
14
14
  def initialize(configuration:, logger:)
@@ -41,6 +41,7 @@ PATH=/usr/local/bundle/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sb
41
41
  COMMAND % {
42
42
  env: env,
43
43
  container_name: container.name,
44
+ deploy_dir: Indocker.deploy_dir
44
45
  }
45
46
  end
46
47
 
@@ -2,42 +2,14 @@ require 'digest'
2
2
  require 'fileutils'
3
3
 
4
4
  class Indocker::DeployContext
5
- attr_reader :server, :session
5
+ attr_reader :configuration, :logger
6
6
 
7
- def initialize(logger:, configuration:, server:)
7
+ def initialize(logger:, configuration:)
8
8
  @logger = logger
9
9
  @configuration = configuration
10
- @server = server
11
10
  @restart_policy = Indocker::Containers::RestartPolicy.new(configuration, logger)
12
11
  end
13
12
 
14
- def create_session!
15
- return unless @server
16
-
17
- @session = Indocker::SshSession.new(
18
- host: @server.host,
19
- user: @server.user,
20
- port: @server.port,
21
- logger: @logger
22
- )
23
- end
24
-
25
- def exec!(command)
26
- @session.exec!(command)
27
- end
28
-
29
- def close_session
30
- @session.close if @session
31
- end
32
-
33
- def set_busy(flag)
34
- @busy = !!flag
35
- end
36
-
37
- def busy?
38
- !!@busy
39
- end
40
-
41
13
  def deploy(container, force_restart)
42
14
  @logger.info("Deploying container: #{container.name.to_s.green}")
43
15
  @logger.debug("Deploy dir: #{Indocker.deploy_dir}")
@@ -46,14 +18,14 @@ class Indocker::DeployContext
46
18
 
47
19
  container.networks.each do |network|
48
20
  Indocker::Docker.create_network(
49
- Indocker::NetworkHelper.name(@configuration.name, network)
21
+ Indocker::Networks::NetworkHelper.name(@configuration.name, network)
50
22
  )
51
23
  end
52
24
 
53
25
  container.volumes.each do |volume|
54
26
  if volume.is_a?(Indocker::Volumes::External)
55
27
  Indocker::Docker.create_volume(
56
- Indocker::VolumeHelper.name(@configuration.name, volume)
28
+ Indocker::Volumes::VolumeHelper.name(@configuration.name, volume)
57
29
  )
58
30
  end
59
31
  end
@@ -109,13 +109,15 @@ class Indocker::DeploymentChecker
109
109
  { missing_containers: total_missing_containers, invalid_containers: total_invalid_containers }
110
110
  end
111
111
 
112
- def launched?(container_name, configuration:, servers:)
112
+ def launched?(container_name, configuration:, servers: nil)
113
113
  container = Indocker.containers.detect { |c| c.name == container_name.to_sym }
114
114
  hostnames = (container.get_start_option(:scale) || 1).times.map do |number|
115
115
  Indocker::ContainerHelper.hostname(configuration.name, container, number)
116
116
  end
117
117
 
118
- result = run(configuration: configuration, servers: servers, only_containers: [container.name])
118
+ servers ||= container.servers.map(&:name)
119
+
120
+ result = run(configuration: configuration, servers: container.servers.map(&:name), only_containers: [container.name])
119
121
  result[:missing_containers].empty?
120
122
  end
121
123
  end
@@ -159,7 +159,7 @@ class Indocker::DockerRunArgs
159
159
  if volume.is_a?(Indocker::Volumes::Local)
160
160
  args.push("-v #{volume.local_path}:#{volume.path}")
161
161
  elsif volume.is_a?(Indocker::Volumes::External)
162
- name = Indocker::VolumeHelper.name(configuration.name, volume)
162
+ name = Indocker::Volumes::VolumeHelper.name(configuration.name, volume)
163
163
  args.push("-v #{name}:#{volume.path}")
164
164
  elsif volume.is_a?(Indocker::Volumes::Repository)
165
165
  repository = configuration.repositories.fetch(volume.repository_name) do
@@ -173,7 +173,7 @@ class Indocker::DockerRunArgs
173
173
  end
174
174
 
175
175
  container.networks.each do |network|
176
- name = Indocker::NetworkHelper.name(configuration.name, network)
176
+ name = Indocker::Networks::NetworkHelper.name(configuration.name, network)
177
177
  args.push("--network #{name}")
178
178
  end
179
179
 
@@ -61,7 +61,6 @@ class Indocker::Images::ImageCompiler
61
61
  end
62
62
 
63
63
  build_context.build_image(image, compile_dir)
64
- build_context.set_compiled(image)
65
64
 
66
65
  @compiled_images[image] = true
67
66
  end
@@ -2,7 +2,7 @@ require 'timeout'
2
2
  require 'benchmark'
3
3
  require 'tempfile'
4
4
 
5
- class Indocker::ConfigurationDeployer
5
+ class Indocker::Launchers::ConfigurationDeployer
6
6
  REMOTE_OPERATION_TIMEOUT = 60
7
7
 
8
8
  def initialize(logger:, global_logger:)
@@ -14,13 +14,11 @@ class Indocker::ConfigurationDeployer
14
14
  @progress = Indocker::DeploymentProgress.new(
15
15
  Indocker.logger.level == Logger::DEBUG ? nil : Logger.new(STDOUT)
16
16
  )
17
+ @compiled_images = Hash.new(false)
17
18
  end
18
19
 
19
20
  # Launch deployment & measure the benchmark
20
21
  def run(configuration:, deployment_policy:)
21
- build_context_pool = nil
22
- deployer = nil
23
-
24
22
  time = Benchmark.realtime do
25
23
  if deployment_policy.force_restart
26
24
  @logger.warn("WARNING. All containers will be forced to restart.")
@@ -46,12 +44,11 @@ class Indocker::ConfigurationDeployer
46
44
  containers = find_containers_to_deploy(configuration, deployment_policy)
47
45
 
48
46
  clonner = Indocker::Repositories::Clonner.new(configuration, @logger)
49
- build_context_pool = Indocker::BuildContextPool.new(configuration: configuration, logger: @logger)
47
+ build_server_pool = Indocker::ServerPools::BuildServerPool.new(configuration: configuration, logger: @logger)
50
48
  deployer = Indocker::ContainerDeployer.new(configuration: configuration, logger: @logger)
51
49
 
52
50
  @global_logger.info("Establishing ssh sessions to all servers...")
53
- build_context_pool.create_sessions!
54
- deployer.create_sessions!
51
+ build_server_pool.create_sessions!
55
52
 
56
53
  build_servers = configuration
57
54
  .build_servers
@@ -95,7 +92,7 @@ class Indocker::ConfigurationDeployer
95
92
  recursively_deploy_container(
96
93
  configuration,
97
94
  deployer,
98
- build_context_pool,
95
+ build_server_pool,
99
96
  container,
100
97
  containers,
101
98
  deployment_policy.skip_build,
@@ -109,7 +106,7 @@ class Indocker::ConfigurationDeployer
109
106
  .list
110
107
  .each { |t| t.join if t != Thread.current }
111
108
  ensure
112
- build_context_pool.close_sessions if build_context_pool
109
+ build_server_pool.close_sessions if build_server_pool
113
110
  deployer.close_sessions if deployer
114
111
  end
115
112
 
@@ -261,23 +258,25 @@ class Indocker::ConfigurationDeployer
261
258
  def collect_soft_dependent_containers(containers, configuration)
262
259
  result = containers
263
260
 
264
- result += containers.map do |container|
265
- container.soft_dependent_containers.reject do |soft_dependent_container|
266
- configuration.enabled_containers.include?(soft_dependent_container.name) &&
267
- Indocker.launched?(soft_dependent_container.name)
268
- end
269
- end.flatten
261
+ soft_dependent_containers = containers
262
+ .map(&:soft_dependent_containers)
263
+ .flatten
264
+ .uniq(&:name)
270
265
 
266
+ result += soft_dependent_containers.select do |container|
267
+ configuration.enabled_containers.include?(container.name) &&
268
+ !Indocker.launched?(container.name)
269
+ end
271
270
 
272
- result.uniq
271
+ result
273
272
  end
274
273
 
275
- def compile_image(configuration, image, build_context)
276
- return if build_context.image_compiled?(image)
274
+ def compile_image(configuration, image, build_server)
275
+ return if @compiled_images[image]
277
276
 
278
277
  image.dependent_images.each do |dependent_image|
279
- next if build_context.image_compiled?(dependent_image)
280
- compile_image(configuration, dependent_image, build_context)
278
+ next if @compiled_images[image]
279
+ compile_image(configuration, dependent_image, build_server)
281
280
  end
282
281
 
283
282
  compiler = Indocker::Images::ImageCompiler.new
@@ -287,38 +286,30 @@ class Indocker::ConfigurationDeployer
287
286
  result = nil
288
287
 
289
288
  time = Benchmark.realtime do
290
- result = build_context
291
- .session
292
- .exec!(
293
- "cd #{Indocker::IndockerHelper.indocker_dir} && ./bin/remote/compile -C #{Indocker.configuration_name} -i #{image.name} -s #{@logger.debug? ? '-d' : ''}",
294
- on_stdout: proc { |data|
295
- @logger.info("[compile] #{data}")
296
- },
297
- on_stderr: proc { |data|
298
- @logger.error("[compile] #{data}")
299
- }
289
+ result = build_server
290
+ .compile_image_remotely(
291
+ configuration_name: Indocker.configuration_name,
292
+ image_name: image.name
300
293
  )
301
294
  end
302
295
 
303
296
  if result.exit_code != 0
304
- @global_logger.error("[compile] #{image.name.to_s.green} image compilation failed")
305
- puts result.stdout_data
306
- exit 1
297
+ exit 1
307
298
  end
308
299
 
309
300
  @logger.info("Image compilation completed #{image.name.to_s.green}. Time taken: #{time}")
310
301
 
311
- build_context.set_compiled(image)
302
+ @compiled_images[image] = true
312
303
  end
313
304
 
314
- def recursively_deploy_container(configuration, deployer, build_context_pool, container,
305
+ def recursively_deploy_container(configuration, deployer, build_server_pool, container,
315
306
  containers, skip_build, skip_deploy, force_restart, skip_force_restart)
316
307
 
317
308
  container.dependent_containers.each do |container|
318
309
  recursively_deploy_container(
319
310
  configuration,
320
311
  deployer,
321
- build_context_pool,
312
+ build_server_pool,
322
313
  container,
323
314
  containers,
324
315
  skip_build,
@@ -333,20 +324,24 @@ class Indocker::ConfigurationDeployer
333
324
  @progress.start_building_container(container)
334
325
 
335
326
  if !skip_build
336
- build_context = build_context_pool.get
327
+ build_server = build_server_pool.get
337
328
 
338
- build_context.set_busy(true)
339
- compile_image(configuration, container.image, build_context)
340
- build_context.set_busy(false)
329
+ build_server.set_busy(true)
330
+ compile_image(configuration, container.image, build_server)
331
+ build_server.set_busy(false)
341
332
  end
342
333
 
343
334
  @progress.finish_building_container(container)
344
335
 
345
336
  if !skip_deploy
346
- deployer.deploy(container, force_restart, skip_force_restart, @progress)
337
+ deploy_container(deployer, container, force_restart, skip_force_restart)
347
338
  end
348
339
  end
349
340
 
341
+ def deploy_container(deployer, container, force_restart, skip_force_restart)
342
+ deployer.deploy(container, force_restart, skip_force_restart, @progress)
343
+ end
344
+
350
345
  class RemoteOperation
351
346
  attr_reader :thread, :server, :operation, :message
352
347
 
@@ -1,4 +1,4 @@
1
- class Indocker::ContainerRunner
1
+ class Indocker::Launchers::ContainerRunner
2
2
  def initialize(logger)
3
3
  @logger = logger
4
4
  end
@@ -13,8 +13,7 @@ class Indocker::ContainerRunner
13
13
 
14
14
  deploy_context = Indocker::DeployContext.new(
15
15
  logger: @logger,
16
- configuration: configuration,
17
- server: nil
16
+ configuration: configuration
18
17
  )
19
18
 
20
19
  container = configuration.containers.detect { |c| c.name == container_name }
@@ -1,4 +1,4 @@
1
- class Indocker::ImagesCompiler
1
+ class Indocker::Launchers::ImagesCompiler
2
2
  def initialize(logger)
3
3
  @logger = logger
4
4
  end
@@ -8,8 +8,8 @@ class Indocker::ImagesCompiler
8
8
 
9
9
  build_context = Indocker::BuildContext.new(
10
10
  configuration: configuration,
11
- build_server: nil,
12
- logger: @logger
11
+ logger: @logger,
12
+ global_logger: Indocker.global_logger
13
13
  )
14
14
 
15
15
  image_compiler = Indocker::Images::ImageCompiler.new
@@ -1,4 +1,4 @@
1
- class Indocker::Network
1
+ class Indocker::Networks::Network
2
2
  attr_reader :name, :containers
3
3
 
4
4
  def initialize(name)
@@ -1,4 +1,4 @@
1
- class Indocker::NetworkHelper
1
+ class Indocker::Networks::NetworkHelper
2
2
  class << self
3
3
  def name(configuration_name, network)
4
4
  "#{configuration_name}_#{network.name}"
@@ -0,0 +1,15 @@
1
+ require 'fileutils'
2
+
3
+ class Indocker::ServerPools::BuildServerConnection < Indocker::ServerPools::ServerConnection
4
+ def compile_image_remotely(configuration_name:, image_name:)
5
+ result = exec!(
6
+ "cd #{Indocker::IndockerHelper.indocker_dir} && ./bin/remote/compile -C #{configuration_name} -i #{image_name} -s #{@logger.debug? ? '-d' : ''}"
7
+ )
8
+
9
+ Indocker::SshResultLogger
10
+ .new(@logger)
11
+ .log(result, "#{image_name.to_s.green} image compilation failed")
12
+
13
+ result
14
+ end
15
+ end
@@ -1,26 +1,26 @@
1
- class Indocker::BuildContextPool
1
+ class Indocker::ServerPools::BuildServerPool
2
2
  def initialize(configuration:, logger:)
3
3
  @logger = logger
4
4
  @configuration = configuration
5
5
 
6
- @contexts = configuration.build_servers.map do |build_server|
7
- Indocker::BuildContext.new(
6
+ @connections = configuration.build_servers.map do |build_server|
7
+ Indocker::ServerPools::BuildServerConnection.new(
8
8
  logger: @logger,
9
9
  configuration: configuration,
10
- build_server: build_server
10
+ server: build_server,
11
11
  )
12
12
  end
13
13
  end
14
14
 
15
15
  def create_sessions!
16
- @contexts.each(&:create_session!)
16
+ @connections.each(&:create_session!)
17
17
  end
18
18
 
19
19
  def get
20
20
  context = nil
21
21
 
22
22
  loop do
23
- context = @contexts.detect {|c| !c.busy?}
23
+ context = @connections.detect {|c| !c.busy?}
24
24
  sleep(0.1)
25
25
  break if context
26
26
  end
@@ -29,11 +29,11 @@ class Indocker::BuildContextPool
29
29
  end
30
30
 
31
31
  def each(&proc)
32
- @contexts.each(&proc)
32
+ @connections.each(&proc)
33
33
  end
34
34
 
35
35
  def close_sessions
36
- @contexts.each(&:close_session)
36
+ @connections.each(&:close_session)
37
37
  rescue => e
38
38
  @logger.error("error during session close: #{e.inspect}")
39
39
  end
@@ -0,0 +1,17 @@
1
+ class Indocker::ServerPools::DeployServerConnection < Indocker::ServerPools::ServerConnection
2
+ def run_container_remotely(configuration_name:, container_name:, force_restart:)
3
+ command_output = @logger.debug? ? "" : " > /dev/null"
4
+ debug_options = @logger.debug? ? "-d" : ""
5
+ force_restart_options = force_restart ? "-f" : ""
6
+
7
+ result = exec!(
8
+ "cd #{Indocker::IndockerHelper.indocker_dir} && ./bin/remote/run -C #{configuration_name} -c #{container_name} #{debug_options} #{command_output} #{force_restart_options}"
9
+ )
10
+
11
+ Indocker::SshResultLogger
12
+ .new(@logger)
13
+ .log(result, "#{container_name.to_s.green} deployment for server #{server.name} failed")
14
+
15
+ result
16
+ end
17
+ end
@@ -0,0 +1,41 @@
1
+ class Indocker::ServerPools::DeployServerPool
2
+ def initialize(configuration:, logger:)
3
+ @logger = logger
4
+ @configuration = configuration
5
+ @connections = []
6
+ @semaphore = Mutex.new
7
+ end
8
+
9
+ def create_connection!(server)
10
+ connection = Indocker::ServerPools::DeployServerConnection.new(
11
+ logger: @logger,
12
+ configuration: @configuration,
13
+ server: server,
14
+ )
15
+ connection.create_session!
16
+ connection
17
+ end
18
+
19
+ def find_or_create_connection!(server)
20
+ @semaphore.synchronize do
21
+ connection = @connections.detect do |connection|
22
+ connection.server.host == server.host &&
23
+ connection.server.port == server.port &&
24
+ connection.server.user == server.user
25
+ end
26
+ if connection.nil?
27
+ connection = create_connection!(server)
28
+ @connections.push(connection)
29
+ end
30
+ connection
31
+ end
32
+ end
33
+
34
+ def each(&proc)
35
+ @connections.each(&proc)
36
+ end
37
+
38
+ def close_sessions
39
+ @connections.each(&:close_session)
40
+ end
41
+ end
@@ -0,0 +1,37 @@
1
+ class Indocker::ServerPools::ServerConnection
2
+ attr_reader :server, :session
3
+
4
+ def initialize(logger:, configuration:, server:)
5
+ @logger = logger
6
+ @configuration = configuration
7
+ @server = server
8
+ end
9
+
10
+ def create_session!
11
+ return unless @server
12
+
13
+ @session = Indocker::SshSession.new(
14
+ host: @server.host,
15
+ user: @server.user,
16
+ port: @server.port,
17
+ logger: @logger
18
+ )
19
+ end
20
+
21
+ def exec!(command)
22
+ @session.exec!(command)
23
+ end
24
+
25
+ def close_session
26
+ @session.close if @session
27
+ @session = nil
28
+ end
29
+
30
+ def set_busy(flag)
31
+ @busy = !!flag
32
+ end
33
+
34
+ def busy?
35
+ !!@busy
36
+ end
37
+ end
@@ -0,0 +1,18 @@
1
+ class Indocker::SshResultLogger
2
+ def initialize(logger)
3
+ @logger = logger
4
+ end
5
+
6
+ def log(result, error_message)
7
+ if result.exit_code == 0
8
+ puts result.stdout_data
9
+ else
10
+ @logger.error(error_message)
11
+ puts result.stdout_data
12
+
13
+ result.stderr_data.to_s.split("\n").each do |line|
14
+ @logger.error(line)
15
+ end
16
+ end
17
+ end
18
+ end
@@ -37,11 +37,11 @@ class Indocker::SshSession
37
37
  !@ssh
38
38
  end
39
39
 
40
- def exec!(command, on_stdout: nil, on_stderr: nil)
40
+ def exec!(command)
41
41
  if local?
42
42
  exec_locally!(command)
43
43
  else
44
- exec_remotely!(command, on_stdout: on_stdout, on_stderr: on_stderr)
44
+ exec_remotely!(command)
45
45
  end
46
46
  end
47
47
 
@@ -57,7 +57,7 @@ class Indocker::SshSession
57
57
  ExecResult.new(res.stdout, '', res.exit_status, nil)
58
58
  end
59
59
 
60
- def exec_remotely!(command, on_stdout:, on_stderr:)
60
+ def exec_remotely!(command)
61
61
  if Indocker.export_command
62
62
  command = "#{Indocker.export_command} && #{command}"
63
63
  end
@@ -78,12 +78,10 @@ class Indocker::SshSession
78
78
 
79
79
  channel.on_data do |ch,data|
80
80
  stdout_data += data
81
- on_stdout.call(data) if on_stdout
82
81
  end
83
82
 
84
83
  channel.on_extended_data do |ch,type,data|
85
84
  stderr_data += data
86
- on_stderr.call(data) if on_stderr
87
85
  end
88
86
 
89
87
  channel.on_request('exit-status') do |ch,data|
@@ -1,3 +1,3 @@
1
1
  module Indocker
2
- VERSION = "0.1.11"
2
+ VERSION = "0.1.16"
3
3
  end
@@ -1,4 +1,4 @@
1
- class Indocker::VolumeHelper
1
+ class Indocker::Volumes::VolumeHelper
2
2
  class << self
3
3
  def name(configuration_name, volume)
4
4
  "#{configuration_name}_#{volume.name}"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: indocker
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.11
4
+ version: 0.1.16
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ruslan Gatiyatov
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2020-08-13 00:00:00.000000000 Z
12
+ date: 2020-08-14 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: net-ssh
@@ -67,6 +67,20 @@ dependencies:
67
67
  - - "~>"
68
68
  - !ruby/object:Gem::Version
69
69
  version: '3.0'
70
+ - !ruby/object:Gem::Dependency
71
+ name: simplecov
72
+ requirement: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - "~>"
75
+ - !ruby/object:Gem::Version
76
+ version: 0.18.5
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - "~>"
82
+ - !ruby/object:Gem::Version
83
+ version: 0.18.5
70
84
  description: Docker Containers Deployment
71
85
  email:
72
86
  - gvalmon@gmail.com
@@ -76,6 +90,7 @@ extra_rdoc_files: []
76
90
  files:
77
91
  - ".gitignore"
78
92
  - ".rspec"
93
+ - ".ruby-version"
79
94
  - ".travis.yml"
80
95
  - Gemfile
81
96
  - Gemfile.lock
@@ -95,6 +110,9 @@ files:
95
110
  - example/indocker/bounded_contexts/shared/bad_container_start/build_context/bin/run
96
111
  - example/indocker/bounded_contexts/shared/bad_container_start/container.rb
97
112
  - example/indocker/bounded_contexts/shared/bad_container_start/image.rb
113
+ - example/indocker/bounded_contexts/shared/daemon_container/Dockerfile
114
+ - example/indocker/bounded_contexts/shared/daemon_container/container.rb
115
+ - example/indocker/bounded_contexts/shared/daemon_container/image.rb
98
116
  - example/indocker/bounded_contexts/shared/good_container/Dockerfile
99
117
  - example/indocker/bounded_contexts/shared/good_container/container.rb
100
118
  - example/indocker/bounded_contexts/shared/good_container/image.rb
@@ -103,29 +121,25 @@ files:
103
121
  - example/indocker/bounded_contexts/shared/ruby/image.rb
104
122
  - example/indocker/configurations/dev.rb
105
123
  - example/indocker/configurations/external.rb
124
+ - example/indocker/infrastructure/artifacts.rb
106
125
  - example/indocker/infrastructure/build_servers.rb
107
126
  - example/indocker/infrastructure/networks.rb
108
127
  - example/indocker/infrastructure/registries.rb
109
128
  - example/indocker/infrastructure/servers.rb
110
129
  - example/indocker/setup.rb
111
- - example/spec/indocker_spec.rb
112
- - example/spec/spec_helper.rb
113
130
  - indocker.gemspec
114
131
  - lib/indocker.rb
115
132
  - lib/indocker/artifacts/git.rb
116
133
  - lib/indocker/build_context.rb
117
134
  - lib/indocker/build_context_helper.rb
118
- - lib/indocker/build_context_pool.rb
119
135
  - lib/indocker/build_server.rb
120
136
  - lib/indocker/colored_string.rb
121
137
  - lib/indocker/concerns/inspectable.rb
122
- - lib/indocker/configuration_deployer.rb
123
138
  - lib/indocker/configurations/configuration.rb
124
139
  - lib/indocker/configurations/configuration_builder.rb
125
140
  - lib/indocker/configurations/formatters/stdout.rb
126
141
  - lib/indocker/container_deployer.rb
127
142
  - lib/indocker/container_helper.rb
128
- - lib/indocker/container_runner.rb
129
143
  - lib/indocker/containers/container.rb
130
144
  - lib/indocker/containers/container_builder.rb
131
145
  - lib/indocker/containers/restart_policy.rb
@@ -146,11 +160,13 @@ files:
146
160
  - lib/indocker/images/image_compiler.rb
147
161
  - lib/indocker/images/template_compiler.rb
148
162
  - lib/indocker/images/templates_compiler.rb
149
- - lib/indocker/images_compiler.rb
150
163
  - lib/indocker/indocker_helper.rb
164
+ - lib/indocker/launchers/configuration_deployer.rb
165
+ - lib/indocker/launchers/container_runner.rb
166
+ - lib/indocker/launchers/images_compiler.rb
151
167
  - lib/indocker/logger_factory.rb
152
- - lib/indocker/network.rb
153
- - lib/indocker/network_helper.rb
168
+ - lib/indocker/networks/network.rb
169
+ - lib/indocker/networks/network_helper.rb
154
170
  - lib/indocker/registries/abstract.rb
155
171
  - lib/indocker/registries/local.rb
156
172
  - lib/indocker/registries/remote.rb
@@ -161,14 +177,19 @@ files:
161
177
  - lib/indocker/repositories/no_sync.rb
162
178
  - lib/indocker/rsync.rb
163
179
  - lib/indocker/server.rb
164
- - lib/indocker/server_pool.rb
180
+ - lib/indocker/server_pools/build_server_connection.rb
181
+ - lib/indocker/server_pools/build_server_pool.rb
182
+ - lib/indocker/server_pools/deploy_server_connection.rb
183
+ - lib/indocker/server_pools/deploy_server_pool.rb
184
+ - lib/indocker/server_pools/server_connection.rb
165
185
  - lib/indocker/shell.rb
186
+ - lib/indocker/ssh_result_logger.rb
166
187
  - lib/indocker/ssh_session.rb
167
188
  - lib/indocker/version.rb
168
- - lib/indocker/volume_helper.rb
169
189
  - lib/indocker/volumes/external.rb
170
190
  - lib/indocker/volumes/local.rb
171
191
  - lib/indocker/volumes/repository.rb
192
+ - lib/indocker/volumes/volume_helper.rb
172
193
  homepage: https://github.com/ArtStation/indocker
173
194
  licenses:
174
195
  - MIT
@@ -1,39 +0,0 @@
1
- require 'spec_helper'
2
-
3
- RSpec.describe Indocker do
4
- it "has a version number" do
5
- expect(Indocker::VERSION).not_to be nil
6
- end
7
-
8
- describe "successful deployment" do
9
- it "doesn't raise any error" do
10
- expect{
11
- launch_deployment(containers: [:good_container])
12
- }.to_not raise_error
13
- end
14
-
15
- it "shows a message about successful deploy" do
16
- allow(Indocker.global_logger).to receive(:info).at_least(:once)
17
-
18
- launch_deployment(containers: [:good_container])
19
-
20
- expect(Indocker.global_logger).to have_received(:info).at_least(:once).with(/Deployment finished/)
21
- end
22
- end
23
-
24
- describe "failed build" do
25
- it "exits with an error" do
26
- expect{
27
- launch_deployment(containers: [:bad_container_build])
28
- }.to raise_error(SystemExit)
29
- end
30
- end
31
-
32
- describe "failed start" do
33
- it "exits without error" do
34
- expect{
35
- launch_deployment(containers: [:bad_container_start])
36
- }.to_not raise_error(SystemExit)
37
- end
38
- end
39
- end
@@ -1,39 +0,0 @@
1
- require "bundler/setup"
2
- require "indocker"
3
- require "pry"
4
-
5
- RSpec.configure do |config|
6
- # Enable flags like --only-failures and --next-failure
7
- config.example_status_persistence_file_path = ".rspec_status"
8
-
9
- # Disable RSpec exposing methods globally on `Module` and `main`
10
- config.disable_monkey_patching!
11
-
12
- config.expect_with :rspec do |c|
13
- c.syntax = :expect
14
- end
15
- end
16
-
17
- def launch_deployment(options = {})
18
- require_relative '../indocker/bin/utils/configurations'
19
-
20
- Indocker.set_configuration_name(options[:configuration] || "external")
21
- require_relative '../indocker/setup'
22
-
23
- Indocker.set_log_level(options[:debug] ? Logger::DEBUG : Logger::INFO)
24
-
25
- Indocker.deploy(
26
- containers: options[:containers] || [],
27
- tags: options[:tags] || [],
28
- skip_containers: options[:skip_containers] || [],
29
- skip_dependent: !!options[:skip_dependent],
30
- servers: options[:servers] || [],
31
- skip_build: options[:skip_build],
32
- skip_deploy: options[:skip_deploy],
33
- force_restart: options[:force_restart],
34
- skip_tags: options[:skip_tags] || [],
35
- skip_force_restart: options[:skip_force_restart] || [],
36
- auto_confirm: !!options[:auto_confirm],
37
- require_confirmation: !!options[:require_confirmation],
38
- )
39
- end
@@ -1,38 +0,0 @@
1
- class Indocker::ServerPool
2
- def initialize(configuration:, logger:)
3
- @logger = logger
4
- @configuration = configuration
5
-
6
- @contexts = configuration.servers.map do |server|
7
- Indocker::DeployContext.new(
8
- logger: @logger,
9
- configuration: configuration,
10
- server: server,
11
- )
12
- end
13
- end
14
-
15
- def create_sessions!
16
- @contexts.each(&:create_session!)
17
- end
18
-
19
- # NOTE: get is a bad name here, because we create a new connection.
20
- # TODO: why we create a new connection here?
21
- def get(server)
22
- context = Indocker::DeployContext.new(
23
- logger: @logger,
24
- configuration: @configuration,
25
- server: server,
26
- )
27
- context.create_session!
28
- context
29
- end
30
-
31
- def each(&proc)
32
- @contexts.each(&proc)
33
- end
34
-
35
- def close_sessions
36
- @contexts.each(&:close_session)
37
- end
38
- end