indocker 0.1.9 → 0.1.14

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. checksums.yaml +4 -4
  2. data/.ruby-version +1 -0
  3. data/Gemfile +0 -1
  4. data/Gemfile.lock +10 -4
  5. data/example/indocker/bounded_contexts/shared/{container_failing_build → bad_container_build}/Dockerfile +0 -1
  6. data/example/indocker/bounded_contexts/shared/bad_container_build/container.rb +6 -0
  7. data/example/indocker/bounded_contexts/shared/bad_container_build/image.rb +3 -0
  8. data/example/indocker/bounded_contexts/shared/bad_container_start/Dockerfile +8 -0
  9. data/example/indocker/bounded_contexts/shared/bad_container_start/build_context/bin/run +3 -0
  10. data/example/indocker/bounded_contexts/shared/bad_container_start/container.rb +6 -0
  11. data/example/indocker/bounded_contexts/shared/bad_container_start/image.rb +3 -0
  12. data/example/indocker/bounded_contexts/shared/daemon_container/Dockerfile +4 -0
  13. data/example/indocker/bounded_contexts/shared/daemon_container/container.rb +6 -0
  14. data/example/indocker/bounded_contexts/shared/daemon_container/image.rb +3 -0
  15. data/example/indocker/bounded_contexts/shared/good_container/Dockerfile +4 -0
  16. data/example/indocker/bounded_contexts/shared/good_container/container.rb +6 -0
  17. data/example/indocker/bounded_contexts/shared/good_container/image.rb +3 -0
  18. data/example/indocker/bounded_contexts/shared/ruby/container.rb +2 -1
  19. data/example/indocker/configurations/external.rb +13 -2
  20. data/example/indocker/infrastructure/artifacts.rb +10 -0
  21. data/example/indocker/setup.rb +1 -0
  22. data/indocker.gemspec +2 -1
  23. data/lib/indocker.rb +24 -12
  24. data/lib/indocker/build_context.rb +6 -41
  25. data/lib/indocker/container_deployer.rb +12 -23
  26. data/lib/indocker/crontab_redeploy_rules_builder.rb +2 -1
  27. data/lib/indocker/deploy_context.rb +4 -32
  28. data/lib/indocker/docker_run_args.rb +2 -2
  29. data/lib/indocker/images/image_compiler.rb +0 -1
  30. data/lib/indocker/{configuration_deployer.rb → launchers/configuration_deployer.rb} +29 -30
  31. data/lib/indocker/{container_runner.rb → launchers/container_runner.rb} +2 -3
  32. data/lib/indocker/{images_compiler.rb → launchers/images_compiler.rb} +3 -3
  33. data/lib/indocker/{network.rb → networks/network.rb} +1 -1
  34. data/lib/indocker/{network_helper.rb → networks/network_helper.rb} +1 -1
  35. data/lib/indocker/server_pools/build_server_connection.rb +15 -0
  36. data/lib/indocker/server_pools/build_server_pool.rb +40 -0
  37. data/lib/indocker/server_pools/deploy_server_connection.rb +17 -0
  38. data/lib/indocker/server_pools/deploy_server_pool.rb +41 -0
  39. data/lib/indocker/server_pools/server_connection.rb +36 -0
  40. data/lib/indocker/ssh_session.rb +18 -9
  41. data/lib/indocker/version.rb +1 -1
  42. data/lib/indocker/{volume_helper.rb → volumes/volume_helper.rb} +1 -1
  43. metadata +44 -17
  44. data/example/indocker/bounded_contexts/shared/container_failing_build/container.rb +0 -5
  45. data/example/indocker/bounded_contexts/shared/container_failing_build/image.rb +0 -3
  46. data/example/spec/indocker_spec.rb +0 -31
  47. data/example/spec/spec_helper.rb +0 -39
  48. data/lib/indocker/build_context_pool.rb +0 -42
  49. data/lib/indocker/server_pool.rb +0 -38
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0356e417ece7294e5a5185f7cf17313d3b8f47c74895fdf0323989da110d5569
4
- data.tar.gz: a2c04c1b66f98aa172b758be94e522901dffb2bef4d472602d70742fd93d80be
3
+ metadata.gz: cacf753d2ac5b563b097493cdb495f76b2d1aef8f758dea6d84a3791e36ab0aa
4
+ data.tar.gz: bbd59aec061d7358c3d5a579615547c3a3c097219069d93bbd7e78563f31b091
5
5
  SHA512:
6
- metadata.gz: 38376ede23d5ce780f0234ec01f473d673b4bdfe5a2ef4e893fcf867420ae8a11bbe57df6f010d1f87289f2c970328f8bc86f1b0cde929c73c1129b4bfb0d591
7
- data.tar.gz: 93bb3bb739fbc427e8c688e7da395088d6e60fafa68c0741d91706bc2ac50bee9fae80b7ff240be16f4c4b5e7985b9f8fa4b56c9e1e74ccd6aa036f8d9bad021
6
+ metadata.gz: f57b65eb2d10ae48aef8295db38822e3d2f55f11d04e912628884b8bbf3e88ff60d95453c086ea4352e1cd0c3d35e4c51682e1dda7bf3e7826502e36c0b27ec9
7
+ data.tar.gz: a3732e6bc974c22b3dd5f856c593054d300d1d6244ac5399cb43d9cdd896940aa9089d0240ce5c8f83481a9e3b51507227d1c4510b66563025b6b5266f56491c
@@ -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.9)
4
+ indocker (0.1.14)
5
5
  net-ssh
