indocker 0.0.6 → 0.1.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (183) hide show
  1. checksums.yaml +5 -5
  2. data/.gitignore +10 -2
  3. data/.rspec +2 -0
  4. data/.travis.yml +7 -0
  5. data/Gemfile +5 -2
  6. data/Gemfile.lock +19 -49
  7. data/LICENSE.txt +17 -18
  8. data/README.md +20 -1
  9. data/Rakefile +6 -0
  10. data/bin/console +14 -0
  11. data/bin/setup +8 -0
  12. data/example/indocker/bin/deploy +120 -0
  13. data/example/indocker/bin/remote/compile +72 -0
  14. data/example/indocker/bin/remote/run +66 -0
  15. data/example/indocker/bin/utils/configurations.rb +3 -0
  16. data/example/indocker/bounded_contexts/shared/ruby/Dockerfile +10 -0
  17. data/example/indocker/bounded_contexts/shared/ruby/container.rb +5 -0
  18. data/example/indocker/bounded_contexts/shared/ruby/image.rb +3 -0
  19. data/example/indocker/configurations/dev.rb +9 -0
  20. data/example/indocker/infrastructure/build_servers.rb +8 -0
  21. data/example/indocker/infrastructure/networks.rb +1 -0
  22. data/example/indocker/infrastructure/registries.rb +3 -0
  23. data/example/indocker/infrastructure/servers.rb +8 -0
  24. data/example/indocker/setup.rb +24 -0
  25. data/indocker.gemspec +27 -25
  26. data/lib/indocker.rb +437 -130
  27. data/lib/indocker/artifacts/git.rb +25 -0
  28. data/lib/indocker/build_context.rb +87 -0
  29. data/lib/indocker/build_context_helper.rb +109 -0
  30. data/lib/indocker/build_context_pool.rb +36 -0
  31. data/lib/indocker/build_server.rb +2 -0
  32. data/lib/indocker/colored_string.rb +33 -0
  33. data/lib/indocker/concerns/inspectable.rb +12 -0
  34. data/lib/indocker/configuration_deployer.rb +525 -0
  35. data/lib/indocker/configurations/configuration.rb +122 -0
  36. data/lib/indocker/configurations/configuration_builder.rb +250 -0
  37. data/lib/indocker/configurations/formatters/stdout.rb +36 -0
  38. data/lib/indocker/container_deployer.rb +73 -0
  39. data/lib/indocker/container_helper.rb +13 -0
  40. data/lib/indocker/container_runner.rb +23 -0
  41. data/lib/indocker/containers/container.rb +118 -0
  42. data/lib/indocker/containers/container_builder.rb +186 -0
  43. data/lib/indocker/containers/restart_policy.rb +36 -0
  44. data/lib/indocker/context_args.rb +43 -0
  45. data/lib/indocker/crontab_redeploy_rules_builder.rb +54 -0
  46. data/lib/indocker/deploy_context.rb +126 -0
  47. data/lib/indocker/deployment_checker.rb +121 -0
  48. data/lib/indocker/deployment_progress.rb +495 -0
  49. data/lib/indocker/docker.rb +87 -0
  50. data/lib/indocker/docker_run_args.rb +183 -0
  51. data/lib/indocker/env_file_helper.rb +13 -0
  52. data/lib/indocker/env_files/local.rb +8 -0
  53. data/lib/indocker/env_files/remote.rb +8 -0
  54. data/lib/indocker/hash_merger.rb +9 -0
  55. data/lib/indocker/images/image.rb +86 -0
  56. data/lib/indocker/images/image_builder.rb +98 -0
  57. data/lib/indocker/images/image_compiler.rb +68 -0
  58. data/lib/indocker/images/template_compiler.rb +15 -0
  59. data/lib/indocker/images/templates_compiler.rb +28 -0
  60. data/lib/indocker/images_compiler.rb +38 -0
  61. data/lib/indocker/indocker_helper.rb +9 -0
  62. data/lib/indocker/network.rb +12 -0
  63. data/lib/indocker/network_helper.rb +7 -0
  64. data/lib/indocker/registries/abstract.rb +17 -0
  65. data/lib/indocker/registries/local.rb +5 -0
  66. data/lib/indocker/registries/remote.rb +12 -0
  67. data/lib/indocker/repositories/abstract.rb +25 -0
  68. data/lib/indocker/repositories/clonner.rb +17 -0
  69. data/lib/indocker/repositories/git.rb +24 -0
  70. data/lib/indocker/repositories/local.rb +20 -0
  71. data/lib/indocker/repositories/no_sync.rb +20 -0
  72. data/lib/indocker/rsync.rb +52 -0
  73. data/lib/indocker/server.rb +20 -0
  74. data/lib/indocker/server_pool.rb +30 -0
  75. data/lib/indocker/shell.rb +60 -0
  76. data/lib/indocker/ssh_result_logger.rb +18 -0
  77. data/lib/indocker/ssh_session.rb +92 -0
  78. data/lib/indocker/version.rb +1 -1
  79. data/lib/indocker/volume_helper.rb +7 -0
  80. data/lib/indocker/volumes/external.rb +8 -0
  81. data/lib/indocker/volumes/local.rb +9 -0
  82. data/lib/indocker/volumes/repository.rb +9 -0
  83. metadata +107 -222
  84. data/bin/indocker +0 -9
  85. data/lib/indocker/application_initializer.rb +0 -19
  86. data/lib/indocker/cli.rb +0 -27
  87. data/lib/indocker/configs/config.rb +0 -147
  88. data/lib/indocker/configs/config_factory.rb +0 -37
  89. data/lib/indocker/configs/config_initializer.rb +0 -9
  90. data/lib/indocker/configs/locator.rb +0 -23
  91. data/lib/indocker/container/container_builder.rb +0 -29
  92. data/lib/indocker/container/container_directives_runner.rb +0 -54
  93. data/lib/indocker/container/container_dsl.rb +0 -83
  94. data/lib/indocker/container/container_evaluator.rb +0 -13
  95. data/lib/indocker/container/container_inspector.rb +0 -26
  96. data/lib/indocker/container/container_manager.rb +0 -122
  97. data/lib/indocker/container/container_metadata.rb +0 -112
  98. data/lib/indocker/container/container_metadata_factory.rb +0 -30
  99. data/lib/indocker/container/container_metadata_repository.rb +0 -27
  100. data/lib/indocker/directives/base.rb +0 -17
  101. data/lib/indocker/directives/container_directives/base.rb +0 -23
  102. data/lib/indocker/directives/container_directives/cmd.rb +0 -7
  103. data/lib/indocker/directives/container_directives/depends_on.rb +0 -7
  104. data/lib/indocker/directives/container_directives/env.rb +0 -7
  105. data/lib/indocker/directives/container_directives/env_file.rb +0 -7
  106. data/lib/indocker/directives/container_directives/expose.rb +0 -7
  107. data/lib/indocker/directives/container_directives/from.rb +0 -14
  108. data/lib/indocker/directives/container_directives/network.rb +0 -12
  109. data/lib/indocker/directives/container_directives/ports.rb +0 -15
  110. data/lib/indocker/directives/container_directives/ready.rb +0 -16
  111. data/lib/indocker/directives/container_directives/volume.rb +0 -23
  112. data/lib/indocker/directives/image_directives/base.rb +0 -27
  113. data/lib/indocker/directives/image_directives/cmd.rb +0 -19
  114. data/lib/indocker/directives/image_directives/copy.rb +0 -32
  115. data/lib/indocker/directives/image_directives/docker_cp.rb +0 -20
  116. data/lib/indocker/directives/image_directives/entrypoint.rb +0 -19
  117. data/lib/indocker/directives/image_directives/env.rb +0 -9
  118. data/lib/indocker/directives/image_directives/env_file.rb +0 -19
  119. data/lib/indocker/directives/image_directives/expose.rb +0 -9
  120. data/lib/indocker/directives/image_directives/from.rb +0 -36
  121. data/lib/indocker/directives/image_directives/registry.rb +0 -30
  122. data/lib/indocker/directives/image_directives/run.rb +0 -17
  123. data/lib/indocker/directives/image_directives/workdir.rb +0 -9
  124. data/lib/indocker/directives/partial.rb +0 -21
  125. data/lib/indocker/docker_api/container_config.rb +0 -121
  126. data/lib/indocker/docker_api/docker_api.rb +0 -207
  127. data/lib/indocker/dsl_context.rb +0 -21
  128. data/lib/indocker/envs/env_metadata.rb +0 -39
  129. data/lib/indocker/envs/loader.rb +0 -19
  130. data/lib/indocker/errors.rb +0 -21
  131. data/lib/indocker/git/git_api.rb +0 -32
  132. data/lib/indocker/git/git_helper.rb +0 -34
  133. data/lib/indocker/git/git_service.rb +0 -21
  134. data/lib/indocker/handlers/container_run.rb +0 -20
  135. data/lib/indocker/handlers/container_stop.rb +0 -17
  136. data/lib/indocker/handlers/performable.rb +0 -22
  137. data/lib/indocker/image/image_builder.rb +0 -54
  138. data/lib/indocker/image/image_dependencies_manager.rb +0 -47
  139. data/lib/indocker/image/image_directives_runner.rb +0 -99
  140. data/lib/indocker/image/image_dockerfile_builder.rb +0 -24
  141. data/lib/indocker/image/image_dsl.rb +0 -89
  142. data/lib/indocker/image/image_evaluator.rb +0 -21
  143. data/lib/indocker/image/image_helper.rb +0 -9
  144. data/lib/indocker/image/image_metadata.rb +0 -50
  145. data/lib/indocker/image/image_metadata_factory.rb +0 -31
  146. data/lib/indocker/image/image_metadata_repository.rb +0 -29
  147. data/lib/indocker/networks/network_metadata.rb +0 -9
  148. data/lib/indocker/networks/network_metadata_factory.rb +0 -9
  149. data/lib/indocker/networks/network_metadata_repository.rb +0 -34
  150. data/lib/indocker/partial/partial_metadata.rb +0 -8
  151. data/lib/indocker/partial/partial_metadata_repository.rb +0 -26
  152. data/lib/indocker/registry/registry_api.rb +0 -46
  153. data/lib/indocker/registry/registry_helper.rb +0 -20
  154. data/lib/indocker/registry/registry_service.rb +0 -28
  155. data/lib/indocker/utils/ioc_container.rb +0 -17
  156. data/lib/indocker/utils/logger.rb +0 -62
  157. data/lib/indocker/utils/logger_factory.rb +0 -13
  158. data/lib/indocker/utils/registry_authenticator.rb +0 -19
  159. data/lib/indocker/utils/render_namespace.rb +0 -11
  160. data/lib/indocker/utils/render_util.rb +0 -15
  161. data/lib/indocker/utils/string_utils.rb +0 -11
  162. data/lib/indocker/utils/tar_helper.rb +0 -40
  163. data/lib/indocker/utils/test_logger_factory.rb +0 -9
  164. data/lib/indocker/volumes/volume_metadata.rb +0 -9
  165. data/lib/indocker/volumes/volume_metadata_factory.rb +0 -9
  166. data/lib/indocker/volumes/volume_metadata_repository.rb +0 -34
  167. data/spec/example/.indocker/config.rb +0 -30
  168. data/spec/example/.indocker/images_and_containers.rb +0 -25
  169. data/spec/example/assets/index.css +0 -1
  170. data/spec/example/assets/index.js +0 -1
  171. data/spec/fixtures/spec.env +0 -2
  172. data/spec/indocker/configs/config_factory_spec.rb +0 -18
  173. data/spec/indocker/configs/config_spec.rb +0 -88
  174. data/spec/indocker/container/container_builder_spec.rb +0 -67
  175. data/spec/indocker/container/container_manager_spec.rb +0 -278
  176. data/spec/indocker/docker_api/container_config_spec.rb +0 -64
  177. data/spec/indocker/docker_api/docker_api_spec.rb +0 -112
  178. data/spec/indocker/handlers/container_run_spec.rb +0 -60
  179. data/spec/indocker/image/image_builder_spec.rb +0 -153
  180. data/spec/indocker/image/image_directives_runner_spec.rb +0 -141
  181. data/spec/indocker/image/image_dockerfile_builder_spec.rb +0 -25
  182. data/spec/indocker/image/image_evaluator_spec.rb +0 -85
  183. data/spec/spec_helper.rb +0 -68
