indocker 0.1.12 → 0.1.17

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 (70) 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/bin/deploy +3 -6
  6. data/example/indocker/bin/remote/compile +2 -6
  7. data/example/indocker/bin/remote/run +2 -6
  8. data/example/indocker/bounded_contexts/{shared → bad_containers}/bad_container_build/Dockerfile +0 -0
  9. data/example/indocker/bounded_contexts/{shared → bad_containers}/bad_container_build/container.rb +2 -1
  10. data/example/indocker/bounded_contexts/{shared → bad_containers}/bad_container_build/image.rb +0 -0
  11. data/example/indocker/bounded_contexts/{shared → bad_containers}/bad_container_start/Dockerfile +0 -0
  12. data/example/indocker/bounded_contexts/{shared → bad_containers}/bad_container_start/build_context/bin/run +0 -0
  13. data/example/indocker/bounded_contexts/{shared → bad_containers}/bad_container_start/container.rb +2 -1
  14. data/example/indocker/bounded_contexts/{shared → bad_containers}/bad_container_start/image.rb +0 -0
  15. data/example/indocker/bounded_contexts/good_containers/daemon_container/Dockerfile +1 -0
  16. data/example/indocker/bounded_contexts/good_containers/daemon_container/container.rb +6 -0
  17. data/example/indocker/bounded_contexts/good_containers/daemon_container/image.rb +4 -0
  18. data/example/indocker/bounded_contexts/good_containers/dependency_container/Dockerfile +1 -0
  19. data/example/indocker/bounded_contexts/good_containers/dependency_container/container.rb +6 -0
  20. data/example/indocker/bounded_contexts/good_containers/dependency_container/image.rb +4 -0
  21. data/example/indocker/bounded_contexts/good_containers/good_container/Dockerfile +3 -0
  22. data/example/indocker/bounded_contexts/good_containers/good_container/build_context/example_file.txt +2 -0
  23. data/example/indocker/bounded_contexts/good_containers/good_container/container.rb +10 -0
  24. data/example/indocker/bounded_contexts/good_containers/good_container/image.rb +4 -0
  25. data/example/indocker/bounded_contexts/shared/{good_container → parent_image}/Dockerfile +1 -1
  26. data/example/indocker/bounded_contexts/shared/parent_image/image.rb +3 -0
  27. data/example/indocker/bounded_contexts/shared/ruby/container.rb +2 -1
  28. data/example/indocker/configurations/external.rb +11 -1
  29. data/example/indocker/env_files/development_env.env +1 -0
  30. data/example/indocker/infrastructure/artifacts.rb +26 -0
  31. data/example/indocker/infrastructure/env_files.rb +6 -0
  32. data/example/indocker/setup.rb +3 -1
  33. data/indocker.gemspec +1 -0
  34. data/lib/indocker.rb +42 -20
  35. data/lib/indocker/artifacts/base.rb +26 -0
  36. data/lib/indocker/artifacts/dto/file_dto.rb +8 -0
  37. data/lib/indocker/artifacts/git.rb +17 -5
  38. data/lib/indocker/artifacts/remote.rb +17 -0
  39. data/lib/indocker/artifacts/services/synchronizer.rb +59 -0
  40. data/lib/indocker/build_context.rb +6 -41
  41. data/lib/indocker/build_context_helper.rb +1 -1
  42. data/lib/indocker/container_deployer.rb +12 -23
  43. data/lib/indocker/crontab_redeploy_rules_builder.rb +6 -6
  44. data/lib/indocker/deploy_context.rb +4 -32
  45. data/lib/indocker/deployment_checker.rb +4 -2
  46. data/lib/indocker/docker_run_args.rb +2 -2
  47. data/lib/indocker/images/image_compiler.rb +0 -1
  48. data/lib/indocker/{configuration_deployer.rb → launchers/configuration_deployer.rb} +66 -113
  49. data/lib/indocker/{container_runner.rb → launchers/container_runner.rb} +2 -3
  50. data/lib/indocker/launchers/dto/remote_operation_dto.rb +10 -0
  51. data/lib/indocker/{images_compiler.rb → launchers/images_compiler.rb} +1 -2
  52. data/lib/indocker/{network.rb → networks/network.rb} +1 -1
  53. data/lib/indocker/{network_helper.rb → networks/network_helper.rb} +1 -1
  54. data/lib/indocker/repositories/cloner.rb +73 -0
  55. data/lib/indocker/server_pools/build_server_connection.rb +15 -0
  56. data/lib/indocker/server_pools/build_server_pool.rb +40 -0
  57. data/lib/indocker/server_pools/deploy_server_connection.rb +17 -0
  58. data/lib/indocker/server_pools/deploy_server_pool.rb +41 -0
  59. data/lib/indocker/server_pools/server_connection.rb +37 -0
  60. data/lib/indocker/version.rb +1 -1
  61. data/lib/indocker/{volume_helper.rb → volumes/volume_helper.rb} +1 -1
  62. metadata +56 -24
  63. data/example/indocker/bounded_contexts/shared/good_container/container.rb +0 -5
  64. data/example/indocker/bounded_contexts/shared/good_container/image.rb +0 -3
  65. data/example/spec/indocker_spec.rb +0 -39
  66. data/example/spec/spec_helper.rb +0 -39
  67. data/lib/indocker/build_context_pool.rb +0 -42
  68. data/lib/indocker/configurations/formatters/stdout.rb +0 -36
  69. data/lib/indocker/repositories/clonner.rb +0 -17
  70. data/lib/indocker/server_pool.rb +0 -38
