indocker 0.1.6 → 0.1.11
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
+
[![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
|
-
|
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
|