@@ -0,0 +1,3 @@
1
+ def list_configurations(configurations_dir)
2
+ Dir[File.join(configurations_dir, '**/*.rb')].map {|c| c.split('/').last.gsub('.rb', '')}
3
+ end
@@ -0,0 +1,10 @@
1
+ FROM ruby:2.5.0
2
+
3
+ RUN dpkg --add-architecture i386 \
4
+ && apt-get update \
5
+ && apt-get install vim curl -y \
6
+ && apt-get clean \
7
+ && rm -rf /var/lib/apt/lists/*
8
+
9
+ RUN mkdir /app
10
+ WORKDIR /app
@@ -0,0 +1,5 @@
1
+ Indocker
2
+ .define_container(:ruby)
3
+ .tags('ruby', 'console=true')
4
+ .image(:ruby)
5
+ .networks(:app_net)
@@ -0,0 +1,3 @@
1
+ Indocker
2
+ .define_image(:ruby)
3
+ .registry(:default)
@@ -0,0 +1,9 @@
1
+ Indocker
2
+ .build_configuration(:dev)
3
+ .use_registry(:dev, as: :default)
4
+ .use_build_server(:local_bs)
5
+ .enabled_containers(
6
+ ruby: {
7
+ servers: [:localhost],
8
+ }
9
+ )
@@ -0,0 +1,8 @@
1
+ Indocker.add_build_server(
2
+ Indocker::BuildServer.new(
3
+ name: :local_bs,
4
+ host: 'localhost',
5
+ user: `whoami`.strip,
6
+ port: 22
7
+ )
8
+ )
@@ -0,0 +1 @@
1
+ Indocker.define_network(:app_net)
@@ -0,0 +1,3 @@
1
+ Indocker.add_registry(
2
+ Indocker::Registries::Local.new(:dev)
3
+ )
@@ -0,0 +1,8 @@
1
+ Indocker.add_server(
2
+ Indocker::Server.new(
3
+ name: :localhost,
4
+ host: 'localhost',
5
+ user: `whoami`.strip,
6
+ port: 22
7
+ )
8
+ )
@@ -0,0 +1,24 @@
1
+ require 'indocker'
2
+
3
+ root_dir = File.join(__dir__, '..', '..')
4
+
5
+ Indocker.set_root_dir(__dir__)
6
+ Indocker.set_deploy_dir(File.join(root_dir, 'tmp', 'deployment'))
7
+
8
+ Indocker.set_dockerignore [
9
+ 'Dockerfile',
10
+ '.DS_Store',
11
+ '**/.DS_Store',
12
+ '**/*.log',
13
+ '.vscode',
14
+ 'tmp',
15
+ ]
16
+
17
+ require_relative 'infrastructure/registries'
18
+ require_relative 'infrastructure/servers'
19
+ require_relative 'infrastructure/build_servers'
20
+ require_relative 'infrastructure/networks'
21
+
22
+ Indocker.set_bounded_contexts_dir(File.join(__dir__, 'bounded_contexts'))
23
+
24
+ require_relative "configurations/#{Indocker.configuration_name}"
@@ -1,28 +1,30 @@
1
- require_relative 'lib/indocker/version'
2
1
 