@@ -0,0 +1,26 @@
1
+ class Indocker::Artifacts::Base
2
+ def build_source_path(*args)
3
+ raise StandardError.new('not implemented')
4
+ end
5
+
6
+ def is_git?
7
+ false
8
+ end
9
+
10
+ private
11
+
12
+ def build_all_files(files: [], source_path: nil, target_path: nil)
13
+ all_files = files
14
+
15
+ if source_path && target_path
16
+ all_files.push(
17
+ Indocker::Artifacts::DTO::FileDTO.new(
18
+ source_path: source_path,
19
+ target_path: target_path,
20
+ )
21
+ )
22
+ end
23
+
24
+ all_files
25
+ end
26
+ end
@@ -0,0 +1,8 @@
1
+ class Indocker::Artifacts::DTO::FileDTO
2
+ attr_reader :source_path, :target_path
3
+
4
+ def initialize(source_path:, target_path:)
5
+ @source_path = source_path
6
+ @target_path = target_path
7
+ end
8
+ end
@@ -1,13 +1,17 @@
1
- class Indocker::Artifacts::Git
2
- attr_reader :name, :remote_name, :remote_url, :branch, :source_path, :target_path
1
+ class Indocker::Artifacts::Git < Indocker::Artifacts::Base
2
+ attr_reader :name, :remote_name, :remote_url, :branch, :files
3
3
 
4
- def initialize(name:, remote_name:, remote_url:, branch:, source_path:, target_path:)
4
+ def initialize(name:, remote_name:, remote_url:, branch:, files: [], source_path: nil, target_path: nil)
5
5
  @name = name
6
6
  @remote_name = remote_name
7
7
  @remote_url = remote_url
8
8
  @branch = branch
9
- @source_path = source_path
10
- @target_path = target_path
9
+
10
+ @files = build_all_files(
11
+ files: files,
12
+ source_path: source_path,
13
+ target_path: target_path,
14
+ )
11
15
  end
12
16
 
13
17
  def repository
@@ -22,4 +26,12 @@ class Indocker::Artifacts::Git
22
26
  def project_name(url)
23
27
  url.split('/').last.gsub('.git', '')
24
28
  end