6
6
 
7
7
  GEM
@@ -9,12 +9,13 @@ 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)
15
16
  coderay (~> 1.1)
16
17
  method_source (~> 1.0)
17
- rake (10.5.0)
18
+ rake (12.3.3)
18
19
  rspec (3.9.0)
19
20
  rspec-core (~> 3.9.0)
20
21
  rspec-expectations (~> 3.9.0)
@@ -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
@@ -36,8 +41,9 @@ DEPENDENCIES
36
41
  bundler (~> 1.17)
37
42
  indocker!
38
43
  pry
39
- rake (~> 10.0)
40
- rspec
44
+ rake (~> 12.3.3)
45
+ rspec (~> 3.0)
46
+ simplecov (~> 0.18.5)
41
47
 
42
48
  BUNDLED WITH
43
49
  1.17.3
@@ -1,4 +1,3 @@
1
1
  FROM ruby:2.5.0
2
2
 
3
3
  RUN some-unexisting-command
4
- WORKDIR /app
@@ -0,0 +1,6 @@
1
+ Indocker
2
+ .define_container(:bad_container_build)
3
+ .tags('bad_container_build', 'console=true')
4
+ .image(:bad_container_build)
5
+ .networks(:app_net)
6
+ .daemonize(false)
@@ -0,0 +1,3 @@
1
+ Indocker
2
+ .define_image(:bad_container_build)
3
+ .registry(:default)
@@ -0,0 +1,8 @@
1
+ FROM ruby:2.5.0
2
+
3
+ RUN mkdir /app
4
+ WORKDIR /app
5
+
6
+ COPY bin bin
7
+
8
+ CMD ["bin/run"]
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ raise "Some error"
@@ -0,0 +1,6 @@
1
+ Indocker
2
+ .define_container(:bad_container_start)
3
+ .tags('bad_container_start', 'console=true')
4
+ .image(:bad_container_start)
5
+ .networks(:app_net)
6
+ .daemonize(false)
@@ -0,0 +1,3 @@
1
+ Indocker
2
+ .define_image(:bad_container_start)
3
+ .registry(:default)
@@ -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)
@@ -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(:good_container)
3
+ .tags('good_container', 'console=true')
4
+ .image(:good_container)
5
+ .networks(:app_net)
6
+ .daemonize(false)
@@ -0,0 +1,3 @@
1
+ Indocker
2
+ .define_image(:good_container)
3
+ .registry(:default)
@@ -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)
@@ -6,7 +6,18 @@ Indocker
6
6
  ruby: {
7
7
  servers: [:external],
8
8
  },
9
- container_failing_build: {
9
+ good_container: {
10
+ servers: [:external],
11
+ },
12
+ bad_container_build: {
13
+ servers: [:external],
14
+ },
15
+ bad_container_start: {
16
+ servers: [:external],
17
+ },
18
+ daemon_container: {
10
19
  servers: [:external],
11
20
  }
12
- )
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
 
@@ -25,6 +25,7 @@ Gem::Specification.new do |spec|
25
25
 
26
26
  spec.add_dependency "net-ssh"
27
27
  spec.add_development_dependency "bundler", "~> 1.17"
28
- spec.add_development_dependency "rake", "~> 10.0"
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,41 @@ 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'
88
100
  autoload :SshResultLogger, 'ssh_result_logger'
89
101
  autoload :DeploymentProgress, 'deployment_progress'
90
102
  autoload :DeploymentChecker, 'deployment_checker'
@@ -172,7 +184,7 @@ module Indocker
172
184
  raise ArgumentError.new("network :#{name} was already defined")
173
185
  end
174
186
 
175
- networks.push(Indocker::Network.new(name))
187
+ networks.push(Indocker::Networks::Network.new(name))
176
188
  end
177
189
 
178
190
  def container_files
@@ -340,7 +352,7 @@ module Indocker
340
352
  require_confirmation: require_confirmation,
341
353
  )
342
354
 
343
- Indocker::ConfigurationDeployer
355
+ Indocker::Launchers::ConfigurationDeployer
344
356
  .new(logger: Indocker.logger, global_logger: Indocker.global_logger)
345
357
  .run(
346
358
  configuration: configuration,
@@ -369,7 +381,7 @@ module Indocker
369
381
  end
370
382
 
371
383
  def compile(images:, skip_dependent:)
372
- Indocker::ImagesCompiler
384
+ Indocker::Launchers::ImagesCompiler
373
385
  .new(Indocker.logger)
374
386
  .compile(
375
387
  configuration: configuration,
@@ -379,7 +391,7 @@ module Indocker
379
391
  end
380
392
 
381
393
  def run(container_name, force_restart)
382
- Indocker::ContainerRunner
394
+ Indocker::Launchers::ContainerRunner
383
395
  .new(Indocker.logger)
384
396
  .run(
385
397
  configuration: configuration,
@@ -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)
@@ -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
@@ -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