3
- Gem::Specification.new do |s|
4
- s.name = 'indocker'
5
- s.version = Indocker::VERSION
6
- s.summary = "Indocker"
7
- s.description = "DSL for build, run and deploy docker containers"
8
- s.authors = ["Droid Labs"]
9
- s.email = 'hello@droidlabs.pro'
10
-
11
- s.files = `git ls-files`.split($/)
12
- s.executables = s.files.grep(%r{^bin/}) { |f| File.basename(f) }
13
- s.test_files = s.files.grep(%r{^(spec)/})
2
+ lib = File.expand_path("../lib", __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require "indocker/version"
14
5
 
15
- s.add_development_dependency "byebug"
16
- s.add_development_dependency "rspec"
17
-
18
- s.add_dependency "smart_ioc"
19
- s.add_dependency "docker-api"
20
- s.add_dependency "docker_registry2"
21
- s.add_dependency "thor"
22
- s.add_dependency "colorize"
23
- s.add_dependency "git"
24
- s.add_dependency "byebug" # TODO: remove after release
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "indocker"
8
+ spec.version = Indocker::VERSION
9
+ spec.authors = ["Ruslan Gatiyatov", "Iskander Khaziev"]
10
+ spec.email = ["gvalmon@gmail.com"]
25
11
 
26
- s.homepage = 'https://github.com/droidlabs/indocker'
27
- s.license = 'MIT'
28
- end
12
+ spec.summary = %q{Docker Containers Deployment}
13
+ spec.description = %q{Docker Containers Deployment}
14
+ spec.homepage = "https://github.com/ArtStation/indocker"
15
+ spec.license = "MIT"
16
+
17
+ # Specify which files should be added to the gem when it is released.
18
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
19
+ spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
20
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
21
+ end
22
+ spec.bindir = "exe"
23
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
24
+ spec.require_paths = ["lib"]
25
+
26
+ spec.add_dependency "net-ssh"
27
+ spec.add_development_dependency "bundler", "~> 1.17"
28
+ spec.add_development_dependency "rake", "~> 10.0"
29
+ spec.add_development_dependency "rspec", "~> 3.0"
30
+ end
@@ -1,155 +1,462 @@
1
- require 'smart_ioc'
1
+ require "indocker/version"
2
+ require 'logger'
3
+ $LOAD_PATH << File.join(__dir__, 'indocker')
2
4
 
3
- require 'byebug' # TODO: remove after release
5
+ require_relative 'indocker/colored_string'
4
6
 
5
- SmartIoC.find_package_beans(:indocker, __dir__)
6
- SmartIoC.set_load_proc do |location|
7
- require(location)
8
- end
7
+ module Indocker
8
+ module Repositories
9
+ autoload :Abstract, 'repositories/abstract'
10
+ autoload :Git, 'repositories/git'
11
+ autoload :Local, 'repositories/local'
12
+ autoload :NoSync, 'repositories/no_sync'
13
+ autoload :Clonner, 'repositories/clonner'
14
+ end
9
15
 
10
- require 'indocker/version'
11
-
12
- require 'indocker/image/image_helper'
13
-
14
- require 'indocker/errors'
15
- require 'indocker/cli'
16
- require 'indocker/dsl_context'
17
-
18
- require 'indocker/docker_api/docker_api'
19
- require 'indocker/docker_api/container_config'
20
-
21
- require 'indocker/configs/config'
22
- require 'indocker/configs/config_factory'
23
- require 'indocker/configs/locator'
24
- require 'indocker/configs/config_initializer'
25
-
26
- require 'indocker/utils/logger'
27
- require 'indocker/utils/logger_factory'
28
- require 'indocker/utils/test_logger_factory'
29
- require 'indocker/utils/tar_helper'
30
- require 'indocker/utils/string_utils'
31
- require 'indocker/utils/registry_authenticator'
32
- require 'indocker/utils/render_util'
33
- require 'indocker/utils/render_namespace'
34
-
35
- require 'indocker/handlers/performable'
36
- require 'indocker/handlers/container_run'
37
- require 'indocker/handlers/container_stop'
38
-
39
- require 'indocker/utils/ioc_container'
40
-
41
- require 'indocker/envs/env_metadata'
42
- require 'indocker/envs/loader'
43
-
44
- require 'indocker/registry/registry_helper'
45
- require 'indocker/registry/registry_service'
46
- require 'indocker/registry/registry_api'
47
-
48
- require 'indocker/image/image_metadata'
49
- require 'indocker/image/image_metadata_factory'
50
- require 'indocker/image/image_dsl'
51
- require 'indocker/image/image_metadata_repository'
52
- require 'indocker/image/image_builder'
53
- require 'indocker/image/image_dependencies_manager'
54
- require 'indocker/image/image_evaluator'
55
- require 'indocker/image/image_dockerfile_builder'
56
- require 'indocker/image/image_directives_runner'
57
-
58
- require 'indocker/container/container_metadata'
59
- require 'indocker/container/container_metadata_repository'
60
- require 'indocker/container/container_metadata_factory'
61
- require 'indocker/container/container_manager'
62
- require 'indocker/container/container_evaluator'
63
- require 'indocker/container/container_dsl'
64
- require 'indocker/container/container_builder'
65
- require 'indocker/container/container_directives_runner'
66
-
67
- require 'indocker/partial/partial_metadata'
68
- require 'indocker/partial/partial_metadata_repository'
69
-
70
- require 'indocker/directives/base'
71
- require 'indocker/directives/partial'
72
-
73
- require 'indocker/networks/network_metadata'
74
- require 'indocker/networks/network_metadata_factory'
75
- require 'indocker/networks/network_metadata_repository'
76
-
77
- require 'indocker/volumes/volume_metadata'
78
- require 'indocker/volumes/volume_metadata_factory'
79
- require 'indocker/volumes/volume_metadata_repository'
80
-
81
- require 'indocker/directives/image_directives/base'
82
- require 'indocker/directives/image_directives/cmd'
83
- require 'indocker/directives/image_directives/entrypoint'
84
- require 'indocker/directives/image_directives/env'
85
- require 'indocker/directives/image_directives/copy'
86
- require 'indocker/directives/image_directives/from'
87
- require 'indocker/directives/image_directives/run'
88
- require 'indocker/directives/image_directives/workdir'
89
- require 'indocker/directives/image_directives/expose'
90
- require 'indocker/directives/image_directives/env_file'
91
- require 'indocker/directives/image_directives/docker_cp'
92
- require 'indocker/directives/image_directives/registry'
93
-
94
- require 'indocker/directives/container_directives/base'
95
- require 'indocker/directives/container_directives/from'
96
- require 'indocker/directives/container_directives/network'
97
- require 'indocker/directives/container_directives/ports'
98
- require 'indocker/directives/container_directives/expose'
99
- require 'indocker/directives/container_directives/depends_on'
100
- require 'indocker/directives/container_directives/ready'
101
- require 'indocker/directives/container_directives/cmd'
102
- require 'indocker/directives/container_directives/volume'
103
- require 'indocker/directives/container_directives/env_file'
104
- require 'indocker/directives/container_directives/env'
105
-
106
-
107
- require 'indocker/git/git_helper'
16
+ module Configurations
17
+ autoload :Configuration, 'configurations/configuration'
18
+ autoload :ConfigurationBuilder, 'configurations/configuration_builder'
108
19
 
109
- module Indocker
110
- DOCKERFILE_NAME = 'Dockerfile'
20
+ module Formatters
21
+ autoload :Stdout, 'configurations/formatters/stdout'
22
+ end
23
+ end
24
+
25
+ module Registries
26
+ autoload :Abstract, 'registries/abstract'
27
+ autoload :Local, 'registries/local'
28
+ autoload :Remote, 'registries/remote'
29
+ end
30
+
31
+ module Concerns
32
+ autoload :Inspectable, 'concerns/inspectable'
33
+ end
34
+
35
+ module Images
36
+ autoload :Image, 'images/image'
37
+ autoload :ImageBuilder, 'images/image_builder'
38
+ autoload :ImageCompiler, 'images/image_compiler'
39
+ autoload :TemplateCompiler, 'images/template_compiler'
40
+ autoload :TemplatesCompiler, 'images/templates_compiler'
41
+ end
42
+
43
+ module Containers
44
+ autoload :Container, 'containers/container'
45
+ autoload :ContainerBuilder, 'containers/container_builder'
46
+ autoload :RestartPolicy, 'containers/restart_policy'
47
+ end
48
+
49
+ module Volumes
50
+ autoload :Local, 'volumes/local'
51
+ autoload :External, 'volumes/external'
52
+ autoload :Repository, 'volumes/repository'
53
+ end
54
+
55
+ module EnvFiles
56
+ autoload :Local, 'env_files/local'
57
+ autoload :Remote, 'env_files/remote'
58
+ end
59
+
60
+ module Artifacts
61
+ autoload :Git, 'artifacts/git'
62
+ end
63
+
64
+ autoload :HashMerger, 'hash_merger'
65
+ autoload :BuildServer, 'build_server'
66
+ autoload :Server, 'server'
67
+ autoload :ConfigurationDeployer, 'configuration_deployer'
68
+ autoload :SshSession, 'ssh_session'
69
+ autoload :BuildContextPool, 'build_context_pool'
70
+ autoload :BuildContext, 'build_context'
71
+ autoload :BuildContextHelper, 'build_context_helper'
72
+ autoload :Shell, 'shell'
73
+ autoload :Docker, 'docker'
74
+ autoload :ContextArgs, 'context_args'
75
+ autoload :Network, 'network'
76
+ autoload :ContainerDeployer, 'container_deployer'
77
+ autoload :ServerPool, 'server_pool'
78
+ autoload :DeployContext, 'deploy_context'
79
+ autoload :ContainerHelper, 'container_helper'
80
+ autoload :DockerRunArgs, 'docker_run_args'
81
+ autoload :VolumeHelper, 'volume_helper'
82
+ autoload :NetworkHelper, 'network_helper'
83
+ autoload :Rsync, 'rsync'
84
+ autoload :EnvFileHelper, 'env_file_helper'
85
+ autoload :IndockerHelper, 'indocker_helper'
86
+ autoload :ImagesCompiler, 'images_compiler'
87
+ autoload :ContainerRunner, 'container_runner'
88
+ autoload :SshResultLogger, 'ssh_result_logger'
89
+ autoload :DeploymentProgress, 'deployment_progress'
90
+ autoload :DeploymentChecker, 'deployment_checker'
91
+ autoload :CrontabRedeployRulesBuilder, 'crontab_redeploy_rules_builder'
111
92
 
112
93
  class << self
113
- def define_image(name, &definition)
114
- ioc.image_metadata_repository.put(
115
- ioc.image_metadata_factory.create(name, &definition)
116
- )
94
+ def set_export_command(command)
95
+ @export_command = command
117
96
  end
118
97
 
119
- def define_container(name, attach: false, &definition)
120
- ioc.container_metadata_repository.put(
121
- ioc.container_metadata_factory.create(name, attach: attach, &definition)
122
- )
98
+ def export_command
99
+ @export_command
123
100
  end
124
101
 
125
- def define_partial(name, &definition)
126
- ioc.partial_metadata_repository.put(
127
- Indocker::PartialMetadata.new(name, &definition)
128
- )
102
+ def set_deploy_dir(val)
103
+ @deploy_dir = val
104
+ end
105
+
106
+ def set_root_dir(val)
107
+ @root_dir = val
108
+ end
109
+
110
+ def set_redeploy_crontab_path(val)
111
+ @redeploy_crontab_path = val
112
+ end
113
+
114
+ def redeploy_crontab_path
115
+ @redeploy_crontab_path
116
+ end
117
+
118
+ def deploy_dir
119
+ if @deploy_dir
120
+ @deploy_dir
121
+ else
122
+ raise ArgumentError.new("deploy dir was not specified")
123
+ end
124
+ end
125
+
126
+ def root_dir
127
+ if @root_dir
128
+ File.expand_path(@root_dir)
129
+ else
130
+ raise ArgumentError.new("root dir was not specified")
131
+ end
132
+ end
133
+
134
+ def add_artifact(artifact)
135
+ artifacts.push(artifact)
136
+ end
137
+
138
+ def add_repository(repository)
139
+ if !repository.is_a?(Indocker::Repositories::Abstract)
140
+ raise ArgumentError.new("should be an instance of Indocker::Repositories::Abstract, got: #{repository.inspect}")
141
+ end
142
+
143
+ repositories.push(repository)
144
+ end
145
+
146
+ def add_registry(registry)
147
+ if !registry.is_a?(Indocker::Registries::Abstract)
148
+ raise ArgumentError.new("should be an instance of Indocker::Registries::Abstract, got: #{registry.inspect}")
149
+ end
150
+
151
+ registries.push(registry)
152
+ end
153
+
154
+ def add_server(server)
155
+ if !server.is_a?(Indocker::Server)
156
+ raise ArgumentError.new("should be an instance of Indocker::Server, got: #{server.inspect}")
157
+ end
158
+
159
+ existing = servers.detect {|s| s == server}
160
+
161
+ if existing
162
+ raise ArgumentError.new("server with name #{server.name} was already defined")
163
+ end
164
+
165
+ servers.push(server)
129
166
  end
130
167
 
131
168
  def define_network(name)
132
- ioc.network_metadata_repository.put(
133
- ioc.network_metadata_factory.create(name)
169
+ if networks.detect {|n| n.name == name}
170
+ raise ArgumentError.new("network :#{name} was already defined")
171
+ end
172
+
173
+ networks.push(Indocker::Network.new(name))
174
+ end
175
+
176
+ def container_files
177
+ @container_files || (raise ArgumentError.new("container files were not found. Set bounded contexts dir"))
178
+ end
179
+
180
+ def image_files
181
+ @image_files || (raise ArgumentError.new("image files were not found. Set bounded contexts dir"))
182
+ end
183
+
184
+ def set_bounded_contexts_dir(path)
185
+ @container_files = {}
186
+
187
+ Dir[File.join(path, '**/container.rb')].map do |path|
188
+ name = path.gsub('/container.rb', '').split('/').last.to_sym
189
+ @container_files[name] = path
190
+ end
191
+
192
+ @image_files = {}
193
+
194
+ Dir[File.join(path, '**/image.rb')].map do |path|
195
+ name = path.gsub('/image.rb', '').split('/').last.to_sym
196
+ @image_files[name] = path
197
+ end
198
+ end
199
+
200
+ def define_env_file(env_file)
201
+ if env_files.detect {|ef| ef.name == env_file.name}
202
+ Indocker.logger.error("env file :#{env_file.name} was already defined")
203
+ exit 1
204
+ end
205
+
206
+ env_files.push(env_file)
207
+ end
208
+
209
+ def define_volume(volume)
210
+ if volumes.detect { |v| v.name == volume.name}
211
+ raise ArgumentError.new("volume :#{volume.name} was already defined")
212
+ end
213
+
214
+ volumes.push(volume)
215
+ end
216
+
217
+ def add_build_server(build_server)
218
+ if !build_server.is_a?(Indocker::BuildServer)
219
+ raise ArgumentError.new("should be an instance of Indocker::BuildServer, got: #{build_server.inspect}")
220
+ end
221
+
222
+ existing = build_servers.detect {|s| s == build_server}
223
+
224
+ if existing
225
+ raise ArgumentError.new("build server with name #{build_server.name} was already defined")
226
+ end
227
+
228
+ build_servers.push(build_server)
229
+ end
230
+
231
+ def repositories
232
+ @repositories ||= []
233
+ end
234
+
235
+ def registries
236
+ @registries ||= []
237
+ end
238
+
239
+ def networks
240
+ @networks ||= []
241
+ end
242
+
243
+ def volumes
244
+ @volumes ||= []
245
+ end
246
+
247
+ def servers
248
+ @servers ||= []
249
+ end
250
+
251
+ def artifacts
252
+ @artifacts ||= []
253
+ end
254
+
255
+ def build_servers
256
+ @build_servers ||= []
257
+ end
258
+
259
+ def env_files
260
+ @env_files ||= []
261
+ end
262
+
263
+ def configuration
264
+ @configuration || (raise ArgumentError.new("no configuration provided"))
265
+ end
266
+
267
+ def images
268
+ @images ||= []
269
+ end
270
+
271
+ def containers
272
+ @containers ||= []
273
+ end
274
+
275
+ def build_configuration(name)
276
+ builder = Indocker::Configurations::ConfigurationBuilder.new(
277
+ name: name,
278
+ repositories: repositories,
279
+ registries: registries,
280
+ servers: servers,
281
+ build_servers: build_servers,
282
+ volumes: volumes,
283
+ networks: networks,
284
+ env_files: env_files,
285
+ containers: containers,
134
286
  )
287
+
288
+ @configuration = builder.configuration
289
+ builder
135
290
  end
136
291
 
137
- def define_volume(name)
138
- ioc.volume_metadata_repository.put(
139
- ioc.volume_metadata_factory.create(name)
292
+ def define_image(name)
293
+ path = caller[0].split(':').first
294
+
295
+ if !(path =~ /\/image.rb$/)
296
+ Indocker.logger.error("image :#{name} should be defined in image.rb file")
297
+ exit 1
298
+ end
299
+
300
+ builder = Indocker::Images::ImageBuilder.new(
301
+ name: name,
302
+ configuration: configuration,
303
+ dir: path.split('image.rb').first
140
304
  )
305
+
306
+ images.push(builder.image)
307
+
308
+ builder
141
309
  end
142
310
 
143
- def setup(&block)
144
- ioc.config.set(&block)
311
+ def define_container(name)
312
+ builder = Indocker::Containers::ContainerBuilder.new(
313
+ name: name,
314
+ configuration: configuration,
315
+ )
316
+
317
+ containers.push(builder.container)
318
+ builder
319
+ end
320
+
321
+ def deploy(containers: [], skip_tags: [], tags: [], skip_dependent: false, skip_containers: [], servers: [], skip_build: false, force_restart: false, skip_force_restart: [], auto_confirm: false, require_confirmation: false)
322
+ Indocker::ConfigurationDeployer
323
+ .new(Indocker.logger)
324
+ .run(
325
+ configuration: configuration,
326
+ deploy_containers: containers,
327
+ deploy_tags: tags,
328
+ skip_dependent: skip_dependent,
329
+ skip_containers: skip_containers,
330
+ servers: servers,
331
+ skip_build: skip_build,
332
+ force_restart: force_restart,
333
+ skip_tags: skip_tags,
334
+ skip_force_restart: skip_force_restart,
335
+ auto_confirm: auto_confirm,
336
+ require_confirmation: require_confirmation,
337
+ )
338
+ end
339
+
340
+ def check(servers: [])
341
+ Indocker::DeploymentChecker
342
+ .new(Indocker.logger)
343
+ .run(
344
+ configuration: configuration,
345
+ servers: servers,
346
+ )
347
+ end
348
+
349
+ def launched?(contaner_name, servers: [])
350
+ silent_logger = Logger.new(File.open(File::NULL, "w"))
351
+ Indocker::DeploymentChecker
352
+ .new(silent_logger, silent_logger)
353
+ .launched?(
354
+ contaner_name,
355
+ configuration: configuration,
356
+ servers: servers,
357
+ )
358
+ end
359
+
360
+ def compile(images:, skip_dependent:)
361
+ Indocker::ImagesCompiler
362
+ .new(Indocker.logger)
363
+ .compile(
364
+ configuration: configuration,
365
+ image_list: images,
366
+ skip_dependent: skip_dependent,
367
+ )
368
+ end
369
+
370
+ def run(container_name, force_restart)
371
+ Indocker::ContainerRunner
372
+ .new(Indocker.logger)
373
+ .run(
374
+ configuration: configuration,
375
+ container_name: container_name,
376
+ force_restart: force_restart
377
+ )
378
+ end
379
+
380
+ def global_build_args
381
+ Indocker::ContextArgs.new(nil, configuration.global_build_args, nil)
382
+ end
383
+
384
+ def helper
385
+ Indocker::BuildContextHelper.new(Indocker.configuration, nil)
386
+ end
387
+
388
+ def logger
389
+ @logger ||= begin
390
+ logger = if @log_level == Logger::DEBUG
391
+ Logger.new(STDOUT)
392
+ else
393
+ Logger.new(File.open(File::NULL, "w"))
394
+ end
395
+
396
+ logger.level = @log_level || Logger::INFO
397
+
398
+ logger.formatter = proc do |severity, datetime, progname, msg|
399
+ level = Logger::SEV_LABEL.index(severity)
400
+
401
+ severity = case level
402
+ when Logger::INFO
403
+ severity.green
404
+ when Logger::WARN
405
+ severity.purple
406
+ when Logger::DEBUG
407
+ severity.yellow
408
+ when Logger::ERROR
409
+ severity.red
410
+ when Logger::FATAL
411
+ severity.red
412
+ else
413
+ severity
414
+ end
415
+
416
+ severity = severity.downcase
417
+
418
+ if logger.debug?
419
+ if msg == "{timestamp}"
420
+ ""
421
+ else
422
+ "#{datetime.strftime("%Y/%m/%d %H:%M:%S")} #{severity}: #{msg}\n"
423
+ end
424
+ else
425
+ # Use a nicer logging for not debug
426
+ if msg == "{timestamp}"
427
+ datetime.strftime("%Y/%m/%d %H:%M:%S\n").grey
428
+ else
429
+ " #{severity}: #{msg}\n"
430
+ end
431
+ end
432
+ end
433
+
434
+ logger
435
+ end
436
+ end
437
+
438
+ def set_log_level(level)
439
+ @log_level = level
440
+ end
441
+
442
+ def set_dockerignore(ignore_list)
443
+ @dockerignore = ignore_list
444
+ end
445
+
446
+ def dockerignore
447
+ @dockerignore || []
448
+ end
449
+
450
+ def build_helper(&proc)
451
+ Indocker::BuildContextHelper.class_exec(&proc)
145
452
  end
146
453
 
147
- def cache_dir(dir = nil)
148
- ioc.config.git.cache_dir(Pathname.new(dir))
454
+ def set_configuration_name(name)
455
+ @configuration_name = name
149
456
  end
150
457
 
151
- def build_dir(dir = nil)
152
- ioc.config.build_dir(Pathname.new(dir))
458
+ def configuration_name
459
+ @configuration_name || (raise ArgumentError.new("configuration was not specified"))
153
460
  end
154
461
  end
155
- end
462
+ end