29
+
30
+ def is_git?
31
+ true
32
+ end
33
+
34
+ def build_source_path(path)
35
+ File.join(self.repository.clone_path, path)
36
+ end
25
37
  end
@@ -0,0 +1,17 @@
1
+ class Indocker::Artifacts::Remote < Indocker::Artifacts::Base
2
+ attr_reader :name, :files
3
+
4
+ def initialize(name:, files: [], source_path: nil, target_path: nil)
5
+ @name = name
6
+
7
+ @files = build_all_files(
8
+ files: files,
9
+ source_path: source_path,
10
+ target_path: target_path,
11
+ )
12
+ end
13
+
14
+ def build_source_path(path)
15
+ path
16
+ end
17
+ end
@@ -0,0 +1,59 @@
1
+ class Indocker::Artifacts::Services::Synchronizer
2
+ def initialize(logger:, progress:)
3
+ @logger = logger
4
+ @progress = progress
5
+ end
6
+
7
+ def call(clonner, artifact_servers)
8
+ @logger.info("Syncing git artifacts")
9
+
10
+ remote_operations = []
11
+
12
+ artifact_servers.each do |artifact, servers|
13
+ remote_operations += servers.map do |server|
14
+ @progress.start_syncing_artifact(server, artifact)
15
+
16
+ thread = Thread.new do
17
+ server.synchronize do
18
+ session = Indocker::SshSession.new(
19
+ host: server.host,
20
+ user: server.user,
21
+ port: server.port,
22
+ logger: @logger
23
+ )
24
+
25
+ if artifact.is_git?
26
+ @logger.info("Pulling git artifact #{artifact.name.to_s.green} for #{server.user}@#{server.host}")
27
+ result = clonner.clone(session, artifact.repository)
28
+
29
+ if result.exit_code != 0
30
+ @logger.error("Artifact repository :#{artifact.repository.name} was not clonned")
31
+ @logger.error(result.stderr_data)
32
+ exit 1
33
+ end
34
+ end
35
+
36
+ artifact.files.each do |artifact_item|
37
+ source_path = artifact.build_source_path(artifact_item.source_path)
38
+
39
+ result = session.exec!("mkdir -p #{artifact_item.target_path}")
40
+ result = session.exec!("cp #{source_path} #{artifact_item.target_path}")
41
+
42
+ if !result.success?
43
+ @logger.error(result.stdout_data)
44
+ @logger.error(result.stderr_data)
45
+ exit 1
46
+ end
47
+ end
48
+
49
+ @progress.finish_syncing_artifact(server, artifact)
50
+ end
51
+ end
52
+
53
+ Indocker::Launchers::DTO::RemoteOperationDTO.new(thread, server, :artifact_sync)
54
+ end
55
+ end
56
+
57
+ remote_operations
58
+ end
59
+ end
@@ -1,55 +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:, global_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
10
  @global_logger = global_logger
12
- @compiled_images = Hash.new(false)
13
- end
14
-
15
- def create_session!
16
- return unless @server
17
-
18
- @session = Indocker::SshSession.new(
19
- host: @server.host,
20
- user: @server.user,
21
- port: @server.port,
22
- logger: @logger
23
- )
24
- end
25
-
26
- def exec!(command)
27
- @session.exec!(command)
28
- end
29
-
30
- def close_session
31
- @session.close if @session
32
- end
33
-
34
- def image_compiled?(image)
35
- @compiled_images[image]
36
- end
37
-
38
- def set_busy(flag)
39
- @busy = !!flag
40
- end
41
-
42
- def busy?
43
- !!@busy
44
- end
45
-
46
- def set_compiled(image)
47
- @compiled_images[image] = true
48
11
  end
49
12
 
50
13
  def build_image(image, build_dir, args: [])
51
14
  image_name = image.image_name
52
- registry = image.registry
15
+ registry = image.registry
53
16
  tag = image.tag
54
17
 
55
18
  FileUtils.cd(build_dir) do
@@ -79,7 +42,9 @@ class Indocker::BuildContext
79
42
  end
