indocker 0.1.8 → 0.1.13

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 +4 -0
  4. data/Gemfile.lock +15 -3
  5. data/README.md +13 -2
  6. data/example/indocker/bounded_contexts/shared/bad_container_build/Dockerfile +3 -0
  7. data/example/indocker/bounded_contexts/shared/bad_container_build/container.rb +6 -0
  8. data/example/indocker/bounded_contexts/shared/bad_container_build/image.rb +3 -0
  9. data/example/indocker/bounded_contexts/shared/bad_container_start/Dockerfile +8 -0
  10. data/example/indocker/bounded_contexts/shared/bad_container_start/build_context/bin/run +3 -0
  11. data/example/indocker/bounded_contexts/shared/bad_container_start/container.rb +6 -0
  12. data/example/indocker/bounded_contexts/shared/bad_container_start/image.rb +3 -0
  13. data/example/indocker/bounded_contexts/shared/daemon_container/Dockerfile +4 -0
  14. data/example/indocker/bounded_contexts/shared/daemon_container/container.rb +6 -0
  15. data/example/indocker/bounded_contexts/shared/daemon_container/image.rb +3 -0
  16. data/example/indocker/bounded_contexts/shared/good_container/Dockerfile +4 -0
  17. data/example/indocker/bounded_contexts/shared/good_container/container.rb +6 -0
  18. data/example/indocker/bounded_contexts/shared/good_container/image.rb +3 -0
  19. data/example/indocker/bounded_contexts/shared/ruby/container.rb +2 -1
  20. data/example/indocker/configurations/external.rb +23 -0
  21. data/example/indocker/infrastructure/artifacts.rb +10 -0
  22. data/example/indocker/infrastructure/build_servers.rb +11 -0
  23. data/example/indocker/infrastructure/servers.rb +11 -0
  24. data/example/indocker/setup.rb +2 -1
  25. data/indocker.gemspec +2 -1
  26. data/lib/indocker.rb +56 -68
  27. data/lib/indocker/build_context.rb +10 -43
  28. data/lib/indocker/container_deployer.rb +12 -20
  29. data/lib/indocker/crontab_redeploy_rules_builder.rb +2 -1
  30. data/lib/indocker/deploy_context.rb +4 -30
  31. data/lib/indocker/deployment_policy.rb +22 -0
  32. data/lib/indocker/docker_run_args.rb +2 -2
  33. data/lib/indocker/images/image_compiler.rb +0 -1
  34. data/lib/indocker/{configuration_deployer.rb → launchers/configuration_deployer.rb} +118 -123
  35. data/lib/indocker/{container_runner.rb → launchers/container_runner.rb} +2 -3
  36. data/lib/indocker/{images_compiler.rb → launchers/images_compiler.rb} +3 -3
  37. data/lib/indocker/logger_factory.rb +37 -0
  38. data/lib/indocker/{network.rb → networks/network.rb} +1 -1
  39. data/lib/indocker/{network_helper.rb → networks/network_helper.rb} +1 -1
  40. data/lib/indocker/server_pools/build_server_connection.rb +15 -0
  41. data/lib/indocker/{build_context_pool.rb → server_pools/build_server_pool.rb} +11 -7
  42. data/lib/indocker/server_pools/deploy_server_connection.rb +17 -0
  43. data/lib/indocker/server_pools/deploy_server_pool.rb +33 -0
  44. data/lib/indocker/server_pools/server_connection.rb +36 -0
  45. data/lib/indocker/ssh_session.rb +18 -9
  46. data/lib/indocker/version.rb +1 -1
  47. data/lib/indocker/{volume_helper.rb → volumes/volume_helper.rb} +1 -1
  48. metadata +51 -16
  49. data/lib/indocker/server_pool.rb +0 -30
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d9667ebbc4e293dd51830ec7cae6c57455fe1b59b09722e094d76fa934564001
4
- data.tar.gz: 4912748b481273ba9cc7a69e11698ebfc14cd01d942550bb7f67f014df0b1a46
3
+ metadata.gz: dbe3ccb46e2212e0f4792ff6d528e3da20efbcf793c519b29dc76bd3cf1f2393
4
+ data.tar.gz: a7971075ca1ce8febaef30db0217c9d353536fc2f0f792def4fbf898ba68333c
5
5
  SHA512:
6
- metadata.gz: 553570ec945812578c4a3cfc1744e5455c8e18e584cc2bb0bed4f70227d751329d147c04d07858f0bd26390f3725eb7bed2ce6f5fab4e34ee3731e065cc54499
7
- data.tar.gz: f1b46f64d4be12e0d62de23623fc3aac49fc0f10246effe8868fde2d9721d6105776ca7d06edd3e8e9d368352882125720915ca81ab2952e0e1feecd0eab51e3
6
+ metadata.gz: c7f1a7abced7f6fcf440218bd407714e4a8f53f897d752218493ee3162193a8cdf2eeadd5a204bc8c03b9c263617dd0d97b7f09ede7818bdb79638a61d7aabc8
7
+ data.tar.gz: e51552f9e3de3a1a27b028e74a4ea6d00efe04db6ca31e59a15cc323e49374f48968ea00b94f4147debff6696ac8a88ba317a59e85f4d8ce1d6ccd6ff2641839
@@ -0,0 +1 @@
1
+ 2.5.0
data/Gemfile CHANGED
@@ -4,3 +4,7 @@ git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
4
4
 
5
5
  # Specify your gem's dependencies in indocker.gemspec
6
6
  gemspec
7
+
8
+ group :test do
9
+ gem 'pry'
10
+ end
@@ -1,15 +1,21 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- indocker (0.1.7)
4
+ indocker (0.1.13)
5
5
  net-ssh
6
6
 
7
7
  GEM
8
8
  remote: https://rubygems.org/
9
9
  specs:
10
+ coderay (1.1.3)
10
11
  diff-lcs (1.3)
12
+ docile (1.3.2)
13
+ method_source (1.0.0)
11
14
  net-ssh (6.1.0)
12
- rake (10.5.0)
15
+ pry (0.13.1)
16
+ coderay (~> 1.1)
17
+ method_source (~> 1.0)
18
+ rake (12.3.3)
13
19
  rspec (3.9.0)
14
20
  rspec-core (~> 3.9.0)
15
21
  rspec-expectations (~> 3.9.0)
@@ -23,6 +29,10 @@ GEM
23
29
  diff-lcs (>= 1.2.0, < 2.0)
24
30
  rspec-support (~> 3.9.0)
25
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)
26
36
 
27
37
  PLATFORMS
28
38
  ruby
@@ -30,8 +40,10 @@ PLATFORMS
30
40
  DEPENDENCIES
31
41
  bundler (~> 1.17)
32
42
  indocker!
33
- rake (~> 10.0)
43
+ pry
44
+ rake (~> 12.3.3)
34
45
  rspec (~> 3.0)
46
+ simplecov (~> 0.18.5)
35
47
 
36
48
  BUNDLED WITH
37
49
  1.17.3
data/README.md CHANGED
@@ -1,5 +1,7 @@
1
1
  # InDocker
2
2
 
