rake_docker 2.18.0.pre.3 → 2.18.0.pre.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.
- checksums.yaml +4 -4
- data/Gemfile +2 -0
- data/Gemfile.lock +31 -4
- data/Rakefile +67 -45
- data/bin/console +4 -3
- data/lib/rake_docker/authentication/ecr.rb +43 -18
- data/lib/rake_docker/authentication.rb +3 -1
- data/lib/rake_docker/container.rb +79 -56
- data/lib/rake_docker/exceptions.rb +3 -1
- data/lib/rake_docker/kernel_extensions.rb +2 -0
- data/lib/rake_docker/output.rb +82 -25
- data/lib/rake_docker/task_sets/container.rb +3 -1
- data/lib/rake_docker/task_sets/image.rb +2 -0
- data/lib/rake_docker/task_sets.rb +2 -0
- data/lib/rake_docker/tasks/build.rb +23 -16
- data/lib/rake_docker/tasks/clean.rb +6 -4
- data/lib/rake_docker/tasks/destroy.rb +9 -6
- data/lib/rake_docker/tasks/prepare.rb +22 -10
- data/lib/rake_docker/tasks/provision.rb +14 -11
- data/lib/rake_docker/tasks/publish.rb +4 -2
- data/lib/rake_docker/tasks/push.rb +8 -6
- data/lib/rake_docker/tasks/tag.rb +11 -9
- data/lib/rake_docker/tasks.rb +2 -0
- data/lib/rake_docker/version.rb +3 -1
- data/lib/rake_docker.rb +2 -0
- data/rake_docker.gemspec +61 -0
- metadata +65 -21
data/lib/rake_docker/output.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'json'
|
2
4
|
require 'colored2'
|
3
5
|
|
@@ -5,45 +7,100 @@ module RakeDocker
|
|
5
7
|
module Output
|
6
8
|
def self.parse(chunk)
|
7
9
|
chunk.each_line do |line|
|
8
|
-
yield
|
10
|
+
yield parse_line(line)
|
9
11
|
end
|
10
12
|
end
|
11
13
|
|
12
14
|
def self.parse_line(line)
|
13
|
-
|
14
|
-
|
15
|
-
rescue JSON::ParserError
|
16
|
-
return line
|
17
|
-
end
|
18
|
-
|
19
|
-
# Skip progress and aux as they are covered by other status messages
|
20
|
-
return '' if json['progress'] && json['status']
|
21
|
-
return '' if json['aux']
|
15
|
+
json, error = try_parse_json(line)
|
16
|
+
return to_unparseable(line) if error
|
22
17
|
|
23
|
-
|
24
|
-
return
|
18
|
+
return to_skipped(json) if line_skippable?(json)
|
19
|
+
return to_error(json) if line_includes_error?(json)
|
20
|
+
return to_stream(json) if line_includes_stream?(json)
|
21
|
+
return to_status_with_id(json) if line_includes_status_and_id?(json)
|
22
|
+
return to_status(json) if line_includes_status?(json)
|
25
23
|
|
26
|
-
|
27
|
-
|
28
|
-
if json['status']
|
29
|
-
if json['id']
|
30
|
-
return json['id'] + ': ' + json['status'] + "\n"
|
31
|
-
else
|
32
|
-
return json['status'] + "\n"
|
33
|
-
end
|
34
|
-
end
|
24
|
+
to_fallthrough(line)
|
25
|
+
end
|
35
26
|
|
36
|
-
|
27
|
+
def self.try_parse_json(line)
|
28
|
+
[JSON.parse(line.strip), false]
|
29
|
+
rescue JSON::ParserError
|
30
|
+
[nil, true]
|
37
31
|
end
|
38
32
|
|
39
33
|
def self.print(chunk)
|
40
|
-
|
41
|
-
if
|
42
|
-
$stdout.print text.red
|
34
|
+
parse(chunk) do |text, error|
|
35
|
+
if error
|
36
|
+
$stdout.print "#{text.red}\n"
|
43
37
|
raise text
|
44
38
|
end
|
45
39
|
$stdout.print text unless text.empty?
|
46
40
|
end
|
47
41
|
end
|
42
|
+
|
43
|
+
def self.line_includes_id?(json)
|
44
|
+
json['id']
|
45
|
+
end
|
46
|
+
|
47
|
+
def self.line_includes_status?(json)
|
48
|
+
json['status']
|
49
|
+
end
|
50
|
+
|
51
|
+
def self.line_includes_progress?(json)
|
52
|
+
json['progress']
|
53
|
+
end
|
54
|
+
|
55
|
+
def self.line_includes_aux?(json)
|
56
|
+
json['aux']
|
57
|
+
end
|
58
|
+
|
59
|
+
def self.line_includes_error?(json)
|
60
|
+
json['error']
|
61
|
+
end
|
62
|
+
|
63
|
+
def self.line_includes_stream?(json)
|
64
|
+
json['stream']
|
65
|
+
end
|
66
|
+
|
67
|
+
def self.line_includes_status_and_id?(json)
|
68
|
+
line_includes_status?(json) &&
|
69
|
+
line_includes_id?(json)
|
70
|
+
end
|
71
|
+
|
72
|
+
def self.line_skippable?(json)
|
73
|
+
(line_includes_status?(json) &&
|
74
|
+
line_includes_progress?(json)) ||
|
75
|
+
line_includes_aux?(json)
|
76
|
+
end
|
77
|
+
|
78
|
+
def self.to_unparseable(line)
|
79
|
+
[line, false]
|
80
|
+
end
|
81
|
+
|
82
|
+
def self.to_skipped(_)
|
83
|
+
['', false]
|
84
|
+
end
|
85
|
+
|
86
|
+
def self.to_status_with_id(json)
|
87
|
+
["#{json['id']}: #{json['status']}\n", false]
|
88
|
+
end
|
89
|
+
|
90
|
+
def self.to_status(json)
|
91
|
+
["#{json['status']}\n", false]
|
92
|
+
end
|
93
|
+
|
94
|
+
def self.to_stream(json)
|
95
|
+
[json['stream'], false]
|
96
|
+
end
|
97
|
+
|
98
|
+
def self.to_error(json)
|
99
|
+
[json['error'], true]
|
100
|
+
end
|
101
|
+
|
102
|
+
def self.to_fallthrough(line)
|
103
|
+
[line, false]
|
104
|
+
end
|
48
105
|
end
|
49
106
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'rake_factory'
|
2
4
|
require 'docker'
|
3
5
|
|
@@ -17,7 +19,7 @@ module RakeDocker
|
|
17
19
|
parameter :ready_check
|
18
20
|
|
19
21
|
parameter :reporter,
|
20
|
-
|
22
|
+
default: RakeDocker::Container::PrintingReporter.new
|
21
23
|
|
22
24
|
parameter :provision_task_name, default: :provision
|
23
25
|
parameter :destroy_task_name, default: :destroy
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'rake_factory'
|
2
4
|
require 'docker'
|
3
5
|
|
@@ -7,39 +9,44 @@ module RakeDocker
|
|
7
9
|
module Tasks
|
8
10
|
class Build < RakeFactory::Task
|
9
11
|
default_name :build
|
10
|
-
default_description
|
12
|
+
default_description(RakeFactory::DynamicValue.new do |t|
|
11
13
|
"Build #{t.image_name} image"
|
12
|
-
|
13
|
-
default_prerequisites
|
14
|
-
t.prepare_task_name
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
14
|
+
end)
|
15
|
+
default_prerequisites(RakeFactory::DynamicValue.new do |t|
|
16
|
+
if t.prepare_task_name
|
17
|
+
[Rake.application.current_scope
|
18
|
+
.path_with_task_name(t.prepare_task_name)]
|
19
|
+
else
|
20
|
+
[]
|
21
|
+
end
|
22
|
+
end)
|
19
23
|
|
20
|
-
parameter :image_name, :
|
21
|
-
parameter :repository_name, :
|
24
|
+
parameter :image_name, required: true
|
25
|
+
parameter :repository_name, required: true
|
22
26
|
|
23
27
|
parameter :credentials
|
24
28
|
|
25
29
|
parameter :build_args
|
26
30
|
parameter :platform
|
27
31
|
|
28
|
-
parameter :work_directory, :
|
32
|
+
parameter :work_directory, required: true
|
29
33
|
|
30
34
|
parameter :prepare_task_name, default: :prepare
|
31
35
|
|
32
36
|
action do |t|
|
33
37
|
Docker.authenticate!(t.credentials) if t.credentials
|
34
38
|
|
35
|
-
options = {t: t.repository_name}
|
36
|
-
|
37
|
-
|
39
|
+
options = { t: t.repository_name }
|
40
|
+
if t.build_args
|
41
|
+
options = options.merge(
|
42
|
+
buildargs: JSON.generate(t.build_args)
|
43
|
+
)
|
44
|
+
end
|
38
45
|
options = options.merge(platform: t.platform) if t.platform
|
39
46
|
|
40
47
|
Docker::Image.build_from_dir(
|
41
|
-
|
42
|
-
|
48
|
+
File.join(t.work_directory, t.image_name),
|
49
|
+
options
|
43
50
|
) do |chunk|
|
44
51
|
Output.print chunk
|
45
52
|
end
|
@@ -1,15 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'rake_factory'
|
2
4
|
|
3
5
|
module RakeDocker
|
4
6
|
module Tasks
|
5
7
|
class Clean < RakeFactory::Task
|
6
8
|
default_name :clean
|
7
|
-
default_description
|
9
|
+
default_description(RakeFactory::DynamicValue.new do |t|
|
8
10
|
"Clean #{t.image_name} image directory"
|
9
|
-
|
11
|
+
end)
|
10
12
|
|
11
|
-
parameter :image_name, :
|
12
|
-
parameter :work_directory, :
|
13
|
+
parameter :image_name, required: true
|
14
|
+
parameter :work_directory, required: true
|
13
15
|
|
14
16
|
action do |t|
|
15
17
|
rm_rf File.join(t.work_directory, t.image_name)
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'rake_factory'
|
2
4
|
|
3
5
|
require_relative '../container'
|
@@ -6,19 +8,20 @@ module RakeDocker
|
|
6
8
|
module Tasks
|
7
9
|
class Destroy < RakeFactory::Task
|
8
10
|
default_name :destroy
|
9
|
-
default_description
|
10
|
-
"Destroy #{t.container_name ? "#{t.container_name} " :
|
11
|
-
|
11
|
+
default_description(RakeFactory::DynamicValue.new do |t|
|
12
|
+
"Destroy #{t.container_name ? "#{t.container_name} " : ''}container."
|
13
|
+
end)
|
12
14
|
|
13
|
-
parameter :container_name, :
|
15
|
+
parameter :container_name, required: true
|
14
16
|
|
15
17
|
parameter :reporter, default: Container::PrintingReporter.new
|
16
18
|
|
17
19
|
action do |t|
|
18
20
|
puts "Destroying #{t.container_name} container"
|
19
21
|
destroyer = Container::Destroyer.new(
|
20
|
-
|
21
|
-
|
22
|
+
t.container_name,
|
23
|
+
reporter: t.reporter
|
24
|
+
)
|
22
25
|
destroyer.execute
|
23
26
|
end
|
24
27
|
end
|
@@ -1,29 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'rake_factory'
|
2
4
|
|
3
5
|
module RakeDocker
|
4
6
|
module Tasks
|
5
7
|
class Prepare < RakeFactory::Task
|
6
8
|
default_name :prepare
|
7
|
-
default_description
|
9
|
+
default_description(RakeFactory::DynamicValue.new do |t|
|
8
10
|
"Prepare for build of #{t.image_name} image"
|
9
|
-
|
11
|
+
end)
|
10
12
|
|
11
|
-
parameter :image_name, :
|
13
|
+
parameter :image_name, required: true
|
12
14
|
|
13
|
-
parameter :work_directory, :
|
15
|
+
parameter :work_directory, required: true
|
14
16
|
|
15
|
-
parameter :copy_spec, :
|
16
|
-
parameter :create_spec, :
|
17
|
+
parameter :copy_spec, default: []
|
18
|
+
parameter :create_spec, default: []
|
17
19
|
|
18
20
|
action do |t|
|
19
21
|
image_directory = File.join(t.work_directory, t.image_name)
|
20
22
|
FileUtils.mkdir_p image_directory
|
21
23
|
|
22
24
|
t.copy_spec.each do |entry|
|
23
|
-
from = entry
|
24
|
-
to = entry
|
25
|
-
File.join(image_directory, entry[:to]) :
|
26
|
-
image_directory
|
25
|
+
from = resolve_from(entry)
|
26
|
+
to = resolve_to(entry, image_directory)
|
27
27
|
|
28
28
|
if File.directory?(from)
|
29
29
|
FileUtils.mkdir_p(to)
|
@@ -45,6 +45,18 @@ module RakeDocker
|
|
45
45
|
end
|
46
46
|
end
|
47
47
|
end
|
48
|
+
|
49
|
+
def resolve_from(entry)
|
50
|
+
entry.is_a?(Hash) ? entry[:from] : entry
|
51
|
+
end
|
52
|
+
|
53
|
+
def resolve_to(entry, image_directory)
|
54
|
+
if entry.is_a?(Hash)
|
55
|
+
File.join(image_directory, entry[:to])
|
56
|
+
else
|
57
|
+
image_directory
|
58
|
+
end
|
59
|
+
end
|
48
60
|
end
|
49
61
|
end
|
50
62
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'rake_factory'
|
2
4
|
|
3
5
|
require_relative '../container'
|
@@ -6,12 +8,12 @@ module RakeDocker
|
|
6
8
|
module Tasks
|
7
9
|
class Provision < RakeFactory::Task
|
8
10
|
default_name :provision
|
9
|
-
default_description
|
10
|
-
"Provision #{t.container_name ? "#{t.container_name} " :
|
11
|
-
|
11
|
+
default_description(RakeFactory::DynamicValue.new do |t|
|
12
|
+
"Provision #{t.container_name ? "#{t.container_name} " : ''}container."
|
13
|
+
end)
|
12
14
|
|
13
|
-
parameter :container_name, :
|
14
|
-
parameter :image, :
|
15
|
+
parameter :container_name, required: true
|
16
|
+
parameter :image, required: true
|
15
17
|
parameter :ports
|
16
18
|
parameter :environment
|
17
19
|
|
@@ -22,12 +24,13 @@ module RakeDocker
|
|
22
24
|
action do |t|
|
23
25
|
puts "Provisioning #{t.container_name} container"
|
24
26
|
provisioner = Container::Provisioner.new(
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
27
|
+
t.container_name,
|
28
|
+
t.image,
|
29
|
+
ports: t.ports,
|
30
|
+
environment: t.environment,
|
31
|
+
ready?: t.ready_check,
|
32
|
+
reporter: t.reporter
|
33
|
+
)
|
31
34
|
provisioner.execute
|
32
35
|
end
|
33
36
|
end
|
@@ -1,12 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'rake_factory'
|
2
4
|
|
3
5
|
module RakeDocker
|
4
6
|
module Tasks
|
5
7
|
class Publish < RakeFactory::Task
|
6
8
|
default_name :publish
|
7
|
-
default_description
|
9
|
+
default_description(RakeFactory::DynamicValue.new do |t|
|
8
10
|
"Publish #{t.image_name} image"
|
9
|
-
|
11
|
+
end)
|
10
12
|
|
11
13
|
parameter :image_name
|
12
14
|
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'rake_factory'
|
2
4
|
require 'docker'
|
3
5
|
|
@@ -5,15 +7,15 @@ module RakeDocker
|
|
5
7
|
module Tasks
|
6
8
|
class Push < RakeFactory::Task
|
7
9
|
default_name :push
|
8
|
-
default_description
|
10
|
+
default_description(RakeFactory::DynamicValue.new do |t|
|
9
11
|
"Push #{t.image_name} image to repository"
|
10
|
-
|
12
|
+
end)
|
11
13
|
|
12
|
-
parameter :image_name, :
|
13
|
-
parameter :repository_url, :
|
14
|
+
parameter :image_name, required: true
|
15
|
+
parameter :repository_url, required: true
|
14
16
|
|
15
17
|
parameter :credentials
|
16
|
-
parameter :tags, :
|
18
|
+
parameter :tags, required: true
|
17
19
|
|
18
20
|
action do |t|
|
19
21
|
Docker.authenticate!(t.credentials) if t.credentials
|
@@ -21,7 +23,7 @@ module RakeDocker
|
|
21
23
|
images = Docker::Image.all(filter: t.repository_url)
|
22
24
|
if images.empty?
|
23
25
|
raise ImageNotFound,
|
24
|
-
|
26
|
+
"No image found for repository: '#{t.repository_url}'"
|
25
27
|
end
|
26
28
|
|
27
29
|
image = images.first
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'rake_factory'
|
2
4
|
require 'docker'
|
3
5
|
|
@@ -5,29 +7,29 @@ module RakeDocker
|
|
5
7
|
module Tasks
|
6
8
|
class Tag < RakeFactory::Task
|
7
9
|
default_name :tag
|
8
|
-
default_description
|
10
|
+
default_description(RakeFactory::DynamicValue.new do |t|
|
9
11
|
"Tag #{t.image_name} image for repository"
|
10
|
-
|
12
|
+
end)
|
11
13
|
|
12
|
-
parameter :image_name, :
|
13
|
-
parameter :repository_name, :
|
14
|
-
parameter :repository_url, :
|
14
|
+
parameter :image_name, required: true
|
15
|
+
parameter :repository_name, required: true
|
16
|
+
parameter :repository_url, required: true
|
15
17
|
|
16
|
-
parameter :tags, :
|
18
|
+
parameter :tags, required: true
|
17
19
|
|
18
20
|
action do |t|
|
19
21
|
images = Docker::Image.all(filter: t.repository_name)
|
20
22
|
if images.empty?
|
21
23
|
raise ImageNotFound,
|
22
|
-
|
24
|
+
"No image found with name: '#{t.image_name}'"
|
23
25
|
end
|
24
26
|
|
25
27
|
image = images.first
|
26
28
|
|
27
29
|
t.tags.each do |tag|
|
28
30
|
image.tag(repo: t.repository_url,
|
29
|
-
|
30
|
-
|
31
|
+
tag: tag,
|
32
|
+
force: true)
|
31
33
|
end
|
32
34
|
end
|
33
35
|
end
|
data/lib/rake_docker/tasks.rb
CHANGED
data/lib/rake_docker/version.rb
CHANGED
data/lib/rake_docker.rb
CHANGED
data/rake_docker.gemspec
ADDED
@@ -0,0 +1,61 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
lib = File.expand_path('lib', __dir__)
|
4
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
5
|
+
require 'rake_docker/version'
|
6
|
+
|
7
|
+
files = %w[
|
8
|
+
bin
|
9
|
+
lib
|
10
|
+
CODE_OF_CONDUCT.md
|
11
|
+
rake_docker.gemspec
|
12
|
+
Gemfile
|
13
|
+
LICENSE.txt
|
14
|
+
Rakefile
|
15
|
+
README.md
|
16
|
+
]
|
17
|
+
|
18
|
+
Gem::Specification.new do |spec|
|
19
|
+
spec.name = 'rake_docker'
|
20
|
+
spec.version = RakeDocker::VERSION
|
21
|
+
spec.authors = ['InfraBlocks Maintainers']
|
22
|
+
spec.email = ['maintainers@infrablocks.io']
|
23
|
+
|
24
|
+
spec.summary = 'Rake tasks for managing images and containers.'
|
25
|
+
spec.description = 'Allows building, tagging and pushing images and '\
|
26
|
+
'creating, starting, stopping and removing containers '\
|
27
|
+
'from within rake tasks.'
|
28
|
+
spec.homepage = 'https://github.com/infrablocks/rake_docker'
|
29
|
+
spec.license = 'MIT'
|
30
|
+
|
31
|
+
spec.files = `git ls-files -z`.split("\x0").select do |f|
|
32
|
+
f.match(/^(#{files.map { |g| Regexp.escape(g) }.join('|')})/)
|
33
|
+
end
|
34
|
+
spec.bindir = 'exe'
|
35
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
36
|
+
spec.require_paths = ['lib']
|
37
|
+
|
38
|
+
spec.required_ruby_version = '>= 2.7'
|
39
|
+
|
40
|
+
spec.add_dependency 'aws-sdk-ecr', '~> 1.2'
|
41
|
+
spec.add_dependency 'colored2', '~> 3.1'
|
42
|
+
spec.add_dependency 'docker-api', '>= 1.34', '< 3.0'
|
43
|
+
spec.add_dependency 'rake_factory', '~> 0.23'
|
44
|
+
|
45
|
+
spec.add_development_dependency 'activesupport'
|
46
|
+
spec.add_development_dependency 'bundler'
|
47
|
+
spec.add_development_dependency 'gem-release'
|
48
|
+
spec.add_development_dependency 'memfs'
|
49
|
+
spec.add_development_dependency 'rake'
|
50
|
+
spec.add_development_dependency 'rake_circle_ci'
|
51
|
+
spec.add_development_dependency 'rake_github'
|
52
|
+
spec.add_development_dependency 'rake_gpg'
|
53
|
+
spec.add_development_dependency 'rake_ssh'
|
54
|
+
spec.add_development_dependency 'rspec'
|
55
|
+
spec.add_development_dependency 'rubocop'
|
56
|
+
spec.add_development_dependency 'rubocop-rake'
|
57
|
+
spec.add_development_dependency 'rubocop-rspec'
|
58
|
+
spec.add_development_dependency 'simplecov'
|
59
|
+
|
60
|
+
spec.metadata['rubygems_mfa_required'] = 'false'
|
61
|
+
end
|