puppet_docker_tools 0.1.2 → 0.1.3
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 +6 -1
- data/bin/puppet-docker +7 -2
- data/lib/puppet_docker_tools/runner.rb +33 -7
- data/lib/puppet_docker_tools/utilities.rb +25 -1
- data/spec/lib/puppet_docker_tools/runner_spec.rb +20 -0
- data/spec/lib/puppet_docker_tools/utilities_spec.rb +19 -1
- 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: 279a8c6d6a95b7d1c5f3f0dc4c045f2b67e363fd
|
4
|
+
data.tar.gz: fa7be0251b3e84ae7fe7be4942c795a578f116e9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d1156f61257a15d2bb792ab555d146e6041d0782d072a2467a1766174562f9a10af9486d2b9d82f350ae45f18053467937cfa444664c70ebc0cfaec03c3d51b6
|
7
|
+
data.tar.gz: 5f2e135989bc479afca3e1116c45fff26cb6a43e21c2eacc904a1adf454ae627fb6e67e61d83a248d74fbea348c305f8933e090a2115e14edf2bfe21847629af
|
data/README.md
CHANGED
@@ -12,8 +12,10 @@ You also need to have docker installed and running. See [these docs](https://doc
|
|
12
12
|
|
13
13
|
```
|
14
14
|
$ puppet-docker help
|
15
|
+
Utilities for building and releasing Puppet docker images.
|
16
|
+
|
15
17
|
Usage:
|
16
|
-
puppet-docker build [DIRECTORY] [--dockerfile=<dockerfile>] [--repository=<repo>] [--namespace=<namespace>] [--no-cache]
|
18
|
+
puppet-docker build [DIRECTORY] [--dockerfile=<dockerfile>] [--repository=<repo>] [--namespace=<namespace>] [--no-cache] [--version=<version] [--build-arg=<buildarg> ...]
|
17
19
|
puppet-docker lint [DIRECTORY] [--dockerfile=<dockerfile>]
|
18
20
|
puppet-docker local-lint [DIRECTORY] [--dockerfile=<dockerfile>]
|
19
21
|
puppet-docker pull [IMAGE] [--repository=<repo>]
|
@@ -35,6 +37,9 @@ Options:
|
|
35
37
|
--no-cache Disable use of layer cache when building this image. Defaults to using the cache.
|
36
38
|
--namespace=<namespace> Namespace for labels on the container [default: org.label-schema]
|
37
39
|
--dockerfile=<dockerfile> File name for your dockerfile [default: Dockerfile]
|
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
|
+
**NOTE** `--build-arg version='<version>'` overrides `--version <version>`
|
42
|
+
--build-arg=<buildarg> Build arg to pass to container build, can be passed multiple times.
|
38
43
|
```
|
39
44
|
|
40
45
|
### `puppet-docker build`
|
data/bin/puppet-docker
CHANGED
@@ -7,7 +7,7 @@ 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]
|
10
|
+
puppet-docker build [DIRECTORY] [--dockerfile=<dockerfile>] [--repository=<repo>] [--namespace=<namespace>] [--no-cache] [--version=<version] [--build-arg=<buildarg> ...]
|
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>]
|
@@ -29,6 +29,9 @@ Options:
|
|
29
29
|
--no-cache Disable use of layer cache when building this image. Defaults to using the cache.
|
30
30
|
--namespace=<namespace> Namespace for labels on the container [default: org.label-schema]
|
31
31
|
--dockerfile=<dockerfile> File name for your dockerfile [default: Dockerfile]
|
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
|
+
**NOTE** `--build-arg version='<version>'` overrides `--version <version>`
|
34
|
+
--build-arg=<buildarg> Build arg to pass to container build, can be passed multiple times.
|
32
35
|
DOC
|
33
36
|
|
34
37
|
begin
|
@@ -44,6 +47,8 @@ defaults = {
|
|
44
47
|
'--namespace' => 'org.label-schema',
|
45
48
|
'--repository' => 'puppet',
|
46
49
|
'--dockerfile' => 'Dockerfile',
|
50
|
+
'--version' => nil,
|
51
|
+
'--build-arg' => [],
|
47
52
|
}
|
48
53
|
|
49
54
|
options.merge!(defaults) do |key, option, default|
|
@@ -69,7 +74,7 @@ begin
|
|
69
74
|
command_runner = PuppetDockerTools::Runner.new(directory: options['DIRECTORY'], repository: options['--repository'], namespace: options['--namespace'], dockerfile: options['--dockerfile'])
|
70
75
|
|
71
76
|
if options['build']
|
72
|
-
command_runner.build(no_cache: options['--no-cache'])
|
77
|
+
command_runner.build(no_cache: options['--no-cache'], version: options['--version'], build_args: options['--build-arg'])
|
73
78
|
elsif options['lint']
|
74
79
|
command_runner.lint
|
75
80
|
elsif options['local-lint']
|
@@ -24,24 +24,50 @@ class PuppetDockerTools
|
|
24
24
|
#
|
25
25
|
# @param no_cache Whether or not to use existing layer caches when building
|
26
26
|
# this image. Defaults to using the cache (no_cache = false).
|
27
|
-
|
27
|
+
# @param version Set the version for the container explicitly. Will get
|
28
|
+
# passed as the 'version' buildarg.
|
29
|
+
# @param build_args Pass arbitrary buildargs to the container build.
|
30
|
+
# Expected to be an array of strings, each string formatted like
|
31
|
+
# 'arg=value'.
|
32
|
+
def build(no_cache: false, version: nil, build_args: [])
|
28
33
|
image_name = File.basename(directory)
|
29
|
-
|
30
|
-
path = "#{repository}/#{image_name}"
|
31
|
-
puts "Building #{path}:latest"
|
32
|
-
|
33
|
-
build_args = {
|
34
|
+
build_args_hash = {
|
34
35
|
'vcs_ref' => PuppetDockerTools::Utilities.current_git_sha(directory),
|
35
36
|
'build_date' => Time.now.utc.iso8601
|
36
37
|
}
|
37
38
|
|
39
|
+
# if version is passed in, add that into the build_args hash
|
40
|
+
# **NOTE** if both `version` and `build_args` includes `version=something`
|
41
|
+
# the value in `build_args` takes precedence
|
42
|
+
build_args_hash['version'] = version unless version.nil?
|
43
|
+
|
44
|
+
# Convert the build_args array to a hash, and merge it with the values
|
45
|
+
# that have already been set
|
46
|
+
if Array(build_args).any?
|
47
|
+
build_args_hash.merge!(PuppetDockerTools::Utilities.parse_build_args(Array(build_args)))
|
48
|
+
end
|
49
|
+
|
50
|
+
# This variable is meant to be used for building the non-latest tagged build
|
51
|
+
# If the version was set via `version` or `build_args`, use that. If not,
|
52
|
+
# use `get_value_from_env` to parse that value from the dockerfile.
|
53
|
+
#
|
54
|
+
# If version hasn't been passed in via `version` or `build_args` there's
|
55
|
+
# no need to add the version from `get_value_from_env` to the
|
56
|
+
# build_args_hash, dockerfiles should not be using both hardcoded versions
|
57
|
+
# and versions passed in to the dockerfile with an `ARG`
|
58
|
+
version = build_args_hash['version'] || PuppetDockerTools::Utilities.get_value_from_env('version', namespace: namespace, directory: directory, dockerfile: dockerfile)
|
59
|
+
|
60
|
+
path = "#{repository}/#{image_name}"
|
61
|
+
puts "Building #{path}:latest"
|
62
|
+
|
38
63
|
# 't' in the build_options sets the tag for the image we're building
|
39
|
-
build_options = { 't' => "#{path}:latest", 'dockerfile' => dockerfile, 'buildargs' => "#{
|
64
|
+
build_options = { 't' => "#{path}:latest", 'dockerfile' => dockerfile, 'buildargs' => "#{build_args_hash.to_json}"}
|
40
65
|
|
41
66
|
if no_cache
|
42
67
|
puts "Ignoring cache for #{path}"
|
43
68
|
build_options['nocache'] = true
|
44
69
|
end
|
70
|
+
|
45
71
|
Docker::Image.build_from_dir(directory, build_options)
|
46
72
|
|
47
73
|
if version
|
@@ -26,6 +26,25 @@ class PuppetDockerTools
|
|
26
26
|
end
|
27
27
|
end
|
28
28
|
|
29
|
+
# parse build args into a hash for easier manipulation
|
30
|
+
#
|
31
|
+
# @param build_args array of build_args with each entry in the format 'arg=value'
|
32
|
+
def parse_build_args(build_args)
|
33
|
+
args_hash = {}
|
34
|
+
|
35
|
+
build_args.each do |arg|
|
36
|
+
fields = arg.split('=')
|
37
|
+
key = fields.first
|
38
|
+
# get rid of the key from the fields so we can get the value
|
39
|
+
fields.shift
|
40
|
+
# join the remaining fields with '=' in case the value had '=' in it
|
41
|
+
value = fields.join('=')
|
42
|
+
args_hash[key] = value
|
43
|
+
end
|
44
|
+
|
45
|
+
args_hash
|
46
|
+
end
|
47
|
+
|
29
48
|
# Get a value from the labels on a docker image
|
30
49
|
#
|
31
50
|
# @param image The docker image you want to get a value from, e.g. 'puppet/puppetserver'
|
@@ -52,7 +71,12 @@ class PuppetDockerTools
|
|
52
71
|
|
53
72
|
value = text.scan(/#{Regexp.escape(namespace)}\.(.+)=(.+) \\?/).to_h[label]
|
54
73
|
# expand out environment variables
|
55
|
-
|
74
|
+
# This supports either label=$variable or label="$variable"
|
75
|
+
if value.start_with?('$') || value.start_with?('"$')
|
76
|
+
# if variable is quoted, get rid of leading and trailing quotes
|
77
|
+
value.gsub!(/\A"|"\Z/, '')
|
78
|
+
value = get_value_from_variable(value, directory: directory, dockerfile: dockerfile, dockerfile_contents: text)
|
79
|
+
end
|
56
80
|
# check in higher-level image if we didn't find it defined in this docker file
|
57
81
|
value = get_value_from_base_image(label, namespace: namespace, directory: directory, dockerfile: dockerfile) if value.nil?
|
58
82
|
# This gets rid of leading or trailing quotes
|
@@ -12,6 +12,8 @@ describe PuppetDockerTools::Runner do
|
|
12
12
|
|
13
13
|
let(:runner) { create_runner(directory: '/tmp/test-image', repository: 'test', namespace: 'org.label-schema', dockerfile: 'Dockerfile') }
|
14
14
|
let(:buildargs) {{ 'vcs_ref' => 'b0c5ead01b6cabdb3f01871bce699be165c3288f', 'build_date' => '2018-06-08T17:18:13Z' }.to_json}
|
15
|
+
let(:buildargs_with_version) {{ 'vcs_ref' => 'b0c5ead01b6cabdb3f01871bce699be165c3288f', 'build_date' => '2018-06-08T17:18:13Z', 'version' => '1.2.3' }.to_json}
|
16
|
+
let(:extra_buildargs) {{ 'vcs_ref' => 'b0c5ead01b6cabdb3f01871bce699be165c3288f', 'build_date' => '2018-06-08T17:18:13Z', 'foo' => 'bar', 'baz' => 'test=with=equals' }.to_json}
|
15
17
|
|
16
18
|
describe '#initialize' do
|
17
19
|
it "should fail if the dockerfile doesn't exist" do
|
@@ -42,6 +44,24 @@ describe PuppetDockerTools::Runner do
|
|
42
44
|
runner.build(no_cache: true)
|
43
45
|
end
|
44
46
|
|
47
|
+
it 'passes the version when that parameter is set' do
|
48
|
+
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
|
+
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
|
+
runner.build(version: '1.2.3')
|
51
|
+
end
|
52
|
+
|
53
|
+
it 'passes arbitrary build args' do
|
54
|
+
expect(PuppetDockerTools::Utilities).to receive(:get_value_from_env).with('version', namespace: runner.namespace, directory: runner.directory, dockerfile: runner.dockerfile).and_return(nil)
|
55
|
+
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
|
+
runner.build(build_args: ['foo=bar', 'baz=test=with=equals'])
|
57
|
+
end
|
58
|
+
|
59
|
+
it 'prioritizes version as a build arg over regular version' do
|
60
|
+
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
|
+
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
|
+
runner.build(version: '1.2.4', build_args: ['version=1.2.3'])
|
63
|
+
end
|
64
|
+
|
45
65
|
it 'uses a custom dockerfile if passed' do
|
46
66
|
allow(File).to receive(:exist?).with('/tmp/test-image/Dockerfile.test').and_return(true)
|
47
67
|
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)
|
@@ -13,7 +13,7 @@ LABEL maintainer="Puppet Release Team <release@puppet.com>" \\
|
|
13
13
|
org.label-schema.url="https://github.com/puppetlabs/puppet-in-docker" \\
|
14
14
|
org.label-schema.name="Puppet Server (No PuppetDB)" \\
|
15
15
|
org.label-schema.license="Apache-2.0" \\
|
16
|
-
org.label-schema.version
|
16
|
+
org.label-schema.version="$PUPPET_SERVER_VERSION" \\
|
17
17
|
org.label-schema.vcs-url="https://github.com/puppetlabs/puppet-in-docker" \\
|
18
18
|
org.label-schema.vcs-ref="b75674e1fbf52f7821f7900ab22a19f1a10cafdb" \\
|
19
19
|
org.label-schema.build-date="2018-05-09T20:11:01Z" \\
|
@@ -204,4 +204,22 @@ HERE
|
|
204
204
|
expect(PuppetDockerTools::Utilities.get_hadolint_command).to eq('hadolint --ignore DL3008 --ignore DL3018 --ignore DL4000 --ignore DL4001 -')
|
205
205
|
end
|
206
206
|
end
|
207
|
+
|
208
|
+
describe '#parse_build_args' do
|
209
|
+
let(:build_args) {
|
210
|
+
[
|
211
|
+
'foo=bar',
|
212
|
+
'test=a=string=with==equals'
|
213
|
+
]
|
214
|
+
}
|
215
|
+
let(:build_args_hash) {
|
216
|
+
{
|
217
|
+
'foo' => 'bar',
|
218
|
+
'test' => 'a=string=with==equals'
|
219
|
+
}
|
220
|
+
}
|
221
|
+
it 'converts the array to a hash' do
|
222
|
+
expect(PuppetDockerTools::Utilities.parse_build_args(build_args)).to eq(build_args_hash)
|
223
|
+
end
|
224
|
+
end
|
207
225
|
end
|
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.3
|
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-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: docker-api
|