80
43
 
81
44
  Indocker::Docker.tag(image.local_registry_url, image.registry_url)
82
- 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
83
48
 
84
49
  if !image.registry.is_local?
85
50
  Indocker::Docker.push(image.registry_url)
@@ -4,7 +4,7 @@ class Indocker::BuildContextHelper
4
4
  def initialize(configuration, build_server)
5
5
  @configuration = configuration
6
6
  @build_server = build_server
7
- @clonned_repositories = Hash.new(false)
7
+ @cloned_repositories = Hash.new(false)
8
8
  end
9
9
 
10
10
  def image_url(image_sym)
@@ -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,30 +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}"
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)
54
44
  )
55
45
 
56
- Indocker::SshResultLogger
57
- .new(@logger)
58
- .log(result, "#{container.name.to_s.green} deployment for server #{server.name} failed")
59
-
60
- exit 1 if result.exit_code != 0
46
+ if result.exit_code != 0
47
+ exit 1
48
+ end
49
+
61
50
  @logger.info("Container deployment to #{server.user}@#{server.host} finished: #{container.name.to_s.green}")
62
51
 
63
- deploy_context.close_session
52
+ deploy_server.close_session
64
53
  progress.finish_deploying_container(container, server)
65
54
  end
66
55
  end
@@ -1,14 +1,13 @@
1
1
  class Indocker::CrontabRedeployRulesBuilder
2
- CRONTAB = <<-CRONTAB
3
- SHELL=/bin/bash
4
- PATH=/usr/local/bundle/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
5
-
6
- %{rules}
2
+ CRONTAB = <<~CRONTAB
3
+ SHELL=/bin/bash
4
+ PATH=/usr/local/bundle/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
7
5
 
6
+ %{rules}
8
7
  CRONTAB
9
8
 
10
9
  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}"
10
+ COMMAND = "export TERM=xterm;%{deploy_dir}/indocker/bin/deploy -C %{env} -f -B -y -c %{container_name}"
12
11
  REDEPLOY_RULE = %Q{%{schedule} echo `date` "- %{command}..." >> %{log_file}; %{command} 1>/dev/null 2>>%{log_file}; echo `date` "- done, exitcode = $?" >> %{log_file}}
13
12
 
14
13
  def initialize(configuration:, logger:)
@@ -41,6 +40,7 @@ PATH=/usr/local/bundle/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sb
41
40
  COMMAND % {
42
41
  env: env,
43
42
  container_name: container.name,
43
+ deploy_dir: Indocker.deploy_dir
44
44
  }
45
45
  end
46
46
 
@@ -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.")
@@ -45,13 +43,12 @@ class Indocker::ConfigurationDeployer
45
43
  def run!(configuration:, deployment_policy:)
46
44
  containers = find_containers_to_deploy(configuration, deployment_policy)
47
45
 
