indocker 0.0.6 → 0.1.4

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 (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,122 @@
1
+ class Indocker::Configurations::Configuration
2
+ attr_reader :name
3
+ attr_reader :repositories
4
+ attr_reader :registries
5
+ attr_reader :build_servers
6
+ attr_reader :global_build_args
7
+ attr_reader :images
8
+ attr_reader :containers
9
+ attr_reader :volumes
10
+ attr_reader :networks
11
+ attr_reader :env_files
12
+ attr_reader :artifact_servers
13
+ attr_reader :confirm_deployment
14
+
15
+ def initialize(name)
16
+ @name = name
17
+ @repositories = {}
18
+ @registries = {}
19
+ @env_files = {}
20
+ @build_servers = []
21
+ @images = []
22
+ @volumes = []
23
+ @networks = []
24
+ @containers = []
25
+ @artifact_servers = {}
26
+ @confirm_deployment = false
27
+ end
28
+
29
+ def servers
30
+ @containers.map(&:servers).flatten.uniq
31
+ end
32
+
33
+ def set_artifact_servers(artifact, servers)
34
+ @artifact_servers[artifact] = servers
35
+ end
36
+
37
+ def set_confirm_deployment(flag)
38
+ @confirm_deployment = !!flag
39
+ end
40
+
41
+ def container(name)
42
+ @containers.detect {|c| c.name == name}
43
+ end
44
+
45
+ def set_enabled_containers(list)
46
+ @enabled_containers = list
47
+ end
48
+
49
+ def enabled_containers
50
+ @enabled_containers || (raise ArgumentError.new("enabled container list was not specified in configuration"))
51
+ end
52
+
53
+ def container_enabled?(container)
54
+ @enabled_containers.include?(container.name)
55
+ end
56
+
57
+ def set_repository(alias_name, repository)
58
+ if @repositories.has_key?(alias_name)
59
+ raise ArgumentError.new("alias name :#{alias_name} is already used by repository: #{@repositories[alias_name].inspect}")
60
+ end
61
+
62
+ @repositories[alias_name] = repository
63
+ end
64
+
65
+ def set_registry(alias_name, registry)
66
+ if @registries.has_key?(alias_name)
67
+ raise ArgumentError.new("alias name :#{alias_name} is already used by registry: #{@registries[alias_name].inspect}")
68
+ end
69
+
70
+ @registries[alias_name] = registry
71
+ end
72
+
73
+ def set_env_file(alias_name, env_file)
74
+ if @env_files.has_key?(alias_name)
75
+ raise ArgumentError.new("alias name :#{alias_name} is already used by env file: #{@env_files[alias_name].inspect}")
76
+ end
77
+
78
+ @env_files[alias_name] = env_file
79
+ end
80
+
81
+ def add_build_server(build_server)
82
+ if !@build_servers.include?(build_server)
83
+ @build_servers.push(build_server)
84
+ end
85
+ end
86
+
87
+ def set_global_build_args(hash)
88
+ @global_build_args = hash
89
+ end
90
+
91
+ def add_image(image)
92
+ @images.push(image)
93
+ end
94
+
95
+ def add_container(container)
96
+ @containers.push(container)
97
+ end
98
+
99
+ def next_build_server
100
+ @current_position ||= 0
101
+ build_server = @build_servers[@current_position]
102
+ @current_position += 1
103
+
104
+ if @current_position >= @build_servers.size - 1
105
+ @current_position = 0
106
+ end
107
+
108
+ build_server
109
+ end
110
+
111
+ def build_dir
112
+ "/tmp/#{@name}"
113
+ end
114
+
115
+ def hostname(container, number)
116
+ Indocker::ContainerHelper.hostname(@name, container, number)
117
+ end
118
+
119
+ def get_binding
120
+ binding
121
+ end
122
+ end
@@ -0,0 +1,250 @@
1
+ class Indocker::Configurations::ConfigurationBuilder
2
+ attr_reader :repositories
3
+ attr_reader :registries
4
+ attr_reader :servers
5
+ attr_reader :build_servers
6
+ attr_reader :volumes
7
+ attr_reader :networks
8
+ attr_reader :env_files
9
+ attr_reader :configuration
10
+
11
+ def initialize(repositories:, name:, registries:, servers:, build_servers:, volumes:, networks:, env_files:, containers:)
12
+ @repositories = repositories
13
+ @registries = registries
14
+ @servers = servers
15
+ @volumes = volumes
16
+ @networks = networks
17
+ @build_servers = build_servers
18
+ @env_files = env_files
19
+ @containers = containers
20
+ @configuration = Indocker::Configurations::Configuration.new(name)
21
+ end
22
+
23
+ def use_repository(name, as:)
24
+ repository = @repositories.detect do |repo|
25
+ repo.name == name
26
+ end
27
+
28
+ if !repository
29
+ raise ArgumentError.new("repository :#{name} was not found")
30
+ end
31
+
32
+ @configuration.set_repository(as, repository)
33
+
34
+ self
35
+ end
36
+
37
+ def confirm_deployment
38
+ @configuration.set_confirm_deployment(true)
39
+ self
40
+ end
41
+
42
+ def artifacts(server_artifacts)
43
+ if !server_artifacts.is_a?(Hash)
44
+ Indocker.logger.error("artifacts should be a hash for configuration :#{@configuration.name}")
45
+ exit 1
46
+ end
47
+
48
+ server_artifacts.each do |artifact_name, server_names|
49
+ artifact = Indocker.artifacts.detect do |a|
50
+ a.name == artifact_name
51
+ end
52
+
53
+ if !artifact
54
+ Indocker.logger.error("artifact :#{artifact_name} was not found")
55
+ exit 1
56
+ end
57
+
58
+ if @configuration.servers.empty?
59
+ Indocker.logger.error("artifacts should go after enabled_containers section")
60
+ exit 1
61
+ end
62
+
63
+ servers = @configuration.servers.select do |s|
64
+ server_names.include?(s.name)
65
+ end
66
+
67
+ servers += @configuration.build_servers.select do |s|
68
+ server_names.include?(s.name)
69
+ end
70
+
71
+ extra_servers = server_names - servers.map(&:name)
72
+
73
+ if !extra_servers.empty?
74
+ Indocker.logger.error("invalid servers #{extra_servers.inspect} provided for artifact :#{artifact_name}")
75
+ exit 1
76
+ end
77
+
78
+ @configuration.set_artifact_servers(artifact, servers)
79
+ end
80
+
81
+ self
82
+ end
83
+
84
+ def use_registry(name, as:)
85
+ registry = @registries.detect do |r|
86
+ r.repository_name == name
87
+ end
88
+
89
+ if !registry
90
+ raise ArgumentError.new("registry :#{name} was not found")
91
+ end
92
+
93
+ @configuration.set_registry(as, registry)
94
+
95
+ self
96
+ end
97
+
98
+ def use_env_file(name, as:)
99
+ env_file = @env_files.detect do |ef|
100
+ ef.name == name
101
+ end
102
+
103
+ if !env_file
104
+ raise ArgumentError.new("env_file :#{name} was not found")
105
+ end
106
+
107
+ @configuration.set_env_file(as, env_file)
108
+
109
+ self
110
+ end
111
+
112
+ def use_build_server(name)
113
+ build_server = @build_servers.detect do |bs|
114
+ bs.name == name
115
+ end
116
+
117
+ if !build_server
118
+ raise ArgumentError.new("build_server :#{name} was not found")
119
+ end
120
+
121
+ @configuration.add_build_server(build_server)
122
+
123
+ self
124
+ end
125
+
126
+ def enabled_containers(container_list)
127
+ containers = container_list.keys
128
+ extra_containers = containers - Indocker.container_files.keys
129
+
130
+ if !extra_containers.empty?
131
+ Indocker.logger.error("unrecognised containers: #{extra_containers.inspect} for configuration :#{Indocker.configuration.name}")
132
+ exit 1
133
+ end
134
+
135
+ containers.each do |name|
136
+ path = Indocker.container_files.fetch(name) do
137
+ Indocker.logger.error("invalid container name :#{name} provided in enabled containers for configuration :#{@configuration.name}")
138
+ end
139
+
140
+ require path
141
+ end
142
+
143
+ @configuration.set_enabled_containers(containers.map(&:to_sym))
144
+
145
+ container_list.each do |container_name, opts|
146
+ if !opts.is_a?(Hash)
147
+ Indocker.logger.error("container options should be a Hash for :#{container_name} in configuration :#{@configuration.name}")
148
+ exit 1
149
+ end
150
+
151
+ count = opts[:scale] || 1
152
+
153
+ if count <= 0
154
+ raise ArgumentError.new("count should be > 0")
155
+ end
156
+
157
+ container = @configuration.containers.detect {|c| c.name == container_name}
158
+
159
+ builder = Indocker::Containers::ContainerBuilder
160
+ .new(name: container.name, configuration: @configuration, container: container)
161
+
162
+ builder.scale(count)
163
+
164
+ if opts[:build_args]
165
+ builder.build_args(opts[:build_args])
166
+ end
167
+
168
+ if opts[:start]
169
+ builder.start(opts[:start])
170
+ end
171
+
172
+ if opts[:redeploy_schedule]
173
+ builder.redeploy_schedule(opts[:redeploy_schedule])
174
+ end
175
+
176
+ if !opts[:servers] && !opts[:servers_from]
177
+ Indocker.logger.error("servers or servers_from should be defined for container :#{container_name} in configuration :#{@configuration.name}")
178
+ exit 1
179
+ end
180
+
181
+ servers = recursively_fetch_servers(container_list, container_name)
182
+ builder.servers(*servers)
183
+ end
184
+
185
+ self
186
+ end
187
+
188
+ def scale(opts)
189
+ opts.each do |container_name, count|
190
+ if count <= 0
191
+ raise ArgumentError.new("count should be > 0")
192
+ end
193
+
194
+ container = @containers.detect {|c| c.name == container_name}
195
+
196
+ if !container
197
+ Indocker.logger.error("container :#{name} is not presented in enabled containers for configuration :#{@configuration.name}")
198
+ end
199
+
200
+ Indocker::Containers::ContainerBuilder
201
+ .new(name: container.name, configuration: @configuration, container: container)
202
+ .scale(count)
203
+ end
204
+ end
205
+
206
+ def global_build_args(hash)
207
+ @configuration.set_global_build_args(hash)
208
+ self
209
+ end
210
+
211
+ private
212
+
213
+ def recursively_fetch_servers(container_list, container_name)
214
+ opts = container_list.fetch(container_name) do
215
+ Indocker.logger.error("container :#{container_name} is not presented in enabled containers for configuration :#{@configuration.name}")
216
+ exit 1
217
+ end
218
+
219
+ if !opts[:servers] && !opts[:servers_from]
220
+ Indocker.logger.error("servers or servers_from should be defined for container :#{container_name} in configuration :#{@configuration.name}")
221
+ exit 1
222
+ end
223
+
224
+ servers = if opts[:servers_from]
225
+ if !opts[:servers_from].is_a?(Array)
226
+ Indocker.logger.error("servers_from should be Array[Symbol] for container :#{container_name} in configuration :#{@configuration.name}")
227
+ exit 1
228
+ end
229
+
230
+ opts[:servers_from].map do |name|
231
+ recursively_fetch_servers(container_list, name)
232
+ end.flatten
233
+ else
234
+ []
235
+ end
236
+
237
+ servers += if opts[:servers]
238
+ if !opts[:servers].is_a?(Array)
239
+ Indocker.logger.error("servers should be Array[Symbol] for container :#{container_name} in configuration :#{@configuration.name}")
240
+ exit 1
241
+ end
242
+
243
+ opts[:servers]
244
+ else
245
+ []
246
+ end
247
+
248
+ servers.uniq
249
+ end
250
+ end
@@ -0,0 +1,36 @@
1
+ class Indocker::Configurations::Formatters::Stdout
2
+ def print(configuration)
3
+ c = configuration
4
+ <<~EOS
5
+ Name: #{c.name}
6
+
7
+ Repositories: {
8
+ #{c.repositories.map do |alias_name, repository|
9
+ " #{alias_name}: #{repository.inspect}"
10
+ end.join("\n")}
11
+ }
12
+
13
+ Registries: {
14
+ #{c.registries.map do |alias_name, registry|
15
+ " #{alias_name}: #{registry.inspect}"
16
+ end.join("\n")}
17
+ }
18
+
19
+ Servers: {
20
+ #{c.servers.map do |alias_name, server|
21
+ " #{alias_name}: #{server.inspect}"
22
+ end.join("\n")}
23
+ }
24
+
25
+ Build Servers: [
26
+ #{c.build_servers.map do |build_server|
27
+ " #{build_server.inspect}"
28
+ end.join("\n")}
29
+ ]
30
+
31
+ Tags: #{c.tags.inspect}
32
+
33
+ Global build args: #{c.global_build_args.inspect}
34
+ EOS
35
+ end
36
+ end
@@ -0,0 +1,73 @@
1
+ class Indocker::ContainerDeployer
2
+ attr_reader :server_pool
3
+
4
+ def initialize(configuration:, logger:)
5
+ @configuration = configuration
6
+ @logger = logger
7
+
8
+ @server_pool = Indocker::ServerPool.new(
9
+ configuration: @configuration,
10
+ logger: logger
11
+ )
12
+
13
+ @deployed_containers = Hash.new(false)
14
+ @deployed_servers = {}
15
+ end
16
+
17
+ def deploy(container, force_restart, skip_force_restart, progress)
18
+ return if @deployed_containers[container]
19
+
20
+ container.servers.each do |server|
21
+ progress.start_deploying_container(container, server)
22
+
23
+ exec_proc = if !container.is_daemonized?
24
+ Proc.new do |&block|
25
+ block.call
26
+ end
27
+ else
28
+ Proc.new do |&block|
29
+ Thread.new do
30
+ block.call
31
+ end
32
+ end
33
+ end
34
+
35
+ exec_proc.call do
36
+ deploy_context = @server_pool.get(server)
37
+ @logger.info("{timestamp}")
38
+ @logger.info("Deploying container: #{container.name.to_s.green} to #{server.user}@#{server.host}")
39
+
40
+ command_output = @logger.debug? ? "" : " > /dev/null"
41
+ debug_options = @logger.debug? ? "-d" : ""
42
+
43
+ if force_restart && !skip_force_restart.include?(container.name)
44
+ force_restart_options = force_restart ? "-f" : ""
45
+ end
46
+
47
+ result = deploy_context
48
+ .session
49
+ .exec!(
50
+ "cd #{Indocker::IndockerHelper.indocker_dir} && ./bin/remote/run -C #{Indocker.configuration_name} -c #{container.name} #{debug_options} #{command_output} #{force_restart_options}"
51
+ )
52
+
53
+ Indocker::SshResultLogger
54
+ .new(@logger)
55
+ .log(result, "#{container.name.to_s.green} deployment for server #{server.name} failed")
56
+
57
+ exit 1 if result.exit_code != 0
58
+ @logger.info("Container deployment to #{server.user}@#{server.host} finished: #{container.name.to_s.green}")
59
+
60
+ deploy_context.close_session
61
+ progress.finish_deploying_container(container, server)
62
+ end
63
+ end
64
+
65
+ @deployed_containers[container] = true
66
+ end
67
+
68
+ def close_sessions
69
+ @server_pool.close_sessions
70
+ rescue => e
71
+ @logger.error("error during closing sessions #{e.inspect}")
72
+ end
73
+ end