indocker 0.0.6 → 0.1.0

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 (170) 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 +17 -49
  7. data/LICENSE.txt +17 -18
  8. data/README.md +33 -1
  9. data/Rakefile +6 -0
  10. data/bin/console +14 -0
  11. data/bin/setup +8 -0
  12. data/indocker.gemspec +26 -25
  13. data/lib/indocker.rb +429 -130
  14. data/lib/indocker/artifacts/git.rb +25 -0
  15. data/lib/indocker/build_context.rb +87 -0
  16. data/lib/indocker/build_context_helper.rb +109 -0
  17. data/lib/indocker/build_context_pool.rb +36 -0
  18. data/lib/indocker/build_server.rb +2 -0
  19. data/lib/indocker/colored_string.rb +33 -0
  20. data/lib/indocker/concerns/inspectable.rb +12 -0
  21. data/lib/indocker/configuration_deployer.rb +525 -0
  22. data/lib/indocker/configurations/configuration.rb +122 -0
  23. data/lib/indocker/configurations/configuration_builder.rb +250 -0
  24. data/lib/indocker/configurations/formatters/stdout.rb +36 -0
  25. data/lib/indocker/container_deployer.rb +73 -0
  26. data/lib/indocker/container_helper.rb +13 -0
  27. data/lib/indocker/container_runner.rb +23 -0
  28. data/lib/indocker/containers/container.rb +118 -0
  29. data/lib/indocker/containers/container_builder.rb +186 -0
  30. data/lib/indocker/containers/restart_policy.rb +36 -0
  31. data/lib/indocker/context_args.rb +44 -0
  32. data/lib/indocker/crontab_redeploy_rules_builder.rb +54 -0
  33. data/lib/indocker/deploy_context.rb +126 -0
  34. data/lib/indocker/deployment_checker.rb +121 -0
  35. data/lib/indocker/deployment_progress.rb +495 -0
  36. data/lib/indocker/docker.rb +87 -0
  37. data/lib/indocker/docker_run_args.rb +175 -0
  38. data/lib/indocker/env_file_helper.rb +13 -0
  39. data/lib/indocker/env_files/local.rb +8 -0
  40. data/lib/indocker/env_files/remote.rb +8 -0
  41. data/lib/indocker/hash_merger.rb +9 -0
  42. data/lib/indocker/images/image.rb +86 -0
  43. data/lib/indocker/images/image_builder.rb +98 -0
  44. data/lib/indocker/images/image_compiler.rb +68 -0
  45. data/lib/indocker/images/template_compiler.rb +15 -0
  46. data/lib/indocker/images/templates_compiler.rb +28 -0
  47. data/lib/indocker/images_compiler.rb +38 -0
  48. data/lib/indocker/indocker_helper.rb +9 -0
  49. data/lib/indocker/network.rb +12 -0
  50. data/lib/indocker/network_helper.rb +7 -0
  51. data/lib/indocker/registries/abstract.rb +17 -0
  52. data/lib/indocker/registries/local.rb +5 -0
  53. data/lib/indocker/registries/remote.rb +12 -0
  54. data/lib/indocker/repositories/abstract.rb +25 -0
  55. data/lib/indocker/repositories/clonner.rb +15 -0
  56. data/lib/indocker/repositories/git.rb +21 -0
  57. data/lib/indocker/repositories/local.rb +20 -0
  58. data/lib/indocker/repositories/no_sync.rb +20 -0
  59. data/lib/indocker/rsync.rb +52 -0
  60. data/lib/indocker/server.rb +20 -0
  61. data/lib/indocker/server_pool.rb +30 -0
  62. data/lib/indocker/shell.rb +60 -0
  63. data/lib/indocker/ssh_result_logger.rb +18 -0
  64. data/lib/indocker/ssh_session.rb +92 -0
  65. data/lib/indocker/version.rb +1 -1
  66. data/lib/indocker/volume_helper.rb +7 -0
  67. data/lib/indocker/volumes/external.rb +8 -0
  68. data/lib/indocker/volumes/local.rb +9 -0
  69. data/lib/indocker/volumes/repository.rb +9 -0
  70. metadata +88 -230
  71. data/bin/indocker +0 -9
  72. data/lib/indocker/application_initializer.rb +0 -19
  73. data/lib/indocker/cli.rb +0 -27
  74. data/lib/indocker/configs/config.rb +0 -147
  75. data/lib/indocker/configs/config_factory.rb +0 -37
  76. data/lib/indocker/configs/config_initializer.rb +0 -9
  77. data/lib/indocker/configs/locator.rb +0 -23
  78. data/lib/indocker/container/container_builder.rb +0 -29
  79. data/lib/indocker/container/container_directives_runner.rb +0 -54
  80. data/lib/indocker/container/container_dsl.rb +0 -83
  81. data/lib/indocker/container/container_evaluator.rb +0 -13
  82. data/lib/indocker/container/container_inspector.rb +0 -26
  83. data/lib/indocker/container/container_manager.rb +0 -122
  84. data/lib/indocker/container/container_metadata.rb +0 -112
  85. data/lib/indocker/container/container_metadata_factory.rb +0 -30
  86. data/lib/indocker/container/container_metadata_repository.rb +0 -27
  87. data/lib/indocker/directives/base.rb +0 -17
  88. data/lib/indocker/directives/container_directives/base.rb +0 -23
  89. data/lib/indocker/directives/container_directives/cmd.rb +0 -7
  90. data/lib/indocker/directives/container_directives/depends_on.rb +0 -7
  91. data/lib/indocker/directives/container_directives/env.rb +0 -7
  92. data/lib/indocker/directives/container_directives/env_file.rb +0 -7
  93. data/lib/indocker/directives/container_directives/expose.rb +0 -7
  94. data/lib/indocker/directives/container_directives/from.rb +0 -14
  95. data/lib/indocker/directives/container_directives/network.rb +0 -12
  96. data/lib/indocker/directives/container_directives/ports.rb +0 -15
  97. data/lib/indocker/directives/container_directives/ready.rb +0 -16
  98. data/lib/indocker/directives/container_directives/volume.rb +0 -23
  99. data/lib/indocker/directives/image_directives/base.rb +0 -27
  100. data/lib/indocker/directives/image_directives/cmd.rb +0 -19
  101. data/lib/indocker/directives/image_directives/copy.rb +0 -32
  102. data/lib/indocker/directives/image_directives/docker_cp.rb +0 -20
  103. data/lib/indocker/directives/image_directives/entrypoint.rb +0 -19
  104. data/lib/indocker/directives/image_directives/env.rb +0 -9
  105. data/lib/indocker/directives/image_directives/env_file.rb +0 -19
  106. data/lib/indocker/directives/image_directives/expose.rb +0 -9
  107. data/lib/indocker/directives/image_directives/from.rb +0 -36
  108. data/lib/indocker/directives/image_directives/registry.rb +0 -30
  109. data/lib/indocker/directives/image_directives/run.rb +0 -17
  110. data/lib/indocker/directives/image_directives/workdir.rb +0 -9
  111. data/lib/indocker/directives/partial.rb +0 -21
  112. data/lib/indocker/docker_api/container_config.rb +0 -121
  113. data/lib/indocker/docker_api/docker_api.rb +0 -207
  114. data/lib/indocker/dsl_context.rb +0 -21
  115. data/lib/indocker/envs/env_metadata.rb +0 -39
  116. data/lib/indocker/envs/loader.rb +0 -19
  117. data/lib/indocker/errors.rb +0 -21
  118. data/lib/indocker/git/git_api.rb +0 -32
  119. data/lib/indocker/git/git_helper.rb +0 -34
  120. data/lib/indocker/git/git_service.rb +0 -21
  121. data/lib/indocker/handlers/container_run.rb +0 -20
  122. data/lib/indocker/handlers/container_stop.rb +0 -17
  123. data/lib/indocker/handlers/performable.rb +0 -22
  124. data/lib/indocker/image/image_builder.rb +0 -54
  125. data/lib/indocker/image/image_dependencies_manager.rb +0 -47
  126. data/lib/indocker/image/image_directives_runner.rb +0 -99
  127. data/lib/indocker/image/image_dockerfile_builder.rb +0 -24
  128. data/lib/indocker/image/image_dsl.rb +0 -89
  129. data/lib/indocker/image/image_evaluator.rb +0 -21
  130. data/lib/indocker/image/image_helper.rb +0 -9
  131. data/lib/indocker/image/image_metadata.rb +0 -50
  132. data/lib/indocker/image/image_metadata_factory.rb +0 -31
  133. data/lib/indocker/image/image_metadata_repository.rb +0 -29
  134. data/lib/indocker/networks/network_metadata.rb +0 -9
  135. data/lib/indocker/networks/network_metadata_factory.rb +0 -9
  136. data/lib/indocker/networks/network_metadata_repository.rb +0 -34
  137. data/lib/indocker/partial/partial_metadata.rb +0 -8
  138. data/lib/indocker/partial/partial_metadata_repository.rb +0 -26
  139. data/lib/indocker/registry/registry_api.rb +0 -46
  140. data/lib/indocker/registry/registry_helper.rb +0 -20
  141. data/lib/indocker/registry/registry_service.rb +0 -28
  142. data/lib/indocker/utils/ioc_container.rb +0 -17
  143. data/lib/indocker/utils/logger.rb +0 -62
  144. data/lib/indocker/utils/logger_factory.rb +0 -13
  145. data/lib/indocker/utils/registry_authenticator.rb +0 -19
  146. data/lib/indocker/utils/render_namespace.rb +0 -11
  147. data/lib/indocker/utils/render_util.rb +0 -15
  148. data/lib/indocker/utils/string_utils.rb +0 -11
  149. data/lib/indocker/utils/tar_helper.rb +0 -40
  150. data/lib/indocker/utils/test_logger_factory.rb +0 -9
  151. data/lib/indocker/volumes/volume_metadata.rb +0 -9
  152. data/lib/indocker/volumes/volume_metadata_factory.rb +0 -9
  153. data/lib/indocker/volumes/volume_metadata_repository.rb +0 -34
  154. data/spec/example/.indocker/config.rb +0 -30
  155. data/spec/example/.indocker/images_and_containers.rb +0 -25
  156. data/spec/example/assets/index.css +0 -1
  157. data/spec/example/assets/index.js +0 -1
  158. data/spec/fixtures/spec.env +0 -2
  159. data/spec/indocker/configs/config_factory_spec.rb +0 -18
  160. data/spec/indocker/configs/config_spec.rb +0 -88
  161. data/spec/indocker/container/container_builder_spec.rb +0 -67
  162. data/spec/indocker/container/container_manager_spec.rb +0 -278
  163. data/spec/indocker/docker_api/container_config_spec.rb +0 -64
  164. data/spec/indocker/docker_api/docker_api_spec.rb +0 -112
  165. data/spec/indocker/handlers/container_run_spec.rb +0 -60
  166. data/spec/indocker/image/image_builder_spec.rb +0 -153
  167. data/spec/indocker/image/image_directives_runner_spec.rb +0 -141
  168. data/spec/indocker/image/image_dockerfile_builder_spec.rb +0 -25
  169. data/spec/indocker/image/image_evaluator_spec.rb +0 -85
  170. data/spec/spec_helper.rb +0 -68
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 3bbc0745d6bfb718696fac49f13f32af04865472
4
- data.tar.gz: 09c9a04f604edc7ac4416e4c96d1b24aff88cecb
2
+ SHA256:
3
+ metadata.gz: 91f327fcfb82bd30d26d102d302226fbe32dfacd0c269985311b13606eca5d46
4
+ data.tar.gz: a2aca349450f5c5c6ebc383c71b676f36dc3e45ad9cd33ee0fabafc17bc819fd
5
5
  SHA512:
