nutkins 0.7.0 → 0.8.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.
- checksums.yaml +4 -4
- data/lib/nutkins/docker_builder.rb +55 -56
- data/lib/nutkins/version.rb +1 -1
- data/lib/nutkins.rb +11 -5
- 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: 69265ab31556f8e5e183ff64ce97bd771a7126ea
|
4
|
+
data.tar.gz: 4ed7e202dc0dc4a1ccc7338b4869f2ea2d314c64
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bb313cc3b14afc954f49518aafd2712fe2db1bde0fb03b3c12317ce6544c019f089bf867b469d65c01bf19f5667473e6e6ee4974603006a17f75a330164b1bf5
|
7
|
+
data.tar.gz: 48654d38201f36f9659781cccc7b358b8417ddd5fe0647926f60cc6fecd5a5675e59cbeb2924234c7732a0f80a6d9487b221a252bba05ff79fef60dbebde0eb7
|
@@ -15,16 +15,8 @@ module Nutkins::DockerBuilder
|
|
15
15
|
Docker.run 'pull', base, stdout: true
|
16
16
|
end
|
17
17
|
|
18
|
-
cont_id = Nutkins::Docker.container_id_for_tag base, running: true
|
19
|
-
if cont_id
|
20
|
-
puts "found existing container #{cont_id}"
|
21
|
-
Nutkins::Docker.kill_and_remove_container cont_id
|
22
|
-
puts "killed and removed existing container"
|
23
|
-
end
|
24
|
-
|
25
18
|
# the base image to start rebuilding from
|
26
19
|
parent_img_id = base
|
27
|
-
cont_id = nil
|
28
20
|
pwd = Dir.pwd
|
29
21
|
begin
|
30
22
|
Dir.chdir cfg["directory"]
|
@@ -34,87 +26,94 @@ module Nutkins::DockerBuilder
|
|
34
26
|
build_commands.each do |build_cmd|
|
35
27
|
cmd = /^\w+/.match(build_cmd).to_s.downcase
|
36
28
|
cmd_args = build_cmd[(cmd.length + 1)..-1].strip
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
29
|
+
# docker run is always used and forms the basis of the cache key
|
30
|
+
run_args = nil
|
31
|
+
env_args = nil
|
32
|
+
add_files = nil
|
33
|
+
add_files_dest = nil
|
42
34
|
|
43
35
|
case cmd
|
44
36
|
when "run"
|
45
37
|
cmd_args.gsub! /\n+/, ' '
|
46
|
-
|
47
|
-
commit_msg = cmd + ' ' + cmd_args
|
38
|
+
run_args = cmd_args
|
48
39
|
when "add"
|
49
|
-
*
|
50
|
-
|
51
|
-
|
52
|
-
docker_args = srcs.map { |src| ['cp', src, '%CONT_ID%' + ':' + dest] }
|
53
|
-
# ensure checksum of each file is embedded into commit_msg
|
40
|
+
*add_files, add_files_dest = cmd_args.split ' '
|
41
|
+
add_files = add_files.map { |src| Dir.glob src }.flatten
|
42
|
+
# ensure checksum of each file is embedded into run command
|
54
43
|
# if any file changes the cache is dirtied
|
55
|
-
|
44
|
+
run_args = '#(nop) add ' + add_files.map do |src|
|
56
45
|
src + ':' + Digest::MD5.file(src).to_s
|
57
|
-
end.push(
|
46
|
+
end.push(add_files_dest).join(' ')
|
58
47
|
when "cmd", "entrypoint", "env", "expose", "label", "onbuild", "user", "volume", "workdir"
|
59
|
-
|
48
|
+
run_args = "#(nop) #{build_cmd}"
|
49
|
+
env_args = build_cmd
|
60
50
|
else
|
61
51
|
raise "unsupported command: #{cmd}"
|
62
52
|
# TODO add metadata flags
|
63
53
|
end
|
64
54
|
|
65
|
-
if
|
66
|
-
|
67
|
-
|
55
|
+
if run_args
|
56
|
+
run_shell_cmd = [ cfg['shell'], '-c', run_args ]
|
68
57
|
unless cache_is_dirty
|
69
58
|
# searches the commit messages of all images for the one matching the expected
|
70
59
|
# cache entry for the given content
|
71
|
-
|
72
|
-
images_meta = JSON.parse(Nutkins::Docker.run_get_stdout('inspect', *all_images))
|
73
|
-
cache_entry = images_meta.find do |image_meta|
|
74
|
-
if image_meta['Comment'] == commit_msg
|
75
|
-
parent_img_id = Nutkins::Docker.get_short_commit(image_meta['Id'])
|
76
|
-
true
|
77
|
-
end
|
78
|
-
end
|
60
|
+
cache_img_id = find_cached_img_id run_shell_cmd
|
79
61
|
|
80
|
-
if
|
81
|
-
puts "cached: #{
|
62
|
+
if cache_img_id
|
63
|
+
puts "cached: #{run_args}"
|
64
|
+
parent_img_id = cache_img_id
|
82
65
|
next
|
83
66
|
else
|
84
|
-
puts "
|
85
|
-
Nutkins::Docker.run 'run', '-d', parent_img_id, 'sleep', '3600'
|
86
|
-
cont_id = Nutkins::Docker.container_id_for_tag parent_img_id, running: true
|
87
|
-
puts "started build container #{cont_id}"
|
67
|
+
puts "not in cache, starting from #{parent_img_id}"
|
88
68
|
cache_is_dirty = true
|
89
69
|
end
|
90
70
|
end
|
91
71
|
|
92
|
-
|
72
|
+
if run_args
|
73
|
+
puts "run #{run_args}"
|
74
|
+
unless Nutkins::Docker.run 'run', parent_img_id, *run_shell_cmd, stdout: true
|
75
|
+
raise "run failed: #{run_args}"
|
76
|
+
end
|
77
|
+
|
78
|
+
cont_id = `docker ps -aq`.lines.first.strip
|
79
|
+
begin
|
80
|
+
if add_files
|
81
|
+
add_files.each do |src|
|
82
|
+
if not Nutkins::Docker.run 'cp', src, "#{cont_id}:#{add_files_dest}"
|
83
|
+
raise "could not copy #{src} to #{cont_id}:#{add_files_dest}"
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
93
87
|
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
raise "build failed: #{one_docker_args.join ' '}"
|
88
|
+
commit_args = env_args ? ['-c', env_args] : []
|
89
|
+
parent_img_id = Nutkins::Docker.run_get_stdout 'commit', *commit_args, cont_id
|
90
|
+
raise "could not commit docker image" if parent_img_id.nil?
|
91
|
+
parent_img_id = Nutkins::Docker.get_short_commit parent_img_id
|
92
|
+
ensure
|
93
|
+
if not Nutkins::Docker.run 'rm', cont_id
|
94
|
+
puts "could not remove build container #{cont_id}"
|
102
95
|
end
|
103
96
|
end
|
104
97
|
end
|
105
|
-
|
106
|
-
commit_args = commit_change ? ['-c', commit_change] : []
|
107
|
-
parent_img_id = Nutkins::Docker.run_get_stdout 'commit', '-m', commit_msg, *commit_args, cont_id
|
108
|
-
raise "could not commit docker image" if parent_img_id.nil?
|
109
|
-
parent_img_id = Nutkins::Docker.get_short_commit parent_img_id
|
110
98
|
else
|
111
99
|
puts "TODO: support cmd #{build_cmd}"
|
112
100
|
end
|
113
101
|
end
|
114
102
|
ensure
|
115
103
|
Dir.chdir pwd
|
116
|
-
Nutkins::Docker.kill_and_remove_container cont_id if cont_id
|
117
|
-
puts "killed and removed build container"
|
118
104
|
end
|
105
|
+
|
106
|
+
Nutkins::Docker.run 'tag', parent_img_id, cfg['tag']
|
107
|
+
end
|
108
|
+
|
109
|
+
def self.find_cached_img_id command
|
110
|
+
all_images = Nutkins::Docker.run_get_stdout('images', '-aq').split("\n")
|
111
|
+
images_meta = JSON.parse(Nutkins::Docker.run_get_stdout('inspect', *all_images))
|
112
|
+
images_meta.each do |image_meta|
|
113
|
+
if image_meta.dig('ContainerConfig', 'Cmd') == command
|
114
|
+
return Nutkins::Docker.get_short_commit(image_meta['Id'])
|
115
|
+
end
|
116
|
+
end
|
117
|
+
nil
|
119
118
|
end
|
120
119
|
end
|
data/lib/nutkins/version.rb
CHANGED
data/lib/nutkins.rb
CHANGED
@@ -57,11 +57,17 @@ module Nutkins
|
|
57
57
|
end
|
58
58
|
|
59
59
|
image_id = Docker.image_id_for_tag tag
|
60
|
-
if prev_image_id
|
61
|
-
|
62
|
-
|
60
|
+
if prev_image_id
|
61
|
+
if image_id != prev_image_id
|
62
|
+
puts "deleting previous image #{prev_image_id}"
|
63
|
+
Docker.run "rmi", prev_image_id
|
64
|
+
else
|
65
|
+
puts "image is identical to cached version"
|
66
|
+
end
|
67
|
+
elsif image_id
|
68
|
+
puts "created new image #{image_id}"
|
63
69
|
else
|
64
|
-
puts "image
|
70
|
+
puts "no image exists for image... what went wrong?"
|
65
71
|
end
|
66
72
|
end
|
67
73
|
|
@@ -295,7 +301,7 @@ module Nutkins
|
|
295
301
|
img_cfg_path = File.join directory, IMG_CONFIG_FILE_NAME
|
296
302
|
img_cfg = File.exists?(img_cfg_path) ? YAML.load_file(img_cfg_path) : {}
|
297
303
|
img_cfg['image'] ||= path if path != '.'
|
298
|
-
img_cfg['shell'] ||= 'sh'
|
304
|
+
img_cfg['shell'] ||= '/bin/sh'
|
299
305
|
img_cfg['directory'] = directory
|
300
306
|
img_cfg["version"] ||= @config.version if @config.version
|
301
307
|
img_cfg['version'] = img_cfg['version'].to_s
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: nutkins
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.8.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- James Pike
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-08-
|
11
|
+
date: 2016-08-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|