48
- clonner = Indocker::Repositories::Clonner.new(configuration, @logger)
49
- build_context_pool = Indocker::BuildContextPool.new(configuration: configuration, logger: @logger, global_logger: @global_logger)
46
+ cloner = Indocker::Repositories::Cloner.new(configuration, @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
@@ -83,24 +80,24 @@ class Indocker::ConfigurationDeployer
83
80
  remote_operations = sync_env_files(deploy_servers, configuration.env_files)
84
81
  wait_remote_operations(remote_operations)
85
82
 
86
- remote_operations = pull_repositories(clonner, build_servers, configuration.repositories)
83
+ remote_operations = pull_repositories(cloner, build_servers, configuration.repositories)
87
84
  wait_remote_operations(remote_operations)
88
85
 
89
- remote_operations = sync_artifacts(clonner, configuration.artifact_servers)
86
+ remote_operations = sync_artifacts(cloner, configuration.artifact_servers)
90
87
  wait_remote_operations(remote_operations)
91
88
 
92
89
  update_crontab_redeploy_rules(configuration, build_servers.first)
93
90
 
94
91
  containers.uniq.each do |container|
95
92
  recursively_deploy_container(
96
- configuration,
97
- deployer,
98
- build_context_pool,
99
- container,
100
- containers,
101
- deployment_policy.skip_build,
102
- deployment_policy.skip_deploy,
103
- deployment_policy.force_restart,
93
+ configuration,
94
+ deployer,
95
+ build_server_pool,
96
+ container,
97
+ containers,
98
+ deployment_policy.skip_build,
99
+ deployment_policy.skip_deploy,
100
+ deployment_policy.force_restart,
104
101
  deployment_policy.skip_force_restart
105
102
  )
106
103
  end
@@ -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
 
@@ -130,7 +127,7 @@ class Indocker::ConfigurationDeployer
130
127
 
131
128
  def find_containers_to_deploy(configuration, deployment_policy)
132
129
  load_enabled_containers(configuration)
133
-
130
+
134
131
  containers = []
135
132
 
136
133
  deployment_policy.deploy_tags.each do |tag|
@@ -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,37 +286,35 @@ 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' : ''}"
289
+ result = build_server
290
+ .compile_image_remotely(
291
+ configuration_name: Indocker.configuration_name,
292
+ image_name: image.name
294
293
  )
295
294
  end
296
295
 
297
- Indocker::SshResultLogger
298
- .new(@logger)
299
- .log(result, "#{image.name.to_s.green} image compilation failed")
300
-
301
- exit 1 if result.exit_code != 0
296
+ if result.exit_code != 0
297
+ exit 1
298
+ end
302
299
 
303
300
  @logger.info("Image compilation completed #{image.name.to_s.green}. Time taken: #{time}")
304
301
 
305
- build_context.set_compiled(image)
302
+ @compiled_images[image] = true
306
303
  end
307
304
 
308
- def recursively_deploy_container(configuration, deployer, build_context_pool, container,
305
+ def recursively_deploy_container(configuration, deployer, build_server_pool, container,
309
306
  containers, skip_build, skip_deploy, force_restart, skip_force_restart)
310
307
 
311
308
  container.dependent_containers.each do |container|
312
309
  recursively_deploy_container(
313
- configuration,
314
- deployer,
315
- build_context_pool,
316
- container,
317
- containers,
318
- skip_build,
310
+ configuration,
311
+ deployer,
312
+ build_server_pool,
313
+ container,
314
+ containers,
315
+ skip_build,
319
316
  skip_deploy,
320
- force_restart,
317
+ force_restart,
321
318
  skip_force_restart
322
319
  )
323
320
  end
@@ -327,32 +324,25 @@ class Indocker::ConfigurationDeployer
327
324
  @progress.start_building_container(container)
328
325
 
329
326
  if !skip_build
330
- build_context = build_context_pool.get
327
+ build_server = build_server_pool.get
331
328
 
332
- build_context.set_busy(true)
333
- compile_image(configuration, container.image, build_context)
334
- 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)
335
332
  end
336
333
 
337
334
  @progress.finish_building_container(container)
338
335
 
339
336
  if !skip_deploy
340
- deployer.deploy(container, force_restart, skip_force_restart, @progress)
337
+ deploy_container(deployer, container, force_restart, skip_force_restart)
341
338
  end
342
339
  end
343
340
 
344
- class RemoteOperation
345
- attr_reader :thread, :server, :operation, :message
346
-
347
- def initialize(thread, server, operation, message = nil)
348
- @thread = thread
349
- @server = server
350
- @operation = operation
351
- @message = message
352
- end
341
+ def deploy_container(deployer, container, force_restart, skip_force_restart)
342
+ deployer.deploy(container, force_restart, skip_force_restart, @progress)
353
343
  end
354
344
 
355
- def pull_repositories(clonner, servers, repositories)
345
+ def pull_repositories(cloner, servers, repositories)
356
346
  @logger.info("Clonning/pulling repositories")
357
347
 
358
348
  remote_operations = []
@@ -381,10 +371,10 @@ class Indocker::ConfigurationDeployer
381
371
  )