6
- metadata.gz: 5063bd4bef44009433c038cc6f090aa7d89f3fc233e9f8cfee1955013aad4fa7c84c9b5110c071240b5b640ed1cb9bbaa4f6738cb5b5437dc2cf2adb9aaae661
7
- data.tar.gz: 7550ca05ad5e981a452a031de277583edef63a0456c9dca770cd6525239656ed76ced297ec5c831d85f6689c2d8800a28df62a5552d586c6ca7283ee42a63e59
6
+ metadata.gz: 8d3ec5cbb23b2e2e183f87f04d37dd4bd00e847f805d4864d78c88d721871e6b38082b19523321a77f12a4b9839db0e00a5588bc394e240df0369d59386f1b34
7
+ data.tar.gz: 27477f7cffd4bec8b3ad4abf3c60bc93af5779ee88f97440363bf238d2e04160e4509cf2da3960f5c528c77d3c79f92ce85e94b3ccd64b0aca4559dbdc444de9
data/.gitignore CHANGED
@@ -1,3 +1,11 @@
1
+ *.gem
2
+ /.bundle/
3
+ /.yardoc
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
1
10
  .DS_Store
2
- .byebug_history
3
- tmp/*
11
+ .rspec_status
data/.rspec CHANGED
@@ -1 +1,3 @@
1
+ --format documentation
2
+ --color
1
3
  --require spec_helper
data/.travis.yml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ sudo: false
3
+ language: ruby
4
+ cache: bundler
5
+ rvm:
6
+ - 2.3.1
7
+ before_install: gem install bundler -v 1.17.3
data/Gemfile CHANGED
@@ -1,3 +1,6 @@
1
- source 'https://rubygems.org'
1
+ source "https://rubygems.org"
2
2
 
3
- gemspec
3
+ git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
4
+
5
+ # Specify your gem's dependencies in indocker.gemspec
6
+ gemspec
data/Gemfile.lock CHANGED
@@ -1,67 +1,35 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- indocker (0.0.5)
5
- byebug
6
- colorize
7
- docker-api
8
- docker_registry2
9
- git
10
- smart_ioc
11
- thor
4
+ indocker (0.1.0)
12
5
 
13
6
  GEM
14
7
  remote: https://rubygems.org/
15
8
  specs:
16
- byebug (9.1.0)
17
- colorize (0.8.1)
18
9
  diff-lcs (1.3)
19
- docker-api (1.34.0)
20
- excon (>= 0.47.0)
21
- multi_json
22
- docker_registry2 (1.3.0)
23
- rest-client (>= 1.8.0)
24
- domain_name (0.5.20170404)
25
- unf (>= 0.0.5, < 1.0.0)
26
- excon (0.59.0)
27
- git (1.3.0)
28
- http-cookie (1.0.3)
29
- domain_name (~> 0.5)
30
- mime-types (3.1)
31
- mime-types-data (~> 3.2015)
32
- mime-types-data (3.2016.0521)
33
- multi_json (1.12.2)
34
- netrc (0.11.0)
35
- rest-client (2.0.2)
36
- http-cookie (>= 1.0.2, < 2.0)
37
- mime-types (>= 1.16, < 4.0)
38
- netrc (~> 0.8)
39
- rspec (3.7.0)
40
- rspec-core (~> 3.7.0)
41
- rspec-expectations (~> 3.7.0)
42
- rspec-mocks (~> 3.7.0)
43
- rspec-core (3.7.0)
44
- rspec-support (~> 3.7.0)
45
- rspec-expectations (3.7.0)
10
+ rake (10.5.0)
11
+ rspec (3.9.0)
12
+ rspec-core (~> 3.9.0)
13
+ rspec-expectations (~> 3.9.0)
14
+ rspec-mocks (~> 3.9.0)
15
+ rspec-core (3.9.1)
16
+ rspec-support (~> 3.9.1)
17
+ rspec-expectations (3.9.0)
46
18
  diff-lcs (>= 1.2.0, < 2.0)
47
- rspec-support (~> 3.7.0)
48
- rspec-mocks (3.7.0)
19
+ rspec-support (~> 3.9.0)
20
+ rspec-mocks (3.9.1)
49
21
  diff-lcs (>= 1.2.0, < 2.0)
50
- rspec-support (~> 3.7.0)
51
- rspec-support (3.7.0)
52
- smart_ioc (0.2.1)
53
- thor (0.20.0)
54
- unf (0.1.4)
55
- unf_ext
56
- unf_ext (0.0.7.4)
22
+ rspec-support (~> 3.9.0)
23
+ rspec-support (3.9.2)
57
24
 
58
25
  PLATFORMS
59
26
  ruby
60
27
 
61
28
  DEPENDENCIES
62
- byebug
29
+ bundler (~> 1.17)
63
30
  indocker!
64
- rspec
31
+ rake (~> 10.0)
32
+ rspec (~> 3.0)
65
33
 
66
34
  BUNDLED WITH
67
- 1.16.0.pre.3
35
+ 1.17.3
data/LICENSE.txt CHANGED
@@ -1,22 +1,21 @@
1
- Copyright (c) 2016-2017 Droidlabs
1
+ The MIT License (MIT)
2
2
 
3
- MIT License
3
+ Copyright (c) 2020 TODO: Write your name
4
4
 
5
- Permission is hereby granted, free of charge, to any person obtaining
6
- a copy of this software and associated documentation files (the
7
- "Software"), to deal in the Software without restriction, including
8
- without limitation the rights to use, copy, modify, merge, publish,
9
- distribute, sublicense, and/or sell copies of the Software, and to
10
- permit persons to whom the Software is furnished to do so, subject to
11
- the following conditions:
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
12
11
 
13
- The above copyright notice and this permission notice shall be
14
- included in all copies or substantial portions of the Software.
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
15
14
 
16
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
- LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
- OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
- WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.md CHANGED
@@ -1 +1,33 @@
1
- DSL for build, run and deploy docker containers
1
+ # InDocker
2
+
3
+ Docker Containers Deployment
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ ```ruby
10
+ gem 'indocker'
11
+ ```
12
+
13
+ And then execute:
14
+
15
+ $ bundle
16
+
17
+ Or install it yourself as:
18
+
19
+ $ gem install indocker
20
+
21
+ ## Usage
22
+
23
+ TODO: Write usage instructions here
24
+
25
+ ## Development
26
+
27
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
28
+
29
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
30
+
31
+ ## License
32
+
33
+ The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
data/bin/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "indocker"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start(__FILE__)
data/bin/setup ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
data/indocker.gemspec CHANGED
@@ -1,28 +1,29 @@
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_development_dependency "bundler", "~> 1.17"
27
+ spec.add_development_dependency "rake", "~> 10.0"
28
+ spec.add_development_dependency "rspec", "~> 3.0"
29
+ end
data/lib/indocker.rb CHANGED
@@ -1,155 +1,454 @@
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 deploy_dir
111
+ if @deploy_dir
112
+ @deploy_dir
113
+ else
114
+ raise ArgumentError.new("deploy dir was not specified")
115
+ end
116
+ end
117
+
118
+ def root_dir
119
+ if @root_dir
120
+ File.expand_path(@root_dir)
121
+ else
122
+ raise ArgumentError.new("root dir was not specified")
123
+ end
124
+ end
125
+
126
+ def add_artifact(artifact)
127
+ artifacts.push(artifact)
128
+ end
129
+
130
+ def add_repository(repository)
131
+ if !repository.is_a?(Indocker::Repositories::Abstract)
132
+ raise ArgumentError.new("should be an instance of Indocker::Repositories::Abstract, got: #{repository.inspect}")
133
+ end
134
+
135
+ repositories.push(repository)
136
+ end
137
+
138
+ def add_registry(registry)
139
+ if !registry.is_a?(Indocker::Registries::Abstract)
140
+ raise ArgumentError.new("should be an instance of Indocker::Registries::Abstract, got: #{registry.inspect}")
141
+ end
142
+
143
+ registries.push(registry)
144
+ end
145
+
146
+ def add_server(server)
147
+ if !server.is_a?(Indocker::Server)
148
+ raise ArgumentError.new("should be an instance of Indocker::Server, got: #{server.inspect}")
149
+ end
150
+
151
+ existing = servers.detect {|s| s == server}
152
+
153
+ if existing
154
+ raise ArgumentError.new("server with name #{server.name} was already defined")
155
+ end
156
+
157
+ servers.push(server)
129
158
  end
130
159
 
131
160
  def define_network(name)
132
- ioc.network_metadata_repository.put(
133
- ioc.network_metadata_factory.create(name)
161
+ if networks.detect {|n| n.name == name}
162
+ raise ArgumentError.new("network :#{name} was already defined")
163
+ end
164
+
165
+ networks.push(Indocker::Network.new(name))
166
+ end
167
+
168
+ def container_files
169
+ @container_files || (raise ArgumentError.new("container files were not found. Set bounded contexts dir"))
170
+ end
171
+
172
+ def image_files
173
+ @image_files || (raise ArgumentError.new("image files were not found. Set bounded contexts dir"))
174
+ end
175
+
176
+ def set_bounded_contexts_dir(path)
177
+ @container_files = {}
178
+
179
+ Dir[File.join(path, '**/container.rb')].map do |path|
180
+ name = path.gsub('/container.rb', '').split('/').last.to_sym
181
+ @container_files[name] = path
182
+ end
183
+
184
+ @image_files = {}
185
+
186
+ Dir[File.join(path, '**/image.rb')].map do |path|
187
+ name = path.gsub('/image.rb', '').split('/').last.to_sym
188
+ @image_files[name] = path
189
+ end
190
+ end
191
+
192
+ def define_env_file(env_file)
193
+ if env_files.detect {|ef| ef.name == env_file.name}
194
+ Indocker.logger.error("env file :#{env_file.name} was already defined")
195
+ exit 1
196
+ end
197
+
198
+ env_files.push(env_file)
199
+ end
200
+
201
+ def define_volume(volume)
202
+ if volumes.detect { |v| v.name == volume.name}
203
+ raise ArgumentError.new("volume :#{volume.name} was already defined")
204
+ end
205
+
206
+ volumes.push(volume)
207
+ end
208
+
209
+ def add_build_server(build_server)
210
+ if !build_server.is_a?(Indocker::BuildServer)
211
+ raise ArgumentError.new("should be an instance of Indocker::BuildServer, got: #{build_server.inspect}")
212
+ end
213
+
214
+ existing = build_servers.detect {|s| s == build_server}
215
+
216
+ if existing
217
+ raise ArgumentError.new("build server with name #{build_server.name} was already defined")
218
+ end
219
+
220
+ build_servers.push(build_server)
221
+ end
222
+
223
+ def repositories
224
+ @repositories ||= []
225
+ end
226
+
227
+ def registries
228
+ @registries ||= []
229
+ end
230
+
231
+ def networks
232
+ @networks ||= []
233
+ end
234
+
235
+ def volumes
236
+ @volumes ||= []
237
+ end
238
+
239
+ def servers
240
+ @servers ||= []
241
+ end
242
+
243
+ def artifacts
244
+ @artifacts ||= []
245
+ end
246
+
247
+ def build_servers
248
+ @build_servers ||= []
249
+ end
250
+
251
+ def env_files
252
+ @env_files ||= []
253
+ end
254
+
255
+ def configuration
256
+ @configuration || (raise ArgumentError.new("no configuration provided"))
257
+ end
258
+
259
+ def images
260
+ @images ||= []
261
+ end
262
+
263
+ def containers
264
+ @containers ||= []
265
+ end
266
+
267
+ def build_configuration(name)
268
+ builder = Indocker::Configurations::ConfigurationBuilder.new(
269
+ name: name,
270
+ repositories: repositories,
271
+ registries: registries,
272
+ servers: servers,
273
+ build_servers: build_servers,
274
+ volumes: volumes,
275
+ networks: networks,
276
+ env_files: env_files,
277
+ containers: containers,
134
278
  )
