puppet_docker_tools 0.1.3 → 0.1.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/README.md +4 -2
- data/bin/puppet-docker +12 -4
- data/lib/puppet_docker_tools/runner.rb +24 -11
- data/lib/puppet_docker_tools/utilities.rb +38 -3
- data/spec/lib/puppet_docker_tools/runner_spec.rb +29 -0
- data/spec/lib/puppet_docker_tools/utilities_spec.rb +63 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 83418018be00481fd020d44eb91dc3e91cbe64d9
|
4
|
+
data.tar.gz: 981bd7c153e5cfec42bf8f97bc6e791278d76dd8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 27d23f46ffe35d28e41e5fe9c66493d35eadcfde6adfc97b55ad01159f517b6052e769a99f3da9428b0405a5b533d972856160a5bb55c26902d2017eae594d26
|
7
|
+
data.tar.gz: 18f9ec6d818748ec65ebb58142b9b65832259d679211f8d2a0a0761548b73be7e9c903f5a40a92945cfde5c8f5402e5eb56e4e2f04c99041bf2cc228c4a603e4
|
data/README.md
CHANGED
@@ -15,11 +15,11 @@ $ puppet-docker help
|
|
15
15
|
Utilities for building and releasing Puppet docker images.
|
16
16
|
|
17
17
|
Usage:
|
18
|
-
puppet-docker build [DIRECTORY] [--dockerfile=<dockerfile>] [--repository=<repo>] [--namespace=<namespace>] [--no-cache] [--version=<version] [--build-arg=<buildarg> ...]
|
18
|
+
puppet-docker build [DIRECTORY] [--dockerfile=<dockerfile>] [--repository=<repo>] [--namespace=<namespace>] [--no-cache] [--version=<version] [--build-arg=<buildarg> ...] [--no-latest]
|
19
19
|
puppet-docker lint [DIRECTORY] [--dockerfile=<dockerfile>]
|
20
20
|
puppet-docker local-lint [DIRECTORY] [--dockerfile=<dockerfile>]
|
21
21
|
puppet-docker pull [IMAGE] [--repository=<repo>]
|
22
|
-
puppet-docker push [DIRECTORY] [--dockerfile=<dockerfile>] [--repository=<repo>] [--namespace=<namespace>]
|
22
|
+
puppet-docker push [DIRECTORY] [--dockerfile=<dockerfile>] [--repository=<repo>] [--namespace=<namespace>] [--no-latest]
|
23
23
|
puppet-docker rev-labels [DIRECTORY] [--dockerfile=<dockerfile>] [--namespace=<namespace>]
|
24
24
|
puppet-docker spec [DIRECTORY]
|
25
25
|
puppet-docker test [DIRECTORY] [--dockerfile=<dockerfile>]
|
@@ -40,6 +40,8 @@ Options:
|
|
40
40
|
--version=<version> Version to build. This field will be used to determine the label and will be passed as the version build arg.
|
41
41
|
**NOTE** `--build-arg version='<version>'` overrides `--version <version>`
|
42
42
|
--build-arg=<buildarg> Build arg to pass to container build, can be passed multiple times.
|
43
|
+
--no-latest Do not include the 'latest' tag when building and shipping images. By default, the 'latest' tag is built and
|
44
|
+
shipped with the versioned tag.
|
43
45
|
```
|
44
46
|
|
45
47
|
### `puppet-docker build`
|
data/bin/puppet-docker
CHANGED
@@ -7,11 +7,11 @@ doc = <<DOC
|
|
7
7
|
Utilities for building and releasing Puppet docker images.
|
8
8
|
|
9
9
|
Usage:
|
10
|
-
puppet-docker build [DIRECTORY] [--dockerfile=<dockerfile>] [--repository=<repo>] [--namespace=<namespace>] [--no-cache] [--version=<version] [--build-arg=<buildarg> ...]
|
10
|
+
puppet-docker build [DIRECTORY] [--dockerfile=<dockerfile>] [--repository=<repo>] [--namespace=<namespace>] [--no-cache] [--version=<version] [--build-arg=<buildarg> ...] [--no-latest]
|
11
11
|
puppet-docker lint [DIRECTORY] [--dockerfile=<dockerfile>]
|
12
12
|
puppet-docker local-lint [DIRECTORY] [--dockerfile=<dockerfile>]
|
13
13
|
puppet-docker pull [IMAGE] [--repository=<repo>]
|
14
|
-
puppet-docker push [DIRECTORY] [--dockerfile=<dockerfile>] [--repository=<repo>] [--namespace=<namespace>]
|
14
|
+
puppet-docker push [DIRECTORY] [--dockerfile=<dockerfile>] [--repository=<repo>] [--namespace=<namespace>] [--no-latest]
|
15
15
|
puppet-docker rev-labels [DIRECTORY] [--dockerfile=<dockerfile>] [--namespace=<namespace>]
|
16
16
|
puppet-docker spec [DIRECTORY]
|
17
17
|
puppet-docker test [DIRECTORY] [--dockerfile=<dockerfile>]
|
@@ -32,6 +32,8 @@ Options:
|
|
32
32
|
--version=<version> Version to build. This field will be used to determine the label and will be passed as the version build arg.
|
33
33
|
**NOTE** `--build-arg version='<version>'` overrides `--version <version>`
|
34
34
|
--build-arg=<buildarg> Build arg to pass to container build, can be passed multiple times.
|
35
|
+
--no-latest Do not include the 'latest' tag when building and shipping images. By default, the 'latest' tag is built and
|
36
|
+
shipped with the versioned tag.
|
35
37
|
DOC
|
36
38
|
|
37
39
|
begin
|
@@ -49,6 +51,7 @@ defaults = {
|
|
49
51
|
'--dockerfile' => 'Dockerfile',
|
50
52
|
'--version' => nil,
|
51
53
|
'--build-arg' => [],
|
54
|
+
'--no-latest' => false,
|
52
55
|
}
|
53
56
|
|
54
57
|
options.merge!(defaults) do |key, option, default|
|
@@ -73,14 +76,19 @@ begin
|
|
73
76
|
else
|
74
77
|
command_runner = PuppetDockerTools::Runner.new(directory: options['DIRECTORY'], repository: options['--repository'], namespace: options['--namespace'], dockerfile: options['--dockerfile'])
|
75
78
|
|
79
|
+
latest = true
|
80
|
+
if options['--no-latest']
|
81
|
+
latest = false
|
82
|
+
end
|
83
|
+
|
76
84
|
if options['build']
|
77
|
-
command_runner.build(no_cache: options['--no-cache'], version: options['--version'], build_args: options['--build-arg'])
|
85
|
+
command_runner.build(no_cache: options['--no-cache'], version: options['--version'], build_args: options['--build-arg'], latest: latest)
|
78
86
|
elsif options['lint']
|
79
87
|
command_runner.lint
|
80
88
|
elsif options['local-lint']
|
81
89
|
command_runner.local_lint
|
82
90
|
elsif options['push']
|
83
|
-
command_runner.push
|
91
|
+
command_runner.push(latest: latest)
|
84
92
|
elsif options['rev-labels']
|
85
93
|
command_runner.rev_labels
|
86
94
|
elsif options['spec']
|
@@ -29,7 +29,9 @@ class PuppetDockerTools
|
|
29
29
|
# @param build_args Pass arbitrary buildargs to the container build.
|
30
30
|
# Expected to be an array of strings, each string formatted like
|
31
31
|
# 'arg=value'.
|
32
|
-
|
32
|
+
# @param latest Whether or not to build the latest tag along with the
|
33
|
+
# versioned image build.
|
34
|
+
def build(no_cache: false, version: nil, build_args: [], latest: true)
|
33
35
|
image_name = File.basename(directory)
|
34
36
|
build_args_hash = {
|
35
37
|
'vcs_ref' => PuppetDockerTools::Utilities.current_git_sha(directory),
|
@@ -47,6 +49,8 @@ class PuppetDockerTools
|
|
47
49
|
build_args_hash.merge!(PuppetDockerTools::Utilities.parse_build_args(Array(build_args)))
|
48
50
|
end
|
49
51
|
|
52
|
+
build_args_hash = PuppetDockerTools::Utilities.filter_build_args(build_args: build_args_hash, dockerfile: "#{directory}/#{dockerfile}")
|
53
|
+
|
50
54
|
# This variable is meant to be used for building the non-latest tagged build
|
51
55
|
# If the version was set via `version` or `build_args`, use that. If not,
|
52
56
|
# use `get_value_from_env` to parse that value from the dockerfile.
|
@@ -58,17 +62,22 @@ class PuppetDockerTools
|
|
58
62
|
version = build_args_hash['version'] || PuppetDockerTools::Utilities.get_value_from_env('version', namespace: namespace, directory: directory, dockerfile: dockerfile)
|
59
63
|
|
60
64
|
path = "#{repository}/#{image_name}"
|
61
|
-
puts "Building #{path}:latest"
|
62
65
|
|
63
|
-
|
64
|
-
build_options = { 't' => "#{path}:latest", 'dockerfile' => dockerfile, 'buildargs' => "#{build_args_hash.to_json}"}
|
66
|
+
build_options = {'dockerfile' => dockerfile, 'buildargs' => "#{build_args_hash.to_json}"}
|
65
67
|
|
66
68
|
if no_cache
|
67
69
|
puts "Ignoring cache for #{path}"
|
68
70
|
build_options['nocache'] = true
|
69
71
|
end
|
70
72
|
|
71
|
-
|
73
|
+
if latest
|
74
|
+
puts "Building #{path}:latest"
|
75
|
+
|
76
|
+
# 't' in the build_options sets the tag for the image we're building
|
77
|
+
build_options['t'] = "#{path}:latest"
|
78
|
+
|
79
|
+
Docker::Image.build_from_dir(directory, build_options)
|
80
|
+
end
|
72
81
|
|
73
82
|
if version
|
74
83
|
puts "Building #{path}:#{version}"
|
@@ -107,12 +116,14 @@ class PuppetDockerTools
|
|
107
116
|
|
108
117
|
# Push an image to hub.docker.com
|
109
118
|
#
|
110
|
-
|
119
|
+
# @param latest Whether or not to push the latest tag along with the
|
120
|
+
# versioned image build.
|
121
|
+
def push(latest: true)
|
111
122
|
image_name = File.basename(directory)
|
112
123
|
path = "#{repository}/#{image_name}"
|
113
124
|
version = PuppetDockerTools::Utilities.get_value_from_label(path, value: 'version', namespace: namespace)
|
114
125
|
|
115
|
-
# We always want to push a versioned label
|
126
|
+
# We always want to push a versioned label
|
116
127
|
unless version
|
117
128
|
fail "No version specified in #{dockerfile} for #{path}"
|
118
129
|
end
|
@@ -123,10 +134,12 @@ class PuppetDockerTools
|
|
123
134
|
fail "Pushing #{path}:#{version} to dockerhub failed!"
|
124
135
|
end
|
125
136
|
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
137
|
+
if latest
|
138
|
+
puts "Pushing #{path}:latest to Docker Hub"
|
139
|
+
exitstatus, _ = PuppetDockerTools::Utilities.push_to_dockerhub("#{path}:latest")
|
140
|
+
unless exitstatus == 0
|
141
|
+
fail "Pushing #{path}:latest to dockerhub failed!"
|
142
|
+
end
|
130
143
|
end
|
131
144
|
end
|
132
145
|
|
@@ -45,6 +45,32 @@ class PuppetDockerTools
|
|
45
45
|
args_hash
|
46
46
|
end
|
47
47
|
|
48
|
+
# Filter build args to only include ARGs listed in the dockerfile. This is
|
49
|
+
# meant for compatibility with old versions of docker.
|
50
|
+
#
|
51
|
+
# @param build_args hash of build args to filter
|
52
|
+
# @param dockerfile the dockerfile to look for ARGs in
|
53
|
+
def filter_build_args(build_args: , dockerfile: )
|
54
|
+
fail "File #{dockerfile} doesn't exist!" unless File.exist? dockerfile
|
55
|
+
text = File.read(dockerfile)
|
56
|
+
|
57
|
+
# Docker only supports passing a single ARG on each line, so
|
58
|
+
# look for arg, and ignore any default settings since we only care
|
59
|
+
# whether or not the key is available
|
60
|
+
implemented_args = text.scan(/arg +([^\n=]+)/i).flatten
|
61
|
+
|
62
|
+
# reject any entries for args that are not in the dockerfile
|
63
|
+
build_args.reject { |k,v|
|
64
|
+
if implemented_args.include?(k)
|
65
|
+
false
|
66
|
+
else
|
67
|
+
puts "Rejecting `--build-arg #{k}` since that ARG isn't in the Dockerfile"
|
68
|
+
true
|
69
|
+
end
|
70
|
+
}
|
71
|
+
end
|
72
|
+
|
73
|
+
|
48
74
|
# Get a value from the labels on a docker image
|
49
75
|
#
|
50
76
|
# @param image The docker image you want to get a value from, e.g. 'puppet/puppetserver'
|
@@ -70,11 +96,18 @@ class PuppetDockerTools
|
|
70
96
|
text = File.read(file)
|
71
97
|
|
72
98
|
value = text.scan(/#{Regexp.escape(namespace)}\.(.+)=(.+) \\?/).to_h[label]
|
99
|
+
# tracking to make sure we aren't in an infinite variable loop
|
100
|
+
checked_variables = []
|
101
|
+
|
73
102
|
# expand out environment variables
|
74
103
|
# This supports either label=$variable or label="$variable"
|
75
|
-
|
104
|
+
while ! value.nil? && (value.start_with?('$') || value.start_with?('"$'))
|
76
105
|
# if variable is quoted, get rid of leading and trailing quotes
|
77
106
|
value.gsub!(/\A"|"\Z/, '')
|
107
|
+
|
108
|
+
fail "Looks like there's an infinite loop with '#{value}'" if checked_variables.include?(value)
|
109
|
+
|
110
|
+
checked_variables << value
|
78
111
|
value = get_value_from_variable(value, directory: directory, dockerfile: dockerfile, dockerfile_contents: text)
|
79
112
|
end
|
80
113
|
# check in higher-level image if we didn't find it defined in this docker file
|
@@ -208,9 +241,11 @@ class PuppetDockerTools
|
|
208
241
|
fail "File #{file} doesn't exist!" unless File.exist? file
|
209
242
|
dockerfile_contents = File.read("#{file}")
|
210
243
|
end
|
244
|
+
variable_clone = String.new(variable)
|
211
245
|
# get rid of the leading $ for the variable
|
212
|
-
|
213
|
-
|
246
|
+
variable_clone[0] = ''
|
247
|
+
|
248
|
+
dockerfile_contents[/#{variable_clone}=([^\s]+)/, 1]
|
214
249
|
end
|
215
250
|
private :get_value_from_variable
|
216
251
|
end
|
@@ -14,6 +14,15 @@ describe PuppetDockerTools::Runner do
|
|
14
14
|
let(:buildargs) {{ 'vcs_ref' => 'b0c5ead01b6cabdb3f01871bce699be165c3288f', 'build_date' => '2018-06-08T17:18:13Z' }.to_json}
|
15
15
|
let(:buildargs_with_version) {{ 'vcs_ref' => 'b0c5ead01b6cabdb3f01871bce699be165c3288f', 'build_date' => '2018-06-08T17:18:13Z', 'version' => '1.2.3' }.to_json}
|
16
16
|
let(:extra_buildargs) {{ 'vcs_ref' => 'b0c5ead01b6cabdb3f01871bce699be165c3288f', 'build_date' => '2018-06-08T17:18:13Z', 'foo' => 'bar', 'baz' => 'test=with=equals' }.to_json}
|
17
|
+
let(:read_dockerfile) {
|
18
|
+
"FROM ubuntu:16.04\n\nARG vcs_ref\nARG build_date"
|
19
|
+
}
|
20
|
+
let(:read_dockerfile_with_version) {
|
21
|
+
"FROM ubuntu:16.04\n\nARG version\nARG vcs_ref\nARG build_date"
|
22
|
+
}
|
23
|
+
let(:read_dockerfile_with_arbitrary_args) {
|
24
|
+
"FROM ubuntu:16.04\n\nARG foo\nARG baz\nARG vcs_ref\nARG build_date"
|
25
|
+
}
|
17
26
|
|
18
27
|
describe '#initialize' do
|
19
28
|
it "should fail if the dockerfile doesn't exist" do
|
@@ -26,6 +35,7 @@ describe PuppetDockerTools::Runner do
|
|
26
35
|
let(:image) { double(Docker::Image) }
|
27
36
|
|
28
37
|
it 'builds a latest and version tag if version is found' do
|
38
|
+
expect(File).to receive(:read).with("#{runner.directory}/#{runner.dockerfile}").and_return(read_dockerfile)
|
29
39
|
expect(PuppetDockerTools::Utilities).to receive(:get_value_from_env).with('version', namespace: runner.namespace, directory: runner.directory, dockerfile: runner.dockerfile).and_return('1.2.3')
|
30
40
|
expect(Docker::Image).to receive(:build_from_dir).with(runner.directory, { 't' => 'test/test-image:1.2.3', 'dockerfile' => runner.dockerfile, 'buildargs' => buildargs }).and_return(image)
|
31
41
|
expect(Docker::Image).to receive(:build_from_dir).with(runner.directory, { 't' => 'test/test-image:latest', 'dockerfile' => runner.dockerfile, 'buildargs' => buildargs }).and_return(image)
|
@@ -33,30 +43,42 @@ describe PuppetDockerTools::Runner do
|
|
33
43
|
end
|
34
44
|
|
35
45
|
it 'builds just a latest tag if no version is found' do
|
46
|
+
expect(File).to receive(:read).with("#{runner.directory}/#{runner.dockerfile}").and_return(read_dockerfile)
|
36
47
|
expect(PuppetDockerTools::Utilities).to receive(:get_value_from_env).with('version', namespace: runner.namespace, directory: runner.directory, dockerfile: runner.dockerfile).and_return(nil)
|
37
48
|
expect(Docker::Image).to receive(:build_from_dir).with(runner.directory, { 't' => 'test/test-image:latest', 'dockerfile' => runner.dockerfile, 'buildargs' => buildargs }).and_return(image)
|
38
49
|
runner.build
|
39
50
|
end
|
40
51
|
|
52
|
+
it 'does not build a latest tag if latest is set to false' do
|
53
|
+
expect(File).to receive(:read).with("#{runner.directory}/#{runner.dockerfile}").and_return(read_dockerfile)
|
54
|
+
expect(PuppetDockerTools::Utilities).to receive(:get_value_from_env).with('version', namespace: runner.namespace, directory: runner.directory, dockerfile: runner.dockerfile).and_return('1.2.3')
|
55
|
+
expect(Docker::Image).to receive(:build_from_dir).with(runner.directory, { 't' => 'test/test-image:1.2.3', 'dockerfile' => runner.dockerfile, 'buildargs' => buildargs }).and_return(image)
|
56
|
+
runner.build(latest: false)
|
57
|
+
end
|
58
|
+
|
41
59
|
it 'ignores the cache when that parameter is set' do
|
60
|
+
expect(File).to receive(:read).with("#{runner.directory}/#{runner.dockerfile}").and_return(read_dockerfile)
|
42
61
|
expect(PuppetDockerTools::Utilities).to receive(:get_value_from_env).with('version', namespace: runner.namespace, directory: runner.directory, dockerfile: runner.dockerfile).and_return(nil)
|
43
62
|
expect(Docker::Image).to receive(:build_from_dir).with(runner.directory, { 't' => 'test/test-image:latest', 'nocache' => true, 'dockerfile' => runner.dockerfile, 'buildargs' => buildargs }).and_return(image)
|
44
63
|
runner.build(no_cache: true)
|
45
64
|
end
|
46
65
|
|
47
66
|
it 'passes the version when that parameter is set' do
|
67
|
+
expect(File).to receive(:read).with("#{runner.directory}/#{runner.dockerfile}").and_return(read_dockerfile_with_version)
|
48
68
|
expect(Docker::Image).to receive(:build_from_dir).with(runner.directory, { 't' => 'test/test-image:latest', 'dockerfile' => runner.dockerfile, 'buildargs' => buildargs_with_version }).and_return(image)
|
49
69
|
expect(Docker::Image).to receive(:build_from_dir).with(runner.directory, { 't' => 'test/test-image:1.2.3', 'dockerfile' => runner.dockerfile, 'buildargs' => buildargs_with_version }).and_return(image)
|
50
70
|
runner.build(version: '1.2.3')
|
51
71
|
end
|
52
72
|
|
53
73
|
it 'passes arbitrary build args' do
|
74
|
+
expect(File).to receive(:read).with("#{runner.directory}/#{runner.dockerfile}").and_return(read_dockerfile_with_arbitrary_args)
|
54
75
|
expect(PuppetDockerTools::Utilities).to receive(:get_value_from_env).with('version', namespace: runner.namespace, directory: runner.directory, dockerfile: runner.dockerfile).and_return(nil)
|
55
76
|
expect(Docker::Image).to receive(:build_from_dir).with(runner.directory, { 't' => 'test/test-image:latest', 'dockerfile' => runner.dockerfile, 'buildargs' => extra_buildargs }).and_return(image)
|
56
77
|
runner.build(build_args: ['foo=bar', 'baz=test=with=equals'])
|
57
78
|
end
|
58
79
|
|
59
80
|
it 'prioritizes version as a build arg over regular version' do
|
81
|
+
expect(File).to receive(:read).with("#{runner.directory}/#{runner.dockerfile}").and_return(read_dockerfile_with_version)
|
60
82
|
expect(Docker::Image).to receive(:build_from_dir).with(runner.directory, { 't' => 'test/test-image:latest', 'dockerfile' => runner.dockerfile, 'buildargs' => buildargs_with_version }).and_return(image)
|
61
83
|
expect(Docker::Image).to receive(:build_from_dir).with(runner.directory, { 't' => 'test/test-image:1.2.3', 'dockerfile' => runner.dockerfile, 'buildargs' => buildargs_with_version }).and_return(image)
|
62
84
|
runner.build(version: '1.2.4', build_args: ['version=1.2.3'])
|
@@ -64,6 +86,7 @@ describe PuppetDockerTools::Runner do
|
|
64
86
|
|
65
87
|
it 'uses a custom dockerfile if passed' do
|
66
88
|
allow(File).to receive(:exist?).with('/tmp/test-image/Dockerfile.test').and_return(true)
|
89
|
+
expect(File).to receive(:read).with('/tmp/test-image/Dockerfile.test').and_return(read_dockerfile)
|
67
90
|
expect(PuppetDockerTools::Utilities).to receive(:get_value_from_env).with('version', namespace: 'org.label-schema', directory: '/tmp/test-image', dockerfile: 'Dockerfile.test').and_return(nil)
|
68
91
|
expect(Docker::Image).to receive(:build_from_dir).with('/tmp/test-image', { 't' => 'test/test-image:latest', 'dockerfile' => 'Dockerfile.test', 'buildargs' => buildargs }).and_return(image)
|
69
92
|
local_runner = create_runner(directory: '/tmp/test-image', repository: 'test', namespace: 'org.label-schema', dockerfile: 'Dockerfile.test')
|
@@ -141,6 +164,12 @@ describe PuppetDockerTools::Runner do
|
|
141
164
|
expect(PuppetDockerTools::Utilities).to receive(:push_to_dockerhub).with('test/test-image:latest').and_return([0, nil])
|
142
165
|
runner.push
|
143
166
|
end
|
167
|
+
|
168
|
+
it 'should not push the latest tag if latest is set to false' do
|
169
|
+
expect(PuppetDockerTools::Utilities).to receive(:get_value_from_label).with('test/test-image', value: 'version', namespace: runner.namespace).and_return('1.2.3')
|
170
|
+
expect(PuppetDockerTools::Utilities).to receive(:push_to_dockerhub).with('test/test-image:1.2.3').and_return([0, nil])
|
171
|
+
runner.push(latest: false)
|
172
|
+
end
|
144
173
|
end
|
145
174
|
|
146
175
|
describe '#rev_labels' do
|
@@ -37,6 +37,49 @@ LABEL maintainer="Puppet Release Team <release@puppet.com>" \\
|
|
37
37
|
com.puppet.dockerfile="/Dockerfile"
|
38
38
|
HERE
|
39
39
|
}
|
40
|
+
let(:infinite_dockerfile_contents) { <<-HERE
|
41
|
+
FROM ubuntu:16.04
|
42
|
+
|
43
|
+
ENV PUPPET_SERVER_VERSION=$foo foo=$PUPPET_SERVER_VERSION
|
44
|
+
|
45
|
+
LABEL maintainer="Puppet Release Team <release@puppet.com>" \\
|
46
|
+
org.label-schema.vendor="Puppet" \\
|
47
|
+
org.label-schema.url="https://github.com/puppetlabs/puppet-in-docker" \\
|
48
|
+
org.label-schema.name="Puppet Server (No PuppetDB)" \\
|
49
|
+
org.label-schema.license="Apache-2.0" \\
|
50
|
+
org.label-schema.version="$PUPPET_SERVER_VERSION" \\
|
51
|
+
org.label-schema.vcs-url="https://github.com/puppetlabs/puppet-in-docker" \\
|
52
|
+
org.label-schema.vcs-ref="b75674e1fbf52f7821f7900ab22a19f1a10cafdb" \\
|
53
|
+
org.label-schema.build-date="2018-05-09T20:11:01Z" \\
|
54
|
+
org.label-schema.schema-version="1.0" \\
|
55
|
+
com.puppet.dockerfile="/Dockerfile"
|
56
|
+
HERE
|
57
|
+
}
|
58
|
+
let(:dockerfile_with_args) { <<-HERE
|
59
|
+
FROM puppet/puppetserver-standalone:5.3.1
|
60
|
+
|
61
|
+
ARG version
|
62
|
+
ARG foo
|
63
|
+
ARG bar
|
64
|
+
HERE
|
65
|
+
}
|
66
|
+
|
67
|
+
let(:build_args) {
|
68
|
+
{
|
69
|
+
'version' => '1.2.3',
|
70
|
+
'foo' => 'test',
|
71
|
+
'bar' => 'baz',
|
72
|
+
'test' => 'test2',
|
73
|
+
}
|
74
|
+
}
|
75
|
+
|
76
|
+
let(:filtered_build_args) {
|
77
|
+
{
|
78
|
+
'version' => '1.2.3',
|
79
|
+
'foo' => 'test',
|
80
|
+
'bar' => 'baz',
|
81
|
+
}
|
82
|
+
}
|
40
83
|
|
41
84
|
let(:config_labels) { {
|
42
85
|
'Config' => {
|
@@ -49,6 +92,20 @@ HERE
|
|
49
92
|
}
|
50
93
|
}
|
51
94
|
|
95
|
+
describe "#filter_build_args" do
|
96
|
+
it "should fail if the dockerfile doesn't exist" do
|
97
|
+
allow(File).to receive(:exist?).with("/tmp/test-dir/#{dockerfile}").and_return(false)
|
98
|
+
expect { PuppetDockerTools::Utilities.filter_build_args(build_args: build_args, dockerfile: "/tmp/test-dir/#{dockerfile}") }.to raise_error(RuntimeError, /doesn't exist/)
|
99
|
+
end
|
100
|
+
|
101
|
+
it "should filter out any buildargs not in the dockerfile" do
|
102
|
+
allow(File).to receive(:exist?).with("/tmp/test-dir/#{dockerfile}").and_return(true)
|
103
|
+
allow(File).to receive(:read).with("/tmp/test-dir/#{dockerfile}").and_return(dockerfile_with_args)
|
104
|
+
expect(PuppetDockerTools::Utilities.filter_build_args(build_args: build_args, dockerfile: "/tmp/test-dir/#{dockerfile}")).to eq(filtered_build_args)
|
105
|
+
end
|
106
|
+
|
107
|
+
end
|
108
|
+
|
52
109
|
describe "#get_value_from_label" do
|
53
110
|
let(:image) { double(Docker::Image).as_null_object }
|
54
111
|
|
@@ -89,6 +146,12 @@ HERE
|
|
89
146
|
allow(File).to receive(:read).with("/tmp/test-dir/../puppetserver-standalone/#{dockerfile}").and_return(base_dockerfile_contents)
|
90
147
|
expect(PuppetDockerTools::Utilities.get_value_from_env('version', namespace: 'org.label-schema', directory: '/tmp/test-dir')).to eq('5.3.1')
|
91
148
|
end
|
149
|
+
|
150
|
+
it "doesn't get stuck in an infinite loop if there's a bad variable definition" do
|
151
|
+
allow(File).to receive(:exist?).with("/tmp/test-dir/#{dockerfile}").and_return(true)
|
152
|
+
allow(File).to receive(:read).with("/tmp/test-dir/#{dockerfile}").and_return(infinite_dockerfile_contents)
|
153
|
+
expect { PuppetDockerTools::Utilities.get_value_from_env('version', namespace: 'org.label-schema', directory: '/tmp/test-dir')}.to raise_error(RuntimeError, /infinite loop/)
|
154
|
+
end
|
92
155
|
end
|
93
156
|
|
94
157
|
describe "#format_timestamp" do
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: puppet_docker_tools
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Puppet, Inc.
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-06-
|
11
|
+
date: 2018-06-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: docker-api
|