Module: Indocker
- Defined in:
- lib/indocker.rb,
lib/indocker/version.rb
Defined Under Namespace
Modules: Artifacts, Concerns, Configurations, Containers, EnvFiles, Images, Launchers, Networks, Registries, Repositories, ServerPools, Volumes
Classes: BuildContext, BuildContextHelper, BuildServer, ContainerDeployer, ContainerHelper, ContextArgs, CrontabRedeployRulesBuilder, DeployContext, DeploymentChecker, DeploymentPolicy, DeploymentProgress, Docker, DockerRunArgs, EnvFileHelper, HashMerger, IndockerHelper, LoggerFactory, Rsync, Server, Shell, SshResultLogger, SshSession
Constant Summary
collapse
- VERSION =
"0.3.6"
Class Method Summary
collapse
-
.add_artifact(artifact) ⇒ Object
-
.add_build_server(build_server) ⇒ Object
-
.add_registry(registry) ⇒ Object
-
.add_repository(repository) ⇒ Object
-
.add_server(server) ⇒ Object
-
.artifacts ⇒ Object
-
.build_configuration(name) ⇒ Object
-
.build_helper(&proc) ⇒ Object
-
.build_servers ⇒ Object
-
.check(servers: []) ⇒ Object
-
.compile(images:, skip_dependent:) ⇒ Object
-
.configuration ⇒ Object
-
.configuration_name ⇒ Object
-
.container_files ⇒ Object
-
.containers ⇒ Object
-
.define_container(name) ⇒ Object
-
.define_env_file(env_file) ⇒ Object
-
.define_image(name) ⇒ Object
-
.define_network(name) ⇒ Object
-
.define_volume(volume) ⇒ Object
-
.deploy(containers: [], skip_tags: [], tags: [], skip_dependent: false, skip_containers: [], servers: [], skip_build: false, skip_deploy: false, force_restart: false, skip_force_restart: [], auto_confirm: false, require_confirmation: false) ⇒ Object
-
.deploy_dir ⇒ Object
-
.dockerignore ⇒ Object
-
.env_files ⇒ Object
-
.export_command ⇒ Object
-
.global_build_args ⇒ Object
-
.global_logger ⇒ Object
Global logger would output data without dependency on how we deploy the progress Currently it will always output data to stdout.
-
.helper ⇒ Object
-
.image_files ⇒ Object
-
.images ⇒ Object
-
.launched?(contaner_name, servers: nil) ⇒ Boolean
-
.logger ⇒ Object
This logger outputs progress of the deployment It will not output anything for deployment without debug option.
-
.networks ⇒ Object
-
.redeploy_crontab_path ⇒ Object
-
.registries ⇒ Object
-
.repositories ⇒ Object
-
.root_dir ⇒ Object
-
.run(container_name, force_restart) ⇒ Object
-
.servers ⇒ Object
-
.set_bounded_contexts_dir(path) ⇒ Object
-
.set_configuration_name(name) ⇒ Object
-
.set_deploy_dir(val) ⇒ Object
-
.set_dockerignore(ignore_list) ⇒ Object
-
.set_export_command(command) ⇒ Object
-
.set_log_level(level) ⇒ Object
-
.set_redeploy_crontab_path(val) ⇒ Object
-
.set_root_dir(val) ⇒ Object
-
.volumes ⇒ Object
Class Method Details
.add_artifact(artifact) ⇒ Object
158
159
160
|
# File 'lib/indocker.rb', line 158
def add_artifact(artifact)
artifacts.push(artifact)
end
|
.add_build_server(build_server) ⇒ Object
241
242
243
244
245
246
247
248
249
250
251
252
253
|
# File 'lib/indocker.rb', line 241
def add_build_server(build_server)
if !build_server.is_a?(Indocker::BuildServer)
raise ArgumentError.new("should be an instance of Indocker::BuildServer, got: #{build_server.inspect}")
end
existing = build_servers.detect {|s| s == build_server}
if existing
raise ArgumentError.new("build server with name #{build_server.name} was already defined")
end
build_servers.push(build_server)
end
|
.add_registry(registry) ⇒ Object
170
171
172
173
174
175
176
|
# File 'lib/indocker.rb', line 170
def add_registry(registry)
if !registry.is_a?(Indocker::Registries::Abstract)
raise ArgumentError.new("should be an instance of Indocker::Registries::Abstract, got: #{registry.inspect}")
end
registries.push(registry)
end
|
.add_repository(repository) ⇒ Object
162
163
164
165
166
167
168
|
# File 'lib/indocker.rb', line 162
def add_repository(repository)
if !repository.is_a?(Indocker::Repositories::Abstract)
raise ArgumentError.new("should be an instance of Indocker::Repositories::Abstract, got: #{repository.inspect}")
end
repositories.push(repository)
end
|
.add_server(server) ⇒ Object
178
179
180
181
182
183
184
185
186
187
188
189
190
|
# File 'lib/indocker.rb', line 178
def add_server(server)
if !server.is_a?(Indocker::Server)
raise ArgumentError.new("should be an instance of Indocker::Server, got: #{server.inspect}")
end
existing = servers.detect {|s| s == server}
if existing
raise ArgumentError.new("server with name #{server.name} was already defined")
end
servers.push(server)
end
|
.artifacts ⇒ Object
275
276
277
|
# File 'lib/indocker.rb', line 275
def artifacts
@artifacts ||= []
end
|
.build_configuration(name) ⇒ Object
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
|
# File 'lib/indocker.rb', line 299
def build_configuration(name)
builder = Indocker::Configurations::ConfigurationBuilder.new(
name: name,
repositories: repositories,
registries: registries,
servers: servers,
build_servers: build_servers,
volumes: volumes,
networks: networks,
env_files: env_files,
containers: containers,
)
@configuration = builder.configuration
builder
end
|
.build_helper(&proc) ⇒ Object
.build_servers ⇒ Object
279
280
281
|
# File 'lib/indocker.rb', line 279
def build_servers
@build_servers ||= []
end
|
.check(servers: []) ⇒ Object
373
374
375
376
377
378
379
380
|
# File 'lib/indocker.rb', line 373
def check(servers: [])
Indocker::DeploymentChecker
.new(Indocker.logger)
.run(
configuration: configuration,
servers: servers,
)
end
|
.compile(images:, skip_dependent:) ⇒ Object
393
394
395
396
397
398
399
400
401
|
# File 'lib/indocker.rb', line 393
def compile(images:, skip_dependent:)
Indocker::Launchers::ImagesCompiler
.new(Indocker.logger)
.compile(
configuration: configuration,
image_list: images,
skip_dependent: skip_dependent,
)
end
|
.configuration ⇒ Object
287
288
289
|
# File 'lib/indocker.rb', line 287
def configuration
@configuration || (raise ArgumentError.new("no configuration provided"))
end
|
.configuration_name ⇒ Object
461
462
463
|
# File 'lib/indocker.rb', line 461
def configuration_name
@configuration_name || (raise ArgumentError.new("configuration was not specified"))
end
|
.container_files ⇒ Object
200
201
202
|
# File 'lib/indocker.rb', line 200
def container_files
@container_files || (raise ArgumentError.new("container files were not found. Set bounded contexts dir"))
end
|
.containers ⇒ Object
295
296
297
|
# File 'lib/indocker.rb', line 295
def containers
@containers ||= []
end
|
.define_container(name) ⇒ Object
335
336
337
338
339
340
341
342
343
|
# File 'lib/indocker.rb', line 335
def define_container(name)
builder = Indocker::Containers::ContainerBuilder.new(
name: name,
configuration: configuration,
)
containers.push(builder.container)
builder
end
|
.define_env_file(env_file) ⇒ Object
224
225
226
227
228
229
230
231
|
# File 'lib/indocker.rb', line 224
def define_env_file(env_file)
if env_files.detect {|ef| ef.name == env_file.name}
Indocker.logger.error("env file :#{env_file.name} was already defined")
exit 1
end
env_files.push(env_file)
end
|
.define_image(name) ⇒ Object
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
|
# File 'lib/indocker.rb', line 316
def define_image(name)
path = caller[0].split(':').first
if !(path =~ /\/image.rb$/)
Indocker.logger.error("image :#{name} should be defined in image.rb file")
exit 1
end
builder = Indocker::Images::ImageBuilder.new(
name: name,
configuration: configuration,
dir: path.split('image.rb').first
)
images.push(builder.image)
builder
end
|
.define_network(name) ⇒ Object
192
193
194
195
196
197
198
|
# File 'lib/indocker.rb', line 192
def define_network(name)
if networks.detect {|n| n.name == name}
raise ArgumentError.new("network :#{name} was already defined")
end
networks.push(Indocker::Networks::Network.new(name))
end
|
.define_volume(volume) ⇒ Object
233
234
235
236
237
238
239
|
# File 'lib/indocker.rb', line 233
def define_volume(volume)
if volumes.detect { |v| v.name == volume.name}
raise ArgumentError.new("volume :#{volume.name} was already defined")
end
volumes.push(volume)
end
|
.deploy(containers: [], skip_tags: [], tags: [], skip_dependent: false, skip_containers: [], servers: [], skip_build: false, skip_deploy: false, force_restart: false, skip_force_restart: [], auto_confirm: false, require_confirmation: false) ⇒ Object
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
|
# File 'lib/indocker.rb', line 345
def deploy(containers: [], skip_tags: [], tags: [], skip_dependent: false,
skip_containers: [], servers: [], skip_build: false, skip_deploy: false,
force_restart: false, skip_force_restart: [], auto_confirm: false,
require_confirmation: false)
deployment_policy = Indocker::DeploymentPolicy.new(
deploy_containers: containers,
deploy_tags: tags,
servers: servers,
skip_dependent: skip_dependent,
skip_containers: skip_containers,
skip_build: skip_build,
skip_deploy: skip_deploy,
skip_tags: skip_tags,
force_restart: force_restart,
skip_force_restart: skip_force_restart,
auto_confirm: auto_confirm,
require_confirmation: require_confirmation,
)
Indocker::Launchers::ConfigurationDeployer
.new(logger: Indocker.logger, global_logger: Indocker.global_logger)
.run(
configuration: configuration,
deployment_policy: deployment_policy
)
end
|
.deploy_dir ⇒ Object
142
143
144
145
146
147
148
|
# File 'lib/indocker.rb', line 142
def deploy_dir
if @deploy_dir
@deploy_dir
else
raise ArgumentError.new("deploy dir was not specified")
end
end
|
.dockerignore ⇒ Object
449
450
451
|
# File 'lib/indocker.rb', line 449
def dockerignore
@dockerignore || []
end
|
.env_files ⇒ Object
283
284
285
|
# File 'lib/indocker.rb', line 283
def env_files
@env_files ||= []
end
|
.export_command ⇒ Object
122
123
124
|
# File 'lib/indocker.rb', line 122
def export_command
@export_command
end
|
.global_build_args ⇒ Object
413
414
415
|
# File 'lib/indocker.rb', line 413
def global_build_args
Indocker::ContextArgs.new(nil, configuration.global_build_args, nil)
end
|
.global_logger ⇒ Object
Global logger would output data without dependency on how we deploy the progress Currently it will always output data to stdout
437
438
439
|
# File 'lib/indocker.rb', line 437
def global_logger
@global_logger ||= Indocker::LoggerFactory.create(STDOUT, @log_level)
end
|
.image_files ⇒ Object
204
205
206
|
# File 'lib/indocker.rb', line 204
def image_files
@image_files || (raise ArgumentError.new("image files were not found. Set bounded contexts dir"))
end
|
.images ⇒ Object
291
292
293
|
# File 'lib/indocker.rb', line 291
def images
@images ||= []
end
|
.launched?(contaner_name, servers: nil) ⇒ Boolean
382
383
384
385
386
387
388
389
390
391
|
# File 'lib/indocker.rb', line 382
def launched?(contaner_name, servers: nil)
silent_logger = Logger.new(File.open(File::NULL, "w"))
Indocker::DeploymentChecker
.new(silent_logger, silent_logger)
.launched?(
contaner_name,
configuration: configuration,
servers: servers,
)
end
|
.logger ⇒ Object
This logger outputs progress of the deployment It will not output anything for deployment without debug option
423
424
425
426
427
428
429
430
431
432
433
|
# File 'lib/indocker.rb', line 423
def logger
@logger ||= begin
logger_stdout = if @log_level == Logger::DEBUG
STDOUT
else
File.open(File::NULL, "w")
end
Indocker::LoggerFactory.create(logger_stdout, @log_level)
end
end
|
.networks ⇒ Object
263
264
265
|
# File 'lib/indocker.rb', line 263
def networks
@networks ||= []
end
|
.redeploy_crontab_path ⇒ Object
138
139
140
|
# File 'lib/indocker.rb', line 138
def redeploy_crontab_path
@redeploy_crontab_path
end
|
.registries ⇒ Object
259
260
261
|
# File 'lib/indocker.rb', line 259
def registries
@registries ||= []
end
|
.repositories ⇒ Object
255
256
257
|
# File 'lib/indocker.rb', line 255
def repositories
@repositories ||= []
end
|
.root_dir ⇒ Object
150
151
152
153
154
155
156
|
# File 'lib/indocker.rb', line 150
def root_dir
if @root_dir
File.expand_path(@root_dir)
else
raise ArgumentError.new("root dir was not specified")
end
end
|
.run(container_name, force_restart) ⇒ Object
403
404
405
406
407
408
409
410
411
|
# File 'lib/indocker.rb', line 403
def run(container_name, force_restart)
Indocker::Launchers::ContainerRunner
.new(Indocker.logger)
.run(
configuration: configuration,
container_name: container_name,
force_restart: force_restart
)
end
|
.servers ⇒ Object
271
272
273
|
# File 'lib/indocker.rb', line 271
def servers
@servers ||= []
end
|
.set_bounded_contexts_dir(path) ⇒ Object
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
|
# File 'lib/indocker.rb', line 208
def set_bounded_contexts_dir(path)
@container_files = {}
Dir[File.join(path, '**/container.rb')].map do |path|
name = path.gsub('/container.rb', '').split('/').last.to_sym
@container_files[name] = path
end
@image_files = {}
Dir[File.join(path, '**/image.rb')].map do |path|
name = path.gsub('/image.rb', '').split('/').last.to_sym
@image_files[name] = path
end
end
|
.set_configuration_name(name) ⇒ Object
457
458
459
|
# File 'lib/indocker.rb', line 457
def set_configuration_name(name)
@configuration_name = name
end
|
.set_deploy_dir(val) ⇒ Object
126
127
128
|
# File 'lib/indocker.rb', line 126
def set_deploy_dir(val)
@deploy_dir = val
end
|
.set_dockerignore(ignore_list) ⇒ Object
445
446
447
|
# File 'lib/indocker.rb', line 445
def set_dockerignore(ignore_list)
@dockerignore = ignore_list
end
|
.set_export_command(command) ⇒ Object
118
119
120
|
# File 'lib/indocker.rb', line 118
def set_export_command(command)
@export_command = command
end
|
.set_log_level(level) ⇒ Object
441
442
443
|
# File 'lib/indocker.rb', line 441
def set_log_level(level)
@log_level = level
end
|
.set_redeploy_crontab_path(val) ⇒ Object
134
135
136
|
# File 'lib/indocker.rb', line 134
def set_redeploy_crontab_path(val)
@redeploy_crontab_path = val
end
|
.set_root_dir(val) ⇒ Object
130
131
132
|
# File 'lib/indocker.rb', line 130
def set_root_dir(val)
@root_dir = val
end
|
.volumes ⇒ Object
267
268
269
|
# File 'lib/indocker.rb', line 267
def volumes
@volumes ||= []
end
|