279
+
280
+ @configuration = builder.configuration
281
+ builder
135
282
  end
136
283
 
137
- def define_volume(name)
138
- ioc.volume_metadata_repository.put(
139
- ioc.volume_metadata_factory.create(name)
284
+ def define_image(name)
285
+ path = caller[0].split(':').first
286
+
287
+ if !(path =~ /\/image.rb$/)
288
+ Indocker.logger.error("image :#{name} should be defined in image.rb file")
289
+ exit 1
290
+ end
291
+
292
+ builder = Indocker::Images::ImageBuilder.new(
293
+ name: name,
294
+ configuration: configuration,
295
+ dir: path.split('image.rb').first
140
296
  )
297
+
298
+ images.push(builder.image)
299
+
300
+ builder
141
301
  end
142
302
 
143
- def setup(&block)
144
- ioc.config.set(&block)
303
+ def define_container(name)
304
+ builder = Indocker::Containers::ContainerBuilder.new(
305
+ name: name,
306
+ configuration: configuration,
307
+ )
308
+
309
+ containers.push(builder.container)
310
+ builder
145
311
  end
146
312
 
147
- def cache_dir(dir = nil)
148
- ioc.config.git.cache_dir(Pathname.new(dir))
313
+ 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)
314
+ Indocker::ConfigurationDeployer
315
+ .new(Indocker.logger)
316
+ .run(
317
+ configuration: configuration,
318
+ deploy_containers: containers,
319
+ deploy_tags: tags,
320
+ skip_dependent: skip_dependent,
321
+ skip_containers: skip_containers,
322
+ servers: servers,
323
+ skip_build: skip_build,
324
+ force_restart: force_restart,
325
+ skip_tags: skip_tags,
326
+ skip_force_restart: skip_force_restart,
327
+ auto_confirm: auto_confirm,
328
+ require_confirmation: require_confirmation,
329
+ )
149
330
  end