382
372
  elsif repository.is_git?
383
373
  @logger.info("Pulling repository #{alias_name.to_s.green} for #{server.user}@#{server.host}")
384
- result = clonner.clone(session, repository)
374
+ result = cloner.clone(session, repository)
385
375
 
386
376
  if result.exit_code != 0
387
- @logger.error("Repository :#{repository.name} was not clonned")
377
+ @logger.error("Repository :#{repository.name} was not cloned")
388
378
  @logger.error(result.stderr_data)
389
379
  exit 1
390
380
  end
@@ -397,57 +387,20 @@ class Indocker::ConfigurationDeployer
397
387
  @progress.finish_syncing_repository(server, alias_name)
398
388
  end
399
389
 
400
- RemoteOperation.new(thread, server, :repository_pull)
390
+ Indocker::Launchers::DTO::RemoteOperationDTO.new(thread, server, :repository_pull)
401
391
  end
402
392
  end
403
393
 
404
394
  remote_operations
405
395
  end
406
396
 
407
- def sync_artifacts(clonner, artifact_servers)
408
- @logger.info("Syncing git artifacts")
409
-
410
- remote_operations = []
411
-
412
- artifact_servers.each do |artifact, servers|
413
- remote_operations += servers.map do |server|
414
- @progress.start_syncing_artifact(server, artifact)
415
-
416
- thread = Thread.new do
417
- server.synchronize do
418
- session = Indocker::SshSession.new(
419
- host: server.host,
420
- user: server.user,
421
- port: server.port,
422
- logger: @logger
423
- )
424
-
425
- @logger.info("Pulling git artifact #{artifact.name.to_s.green} for #{server.user}@#{server.host}")
426
- result = clonner.clone(session, artifact.repository)
427
-
428
- if result.exit_code != 0
429
- @logger.error("Artifact repository :#{artifact.repository.name} was not clonned")
430
- @logger.error(result.stderr_data)
431
- exit 1
432
- end
433
-
434
- source_path = File.join(artifact.repository.clone_path, artifact.source_path)
435
- result = session.exec!("mkdir -p #{artifact.target_path}")
436
- result = session.exec!("cp -r #{source_path} #{artifact.target_path}")
437
-
438
- if !result.success?
439
- @logger.error(result.stdout_data)
440
- @logger.error(result.stderr_data)
441
- exit 1
442
- end
443
-
444
- @progress.finish_syncing_artifact(server, artifact)
445
- end
446
- end
397
+ def sync_artifacts(cloner, artifact_servers)
398
+ artifacts_synchronizer = Indocker::Artifacts::Services::Synchronizer.new(
399
+ logger: @logger,
400
+ progress: @progress,
401
+ )
447
402
 
448
- RemoteOperation.new(thread, server, :artifact_sync)
449
- end
450
- end
403
+ remote_operations = artifacts_synchronizer.call(cloner, artifact_servers)
451
404
 
452
405
  remote_operations
453
406
  end
@@ -505,7 +458,7 @@ class Indocker::ConfigurationDeployer
505
458
  @progress.finish_syncing_binaries(server)
506
459
  end
507
460
 
508
- RemoteOperation.new(thread, server, :indocker_sync)
461
+ Indocker::Launchers::DTO::RemoteOperationDTO.new(thread, server, :indocker_sync)
509
462
  end
510
463
  end
511
464
 
@@ -546,7 +499,7 @@ class Indocker::ConfigurationDeployer
546
499
  @progress.finish_syncing_env_file(server, alias_name)
547
500
  end
548
501
 
549
- RemoteOperation.new(thread, server, :env_file_sync)
502
+ Indocker::Launchers::DTO::RemoteOperationDTO.new(thread, server, :env_file_sync)
550
503
  end
551
504
  end
552
505