indocker 0.1.6 → 0.1.11
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.
- checksums.yaml +4 -4
- data/Gemfile +5 -0
- data/Gemfile.lock +10 -4
- data/README.md +13 -2
- data/example/indocker/bin/deploy +19 -13
- data/example/indocker/bounded_contexts/shared/bad_container_build/Dockerfile +3 -0
- data/example/indocker/bounded_contexts/shared/bad_container_build/container.rb +5 -0
- data/example/indocker/bounded_contexts/shared/bad_container_build/image.rb +3 -0
- data/example/indocker/bounded_contexts/shared/bad_container_start/Dockerfile +8 -0
- data/example/indocker/bounded_contexts/shared/bad_container_start/build_context/bin/run +3 -0
- data/example/indocker/bounded_contexts/shared/bad_container_start/container.rb +5 -0
- data/example/indocker/bounded_contexts/shared/bad_container_start/image.rb +3 -0
- data/example/indocker/bounded_contexts/shared/good_container/Dockerfile +4 -0
- data/example/indocker/bounded_contexts/shared/good_container/container.rb +5 -0
- data/example/indocker/bounded_contexts/shared/good_container/image.rb +3 -0
- data/example/indocker/configurations/external.rb +18 -0
- data/example/indocker/infrastructure/build_servers.rb +11 -0
- data/example/indocker/infrastructure/servers.rb +11 -0
- data/example/indocker/setup.rb +1 -1
- data/example/spec/indocker_spec.rb +39 -0
- data/example/spec/spec_helper.rb +39 -0
- data/indocker.gemspec +1 -1
- data/lib/indocker.rb +37 -57
- data/lib/indocker/build_context.rb +13 -12
- data/lib/indocker/build_context_pool.rb +5 -1
- data/lib/indocker/configuration_deployer.rb +125 -93
- data/lib/indocker/container_deployer.rb +17 -7
- data/lib/indocker/context_args.rb +2 -0
- data/lib/indocker/deploy_context.rb +10 -8
- data/lib/indocker/deployment_policy.rb +22 -0
- data/lib/indocker/deployment_progress.rb +7 -2
- data/lib/indocker/images_compiler.rb +1 -1
- data/lib/indocker/logger_factory.rb +37 -0
- data/lib/indocker/server_pool.rb +9 -1
- data/lib/indocker/ssh_session.rb +21 -10
- data/lib/indocker/version.rb +1 -1
- metadata +19 -5
- data/lib/indocker/ssh_result_logger.rb +0 -18
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8625d37ada817f2f83c30f154bd2ed9a104a023e5b554f4c91f3708ed4aa2770
|
4
|
+
data.tar.gz: 24950eb94bd956f7f10ad81da4330bffa78495a4852733a1bec5d0713cce4896
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e50ef7ed88a688bb1119e55b1d1662d6827e5667cc66c61dc85933687e9d4834c785c03c7fb917a2709adf04d909f7e611f8c844741b1532211dddad340dc149
|
7
|
+
data.tar.gz: 1e52f25fff3bf09ddb7f1d097b46ad0e858555892d3b4721a628c8817a16e165694dbf3650e940eb83cb6ac05d8ded47c6359ada9d3cba39d3885ff95e9e88d0
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,15 +1,20 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
indocker (0.1.
|
4
|
+
indocker (0.1.11)
|
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
|
+
method_source (1.0.0)
|
11
13
|
net-ssh (6.1.0)
|
12
|
-
|
14
|
+
pry (0.13.1)
|
15
|
+
coderay (~> 1.1)
|
16
|
+
method_source (~> 1.0)
|
17
|
+
rake (12.3.3)
|
13
18
|
rspec (3.9.0)
|
14
19
|
rspec-core (~> 3.9.0)
|
15
20
|
rspec-expectations (~> 3.9.0)
|
@@ -30,8 +35,9 @@ PLATFORMS
|
|
30
35
|
DEPENDENCIES
|
31
36
|
bundler (~> 1.17)
|
32
37
|
indocker!
|
33
|
-
|
34
|
-
|
38
|
+
pry
|
39
|
+
rake (~> 12.3.3)
|
40
|
+
rspec
|
35
41
|
|
36
42
|
BUNDLED WITH
|
37
43
|
1.17.3
|
data/README.md
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
# InDocker
|
2
2
|
|
3
|
+
[](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
|
-
|
26
|
+
indocker/bin/deploy -C external -c ruby -d
|
16
27
|
```
|
17
28
|
|
18
29
|
## License
|
data/example/indocker/bin/deploy
CHANGED
@@ -8,9 +8,10 @@ configurations = list_configurations(File.expand_path(File.join(__dir__, '../con
|
|
8
8
|
ARGV << '-h' if ARGV.empty?
|
9
9
|
|
10
10
|
options = {
|
11
|
-
skip_build:
|
12
|
-
|
13
|
-
|
11
|
+
skip_build: false,
|
12
|
+
skip_deploy: false,
|
13
|
+
force_restart: false,
|
14
|
+
skip_tags: [],
|
14
15
|
skip_force_restart: [],
|
15
16
|
}
|
16
17
|
|
@@ -61,6 +62,10 @@ OptionParser.new do |opts|
|
|
61
62
|
options[:skip_build] = true
|
62
63
|
end
|
63
64
|
|
65
|
+
opts.on("-b", "--skip-deploy", "Skip image deploy") do |val|
|
66
|
+
options[:skip_deploy] = true
|
67
|
+
end
|
68
|
+
|
64
69
|
opts.on("-y", "--auto-confirm", "Automatically confirm deployment") do |val|
|
65
70
|
options[:auto_confirm] = true
|
66
71
|
end
|
@@ -106,15 +111,16 @@ Indocker.set_configuration_name(options[:configuration])
|
|
106
111
|
require_relative '../setup'
|
107
112
|
|
108
113
|
Indocker.deploy(
|
109
|
-
containers:
|
110
|
-
tags:
|
111
|
-
skip_containers:
|
112
|
-
skip_dependent:
|
113
|
-
servers:
|
114
|
-
skip_build:
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
114
|
+
containers: options[:containers] || [],
|
115
|
+
tags: options[:tags] || [],
|
116
|
+
skip_containers: options[:skip_containers] || [],
|
117
|
+
skip_dependent: !!options[:skip_dependent],
|
118
|
+
servers: options[:servers] || [],
|
119
|
+
skip_build: options[:skip_build],
|
120
|
+
skip_deploy: options[:skip_deploy],
|
121
|
+
force_restart: options[:force_restart],
|
122
|
+
skip_tags: options[:skip_tags] || [],
|
123
|
+
skip_force_restart: options[:skip_force_restart] || [],
|
124
|
+
auto_confirm: !!options[:auto_confirm],
|
119
125
|
require_confirmation: !!options[:require_confirmation],
|
120
126
|
)
|
@@ -0,0 +1,18 @@
|
|
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
|
+
)
|
@@ -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
|
)
|
data/example/indocker/setup.rb
CHANGED
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.describe Indocker do
|
4
|
+
it "has a version number" do
|
5
|
+
expect(Indocker::VERSION).not_to be nil
|
6
|
+
end
|
7
|
+
|
8
|
+
describe "successful deployment" do
|
9
|
+
it "doesn't raise any error" do
|
10
|
+
expect{
|
11
|
+
launch_deployment(containers: [:good_container])
|
12
|
+
}.to_not raise_error
|
13
|
+
end
|
14
|
+
|
15
|
+
it "shows a message about successful deploy" do
|
16
|
+
allow(Indocker.global_logger).to receive(:info).at_least(:once)
|
17
|
+
|
18
|
+
launch_deployment(containers: [:good_container])
|
19
|
+
|
20
|
+
expect(Indocker.global_logger).to have_received(:info).at_least(:once).with(/Deployment finished/)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
describe "failed build" do
|
25
|
+
it "exits with an error" do
|
26
|
+
expect{
|
27
|
+
launch_deployment(containers: [:bad_container_build])
|
28
|
+
}.to raise_error(SystemExit)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
describe "failed start" do
|
33
|
+
it "exits without error" do
|
34
|
+
expect{
|
35
|
+
launch_deployment(containers: [:bad_container_start])
|
36
|
+
}.to_not raise_error(SystemExit)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require "bundler/setup"
|
2
|
+
require "indocker"
|
3
|
+
require "pry"
|
4
|
+
|
5
|
+
RSpec.configure do |config|
|
6
|
+
# Enable flags like --only-failures and --next-failure
|
7
|
+
config.example_status_persistence_file_path = ".rspec_status"
|
8
|
+
|
9
|
+
# Disable RSpec exposing methods globally on `Module` and `main`
|
10
|
+
config.disable_monkey_patching!
|
11
|
+
|
12
|
+
config.expect_with :rspec do |c|
|
13
|
+
c.syntax = :expect
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def launch_deployment(options = {})
|
18
|
+
require_relative '../indocker/bin/utils/configurations'
|
19
|
+
|
20
|
+
Indocker.set_configuration_name(options[:configuration] || "external")
|
21
|
+
require_relative '../indocker/setup'
|
22
|
+
|
23
|
+
Indocker.set_log_level(options[:debug] ? Logger::DEBUG : Logger::INFO)
|
24
|
+
|
25
|
+
Indocker.deploy(
|
26
|
+
containers: options[:containers] || [],
|
27
|
+
tags: options[:tags] || [],
|
28
|
+
skip_containers: options[:skip_containers] || [],
|
29
|
+
skip_dependent: !!options[:skip_dependent],
|
30
|
+
servers: options[:servers] || [],
|
31
|
+
skip_build: options[:skip_build],
|
32
|
+
skip_deploy: options[:skip_deploy],
|
33
|
+
force_restart: options[:force_restart],
|
34
|
+
skip_tags: options[:skip_tags] || [],
|
35
|
+
skip_force_restart: options[:skip_force_restart] || [],
|
36
|
+
auto_confirm: !!options[:auto_confirm],
|
37
|
+
require_confirmation: !!options[:require_confirmation],
|
38
|
+
)
|
39
|
+
end
|
data/indocker.gemspec
CHANGED
@@ -25,6 +25,6 @@ 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", "~>
|
28
|
+
spec.add_development_dependency "rake", "~> 12.3.3"
|
29
29
|
spec.add_development_dependency "rspec", "~> 3.0"
|
30
30
|
end
|
data/lib/indocker.rb
CHANGED
@@ -85,10 +85,11 @@ module Indocker
|
|
85
85
|
autoload :IndockerHelper, 'indocker_helper'
|
86
86
|
autoload :ImagesCompiler, 'images_compiler'
|
87
87
|
autoload :ContainerRunner, 'container_runner'
|
88
|
-
autoload :SshResultLogger, 'ssh_result_logger'
|
89
88
|
autoload :DeploymentProgress, 'deployment_progress'
|
90
89
|
autoload :DeploymentChecker, 'deployment_checker'
|
90
|
+
autoload :DeploymentPolicy, 'deployment_policy'
|
91
91
|
autoload :CrontabRedeployRulesBuilder, 'crontab_redeploy_rules_builder'
|
92
|
+
autoload :LoggerFactory, 'logger_factory'
|
92
93
|
|
93
94
|
class << self
|
94
95
|
def set_export_command(command)
|
@@ -318,22 +319,31 @@ module Indocker
|
|
318
319
|
builder
|
319
320
|
end
|
320
321
|
|
321
|
-
def deploy(containers: [], skip_tags: [], tags: [], skip_dependent: false,
|
322
|
+
def deploy(containers: [], skip_tags: [], tags: [], skip_dependent: false,
|
323
|
+
skip_containers: [], servers: [], skip_build: false, skip_deploy: false,
|
324
|
+
force_restart: false, skip_force_restart: [], auto_confirm: false,
|
325
|
+
require_confirmation: false)
|
326
|
+
|
327
|
+
deployment_policy = Indocker::DeploymentPolicy.new(
|
328
|
+
deploy_containers: containers,
|
329
|
+
deploy_tags: tags,
|
330
|
+
servers: servers,
|
331
|
+
skip_dependent: skip_dependent,
|
332
|
+
skip_containers: skip_containers,
|
333
|
+
skip_build: skip_build,
|
334
|
+
skip_deploy: skip_deploy,
|
335
|
+
skip_tags: skip_tags,
|
336
|
+
force_restart: force_restart,
|
337
|
+
skip_force_restart: skip_force_restart,
|
338
|
+
auto_confirm: auto_confirm,
|
339
|
+
require_confirmation: require_confirmation,
|
340
|
+
)
|
341
|
+
|
322
342
|
Indocker::ConfigurationDeployer
|
323
|
-
.new(Indocker.logger)
|
343
|
+
.new(logger: Indocker.logger, global_logger: Indocker.global_logger)
|
324
344
|
.run(
|
325
|
-
configuration:
|
326
|
-
|
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,
|
345
|
+
configuration: configuration,
|
346
|
+
deployment_policy: deployment_policy
|
337
347
|
)
|
338
348
|
end
|
339
349
|
|
@@ -385,56 +395,26 @@ module Indocker
|
|
385
395
|
Indocker::BuildContextHelper.new(Indocker.configuration, nil)
|
386
396
|
end
|
387
397
|
|
398
|
+
# This logger outputs progress of the deployment
|
399
|
+
# It will not output anything for deployment without debug option
|
388
400
|
def logger
|
389
401
|
@logger ||= begin
|
390
|
-
|
391
|
-
|
402
|
+
logger_stdout = if @log_level == Logger::DEBUG
|
403
|
+
STDOUT
|
392
404
|
else
|
393
|
-
|
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
|
405
|
+
File.open(File::NULL, "w")
|
432
406
|
end
|
433
407
|
|
434
|
-
|
408
|
+
Indocker::LoggerFactory.create(logger_stdout, @log_level)
|
435
409
|
end
|
436
410
|
end
|
437
411
|
|
412
|
+
# Global logger would output data without dependency on how we deploy the progress
|
413
|
+
# Currently it will always output data to stdout
|
414
|
+
def global_logger
|
415
|
+
@global_logger ||= Indocker::LoggerFactory.create(STDOUT, @log_level)
|
416
|
+
end
|
417
|
+
|
438
418
|
def set_log_level(level)
|
439
419
|
@log_level = level
|
440
420
|
end
|