150
331
 
151
- def build_dir(dir = nil)
152
- ioc.config.build_dir(Pathname.new(dir))
332
+ def check(servers: [])
333
+ Indocker::DeploymentChecker
334
+ .new(Indocker.logger)
335
+ .run(
336
+ configuration: configuration,
337
+ servers: servers,
338
+ )
339
+ end
340
+
341
+ def launched?(contaner_name, servers: [])
342
+ silent_logger = Logger.new(File.open(File::NULL, "w"))
343
+ Indocker::DeploymentChecker
344
+ .new(silent_logger, silent_logger)
345
+ .launched?(
346
+ contaner_name,
347
+ configuration: configuration,
348
+ servers: servers,
349
+ )
350
+ end
351
+
352
+ def compile(images:, skip_dependent:)
353
+ Indocker::ImagesCompiler
354
+ .new(Indocker.logger)
355
+ .compile(
356
+ configuration: configuration,
357
+ image_list: images,
358
+ skip_dependent: skip_dependent,
359
+ )
360
+ end
361
+
362
+ def run(container_name, force_restart)
363
+ Indocker::ContainerRunner
364
+ .new(Indocker.logger)
365
+ .run(
366
+ configuration: configuration,
367
+ container_name: container_name,
368
+ force_restart: force_restart
369
+ )
370
+ end
371
+
372
+ def global_build_args
373
+ Indocker::ContextArgs.new(nil, configuration.global_build_args, nil)
374
+ end
375
+
376
+ def helper
377
+ Indocker::BuildContextHelper.new(Indocker.configuration, nil)
378
+ end
379
+
380
+ def logger
381
+ @logger ||= begin
382
+ logger = if @log_level == Logger::DEBUG
383
+ Logger.new(STDOUT)
384
+ else
385
+ Logger.new(File.open(File::NULL, "w"))
386
+ end
387
+
388
+ logger.level = @log_level || Logger::INFO
389
+
390
+ logger.formatter = proc do |severity, datetime, progname, msg|
391
+ level = Logger::SEV_LABEL.index(severity)
392
+
393
+ severity = case level
394
+ when Logger::INFO
395
+ severity.green
396
+ when Logger::WARN
397
+ severity.purple
398
+ when Logger::DEBUG
399
+ severity.yellow
400
+ when Logger::ERROR
401
+ severity.red
402
+ when Logger::FATAL
403
+ severity.red
404
+ else
405
+ severity
406
+ end
407
+
408
+ severity = severity.downcase
409
+
410
+ if logger.debug?
411
+ if msg == "{timestamp}"
412
+ ""
413
+ else
414
+ "#{datetime.strftime("%Y/%m/%d %H:%M:%S")} #{severity}: #{msg}\n"
415
+ end
416
+ else
417
+ # Use a nicer logging for not debug
418
+ if msg == "{timestamp}"
419
+ datetime.strftime("%Y/%m/%d %H:%M:%S\n").grey
420
+ else
421
+ " #{severity}: #{msg}\n"
422
+ end
423
+ end
424
+ end
425
+
426
+ logger
427
+ end
428
+ end
429
+
430
+ def set_log_level(level)
431
+ @log_level = level
432
+ end
433
+
434
+ def set_dockerignore(ignore_list)
435
+ @dockerignore = ignore_list
436
+ end
437
+
438
+ def dockerignore
439
+ @dockerignore || []
440
+ end
441
+
442
+ def build_helper(&proc)
443
+ Indocker::BuildContextHelper.class_exec(&proc)
444
+ end
445
+
446
+ def set_configuration_name(name)
447
+ @configuration_name = name
448
+ end
449
+
450
+ def configuration_name
451
+ @configuration_name || (raise ArgumentError.new("configuration was not specified"))
153
452
  end
154
453
  end
155
- end
454
+ end