3
+ [![Codeship Status for ArtStation/indocker](https://app.codeship.com/projects/bf8888c0-b7e4-0138-fc1f-7e2faa53772a/status?branch=master)](https://app.codeship.com/projects/404716)
4
+
3
5
  Docker Containers Deployment
4
6
 
5
7
  ## Installation
@@ -8,11 +10,20 @@ Docker Containers Deployment
8
10
  $ gem install indocker
9
11
  ```
10
12
 
11
- ## Development: Launch example app
13
+ ## Development: Launch example app locally
14
+
15
+ ```ruby
16
+ cd example
17
+ indocker/bin/deploy -C dev -c ruby -d
18
+ ```
19
+
20
+ ## Development: Launch example with external host
21
+
22
+ NOTE: Default external host requires extra permissions.
12
23
 
13
24
  ```ruby
14
25
  cd example
15
- bundle exec indocker/bin/deploy -C dev -c ruby -d
26
+ indocker/bin/deploy -C external -c ruby -d
16
27
  ```
17
28
 
18
29
  ## License
@@ -0,0 +1,3 @@
1
+ FROM ruby:2.5.0
2
+
3
+ RUN some-unexisting-command
@@ -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)
@@ -0,0 +1,23 @@
1
+ Indocker
2
+ .build_configuration(:external)
3
+ .use_registry(:dev, as: :default)
4
+ .use_build_server(:external_bs)
5
+ .enabled_containers(
6
+ ruby: {
7
+ servers: [:external],
8
+ },
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: {
19
+ servers: [:external],
20
+ }
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
+ )
@@ -5,4 +5,15 @@ Indocker.add_build_server(
5
5
  user: `whoami`.strip,
6
6
  port: 22
7
7
  )
8
+ )
9
+
10
+ external_host = ENV['INDOCKER_EXTERNAL_HOST'] || 'indocker.artstn.ninja'
11
+ external_user = ENV['INDOCKER_EXTERNAL_USER'] || 'indocker'
12
+ Indocker.add_build_server(
13
+ Indocker::BuildServer.new(
14
+ name: :external_bs,
15
+ host: external_host,
16
+ user: external_user,
17
+ port: 22
18
+ )
8
19
  )
@@ -5,4 +5,15 @@ Indocker.add_server(
5
5
  user: `whoami`.strip,
6
6
  port: 22
7
7
  )
8
+ )
9
+
10
+ external_host = ENV['INDOCKER_EXTERNAL_HOST'] || 'indocker.artstn.ninja'
11
+ external_user = ENV['INDOCKER_EXTERNAL_USER'] || 'indocker'
12
+ Indocker.add_server(
13
+ Indocker::Server.new(
14
+ name: :external,
15
+ host: external_host,
16
+ user: external_user,
17
+ port: 22
18
+ )
8
19
  )
@@ -3,7 +3,7 @@ require 'indocker'
3
3
  root_dir = File.join(__dir__, '..', '..')
4
4
 
5
5
  Indocker.set_root_dir(__dir__)
6
- Indocker.set_deploy_dir(File.join(root_dir, 'tmp', 'deployment'))
6
+ Indocker.set_deploy_dir('~/deployment')
7
7
 
8
8
  Indocker.set_dockerignore [
9
9
  'Dockerfile',
@@ -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,34 +62,47 @@ 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'
103
+ autoload :DeploymentPolicy, 'deployment_policy'
91
104
  autoload :CrontabRedeployRulesBuilder, 'crontab_redeploy_rules_builder'
105
+ autoload :LoggerFactory, 'logger_factory'
92
106
 
93
107
  class << self
94
108
  def set_export_command(command)
@@ -170,7 +184,7 @@ module Indocker
170
184
  raise ArgumentError.new("network :#{name} was already defined")
171
185
  end
172
186
 
173
- networks.push(Indocker::Network.new(name))
187
+ networks.push(Indocker::Networks::Network.new(name))
174
188
  end
175
189
 
176
190
  def container_files
@@ -323,22 +337,26 @@ module Indocker
323
337
  force_restart: false, skip_force_restart: [], auto_confirm: false,
324
338
  require_confirmation: false)
325
339
 
326
- Indocker::ConfigurationDeployer
327
- .new(Indocker.logger)
340
+ deployment_policy = Indocker::DeploymentPolicy.new(
341
+ deploy_containers: containers,
342
+ deploy_tags: tags,
343
+ servers: servers,
344
+ skip_dependent: skip_dependent,
345
+ skip_containers: skip_containers,
346
+ skip_build: skip_build,
347
+ skip_deploy: skip_deploy,
348
+ skip_tags: skip_tags,
349
+ force_restart: force_restart,
350
+ skip_force_restart: skip_force_restart,
351
+ auto_confirm: auto_confirm,
352
+ require_confirmation: require_confirmation,
353
+ )
354
+
355
+ Indocker::Launchers::ConfigurationDeployer
356
+ .new(logger: Indocker.logger, global_logger: Indocker.global_logger)
328
357
  .run(
329
- configuration: configuration,
330
- deploy_containers: containers,
331
- deploy_tags: tags,
332
- skip_dependent: skip_dependent,
333
- skip_containers: skip_containers,
334
- servers: servers,
335
- skip_build: skip_build,
336
- skip_deploy: skip_deploy,
337
- force_restart: force_restart,
338
- skip_tags: skip_tags,
339
- skip_force_restart: skip_force_restart,
340
- auto_confirm: auto_confirm,
341
- require_confirmation: require_confirmation,
358
+ configuration: configuration,
359
+ deployment_policy: deployment_policy
342
360
  )
343
361
  end
344
362
 
@@ -363,7 +381,7 @@ module Indocker
363
381
  end
364
382
 
365
383
  def compile(images:, skip_dependent:)
366
- Indocker::ImagesCompiler
384
+ Indocker::Launchers::ImagesCompiler
367
385
  .new(Indocker.logger)
368
386
  .compile(
369
387
  configuration: configuration,
@@ -373,7 +391,7 @@ module Indocker
373
391
  end
374
392
 
375
393
  def run(container_name, force_restart)
376
- Indocker::ContainerRunner
394
+ Indocker::Launchers::ContainerRunner
377
395
  .new(Indocker.logger)
378
396
  .run(
379
397
  configuration: configuration,
@@ -390,56 +408,26 @@ module Indocker
390
408
  Indocker::BuildContextHelper.new(Indocker.configuration, nil)
391
409
  end
392
410
 
411
+ # This logger outputs progress of the deployment
412
+ # It will not output anything for deployment without debug option
393
413
  def logger
394
414
  @logger ||= begin
395
- logger = if @log_level == Logger::DEBUG
396
- Logger.new(STDOUT)
415
+ logger_stdout = if @log_level == Logger::DEBUG
416
+ STDOUT
397
417
  else
398
- Logger.new(File.open(File::NULL, "w"))
399
- end
400
-
401
- logger.level = @log_level || Logger::INFO
402
-
403
- logger.formatter = proc do |severity, datetime, progname, msg|
404
- level = Logger::SEV_LABEL.index(severity)
405
-
406
- severity = case level
407
- when Logger::INFO
408
- severity.green
409
- when Logger::WARN
410
- severity.purple
411
- when Logger::DEBUG
412
- severity.yellow
413
- when Logger::ERROR
414
- severity.red
415
- when Logger::FATAL
416
- severity.red
417
- else
418
- severity
419
- end
420
-
421
- severity = severity.downcase
422
-
423
- if logger.debug?
424
- if msg == "{timestamp}"
425
- ""
426
- else
427
- "#{datetime.strftime("%Y/%m/%d %H:%M:%S")} #{severity}: #{msg}\n"
428
- end
429
- else
430
- # Use a nicer logging for not debug
431
- if msg == "{timestamp}"
432
- datetime.strftime("%Y/%m/%d %H:%M:%S\n").grey
433
- else
434
- " #{severity}: #{msg}\n"
435
- end
436
- end
418
+ File.open(File::NULL, "w")
437
419
  end
438
420
 
439
- logger
421
+ Indocker::LoggerFactory.create(logger_stdout, @log_level)
440
422
  end
441
423
  end
442
424
 
425
+ # Global logger would output data without dependency on how we deploy the progress
426
+ # Currently it will always output data to stdout
427
+ def global_logger
428
+ @global_logger ||= Indocker::LoggerFactory.create(STDOUT, @log_level)
429
+ end
430
+
443
431
  def set_log_level(level)
444
432
  @log_level = level
445
433
  end