nutkins 0.7.0 → 0.8.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|