construi 0.37.0 → 0.38.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.
- data/construi/release/script.sh +3 -2
- data/lib/construi/container.rb +1 -1
- data/lib/construi/image.rb +23 -17
- data/lib/construi/version.rb +1 -1
- data/spec/lib/construi/image_spec.rb +29 -15
- metadata +62 -31
- checksums.yaml +0 -7
data/construi/release/script.sh
CHANGED
@@ -11,17 +11,18 @@ release_commit=`git rev-parse HEAD`
|
|
11
11
|
|
12
12
|
echo "Release commit ${release_commit}..."
|
13
13
|
|
14
|
+
bundle install --path vendor/bundle
|
15
|
+
|
14
16
|
echo "Pushing to master..."
|
15
17
|
git push -f origin `git rev-parse HEAD`:master
|
16
18
|
|
17
19
|
echo "Push to master done."
|
18
20
|
|
19
21
|
echo "Updating development version..."
|
20
|
-
bundle install --path vendor/bundle
|
21
22
|
bundle exec gem bump --version minor
|
22
23
|
|
23
24
|
echo "Pushing to develop..."
|
24
|
-
git push origin `
|
25
|
+
git push origin `git rev-parse HEAD`:develop
|
25
26
|
echo "Push to develop done."
|
26
27
|
|
27
28
|
echo "Release done."
|
data/lib/construi/container.rb
CHANGED
data/lib/construi/image.rb
CHANGED
@@ -4,7 +4,7 @@ require 'colorize'
|
|
4
4
|
require 'docker'
|
5
5
|
|
6
6
|
module Construi
|
7
|
-
|
7
|
+
# A Docker Image
|
8
8
|
class Image
|
9
9
|
private_class_method :new
|
10
10
|
|
@@ -28,7 +28,7 @@ module Construi
|
|
28
28
|
@image.info['RepoTags'] != '<none>:<none>'
|
29
29
|
end
|
30
30
|
|
31
|
-
def insert_local(file)
|
31
|
+
def insert_local(file, options = {})
|
32
32
|
puts "\nCopying #{file.host} to #{file.container}...".green
|
33
33
|
|
34
34
|
img = IntermediateImage.seed(self)
|
@@ -38,22 +38,25 @@ module Construi
|
|
38
38
|
.insert_local 'localPath' => file.host, 'outputPath' => file.container
|
39
39
|
end
|
40
40
|
|
41
|
-
img.map { |i| i.chmod file.container, file.permissions } if file.permissions
|
41
|
+
img.map { |i| i.chmod file.container, file.permissions, options } if file.permissions
|
42
42
|
|
43
|
-
img.run "ls -l #{file.container}"
|
43
|
+
img.run "ls -l #{file.container}", options
|
44
44
|
|
45
45
|
img.image
|
46
46
|
end
|
47
47
|
|
48
|
-
def insert_locals(files)
|
49
|
-
IntermediateImage
|
48
|
+
def insert_locals(files, options = {})
|
49
|
+
IntermediateImage
|
50
|
+
.seed(self)
|
51
|
+
.reduce(files) { |a, e| a.insert_local e, options }
|
52
|
+
.image
|
50
53
|
end
|
51
54
|
|
52
|
-
def chmod(file, permissions)
|
53
|
-
|
55
|
+
def chmod(file, permissions, options = {})
|
56
|
+
chmod = "chmod -R #{permissions} #{file}"
|
54
57
|
|
55
|
-
|
56
|
-
|
58
|
+
puts " > #{chmod}"
|
59
|
+
run chmod, options
|
57
60
|
end
|
58
61
|
|
59
62
|
def run(cmd, options = {})
|
@@ -61,16 +64,16 @@ module Construi
|
|
61
64
|
end
|
62
65
|
|
63
66
|
def ==(other)
|
64
|
-
other.is_a?
|
67
|
+
other.is_a?(Image) && id == other.id
|
65
68
|
end
|
66
69
|
|
67
70
|
def self.from(config)
|
68
71
|
image = create(config.image) unless config.image.nil?
|
69
72
|
image = build(config.build) unless config.build.nil?
|
70
73
|
|
71
|
-
|
74
|
+
fail Error, "Invalid image configuration: #{config}" unless image
|
72
75
|
|
73
|
-
image.insert_locals config.files
|
76
|
+
image.insert_locals config.files, privileged: config.privileged?
|
74
77
|
end
|
75
78
|
|
76
79
|
def self.create(image)
|
@@ -82,7 +85,7 @@ module Construi
|
|
82
85
|
id = status['id']
|
83
86
|
progress = status['progressDetail']
|
84
87
|
|
85
|
-
if progress.nil?
|
88
|
+
if progress.nil? || progress.empty?
|
86
89
|
print "#{id}: " unless id.nil?
|
87
90
|
puts "#{status['status']}"
|
88
91
|
end
|
@@ -92,7 +95,7 @@ module Construi
|
|
92
95
|
def self.build(build)
|
93
96
|
puts
|
94
97
|
puts "Building image: '#{build}'...".green
|
95
|
-
wrap Docker::Image.build_from_dir(build, :
|
98
|
+
wrap Docker::Image.build_from_dir(build, rm: 0) { |s|
|
96
99
|
puts JSON.parse(s)['stream']
|
97
100
|
}
|
98
101
|
end
|
@@ -105,6 +108,9 @@ module Construi
|
|
105
108
|
end
|
106
109
|
end
|
107
110
|
|
111
|
+
# An image that represents an intermediatae state of an image.
|
112
|
+
# Useful for performing operations where each opertion is performed on the
|
113
|
+
# result of the last.
|
108
114
|
class IntermediateImage
|
109
115
|
private_class_method :new
|
110
116
|
|
@@ -115,8 +121,8 @@ module Construi
|
|
115
121
|
@first = true
|
116
122
|
end
|
117
123
|
|
118
|
-
def run(cmd,
|
119
|
-
map { |i| i.run cmd,
|
124
|
+
def run(cmd, options = {})
|
125
|
+
map { |i| i.run cmd, options }
|
120
126
|
end
|
121
127
|
|
122
128
|
def map
|
data/lib/construi/version.rb
CHANGED
@@ -5,11 +5,15 @@ require 'securerandom'
|
|
5
5
|
|
6
6
|
RSpec.describe Construi::Image do
|
7
7
|
let(:id) { SecureRandom.hex(16) }
|
8
|
-
|
8
|
+
|
9
|
+
let(:docker_image) do
|
10
|
+
instance_double(Docker::Image, id: id).as_null_object
|
11
|
+
end
|
12
|
+
|
9
13
|
let!(:docker_image_class) { class_spy(Docker::Image).as_stubbed_const }
|
10
14
|
let!(:container_class) { class_spy(Construi::Container).as_stubbed_const }
|
11
15
|
|
12
|
-
let(:default_options) { {
|
16
|
+
let(:default_options) { {} }
|
13
17
|
|
14
18
|
subject(:image) { Construi::Image.wrap(docker_image) }
|
15
19
|
|
@@ -24,7 +28,9 @@ RSpec.describe Construi::Image do
|
|
24
28
|
end
|
25
29
|
|
26
30
|
describe '#tagged?' do
|
27
|
-
before
|
31
|
+
before do
|
32
|
+
allow(docker_image).to receive(:info).and_return('RepoTags' => tag)
|
33
|
+
end
|
28
34
|
|
29
35
|
subject { image.tagged? }
|
30
36
|
|
@@ -53,9 +59,15 @@ RSpec.describe Construi::Image do
|
|
53
59
|
let(:host) { '/path/host' }
|
54
60
|
let(:container) { '/path/on/container' }
|
55
61
|
let(:permissions) { nil }
|
56
|
-
let(:file) { Construi::Config::Files::File.new host, container, permissions }
|
57
62
|
|
58
|
-
|
63
|
+
let(:file) do
|
64
|
+
Construi::Config::Files::File.new host, container, permissions
|
65
|
+
end
|
66
|
+
|
67
|
+
before do
|
68
|
+
allow(docker_image).to receive(:info).and_return('RepoTags' => '<none>:<none>')
|
69
|
+
end
|
70
|
+
|
59
71
|
before { allow(docker_image).to receive(:insert_local).and_return(docker_image) }
|
60
72
|
before { allow(container_class).to receive(:run).and_return image }
|
61
73
|
|
@@ -92,12 +104,17 @@ RSpec.describe Construi::Image do
|
|
92
104
|
end
|
93
105
|
|
94
106
|
describe '.from' do
|
95
|
-
|
107
|
+
let(:config) { instance_double(Construi::Config::Environment).as_null_object }
|
96
108
|
|
97
109
|
let(:image) { nil }
|
98
110
|
let(:build) { nil }
|
99
111
|
let(:files) { [] }
|
100
|
-
let(:
|
112
|
+
let(:privileged?) { false }
|
113
|
+
|
114
|
+
before { allow(config).to receive(:image).and_return image }
|
115
|
+
before { allow(config).to receive(:build).and_return build }
|
116
|
+
before { allow(config).to receive(:files).and_return files }
|
117
|
+
before { allow(config).to receive(:privileged?).and_return privileged? }
|
101
118
|
|
102
119
|
[:create, :build_from_dir].each do |m|
|
103
120
|
before { allow(docker_image_class).to receive(m).and_return docker_image }
|
@@ -229,25 +246,22 @@ RSpec.describe Construi::IntermediateImage do
|
|
229
246
|
|
230
247
|
describe '#run' do
|
231
248
|
let(:cmd) { 'cmd1' }
|
232
|
-
let(:
|
249
|
+
let(:options) { { env: ['VAR1=VALUE1']} }
|
233
250
|
|
234
251
|
context "single run" do
|
235
|
-
subject! { intermediate_image.run(cmd,
|
252
|
+
subject! { intermediate_image.run(cmd, options) }
|
236
253
|
|
237
|
-
it { expect(image).to have_received(:run).with(cmd,
|
254
|
+
it { expect(image).to have_received(:run).with(cmd, options) }
|
238
255
|
it { expect(image).to_not have_received(:delete) }
|
239
256
|
it { expect(second_image).to_not have_received(:delete) }
|
240
257
|
end
|
241
258
|
|
242
259
|
context "double run" do
|
243
|
-
subject! { intermediate_image.run(cmd,
|
260
|
+
subject! { intermediate_image.run(cmd, options).run(cmd, options) }
|
244
261
|
|
245
|
-
it { expect(second_image).to have_received(:run).with(cmd,
|
262
|
+
it { expect(second_image).to have_received(:run).with(cmd, options) }
|
246
263
|
it { expect(second_image).to have_received(:delete) }
|
247
264
|
end
|
248
265
|
end
|
249
|
-
|
250
|
-
|
251
|
-
|
252
266
|
end
|
253
267
|
|
metadata
CHANGED
@@ -1,18 +1,20 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: construi
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.38.0
|
5
|
+
prerelease:
|
5
6
|
platform: ruby
|
6
7
|
authors:
|
7
8
|
- Levi Stephen
|
8
9
|
autorequire:
|
9
10
|
bindir: bin
|
10
11
|
cert_chain: []
|
11
|
-
date: 2015-07-
|
12
|
+
date: 2015-07-16 00:00:00.000000000 Z
|
12
13
|
dependencies:
|
13
14
|
- !ruby/object:Gem::Dependency
|
14
15
|
name: docker-api
|
15
16
|
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
16
18
|
requirements:
|
17
19
|
- - '='
|
18
20
|
- !ruby/object:Gem::Version
|
@@ -20,6 +22,7 @@ dependencies:
|
|
20
22
|
type: :runtime
|
21
23
|
prerelease: false
|
22
24
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
23
26
|
requirements:
|
24
27
|
- - '='
|
25
28
|
- !ruby/object:Gem::Version
|
@@ -27,6 +30,7 @@ dependencies:
|
|
27
30
|
- !ruby/object:Gem::Dependency
|
28
31
|
name: colorize
|
29
32
|
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
30
34
|
requirements:
|
31
35
|
- - '='
|
32
36
|
- !ruby/object:Gem::Version
|
@@ -34,6 +38,7 @@ dependencies:
|
|
34
38
|
type: :runtime
|
35
39
|
prerelease: false
|
36
40
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
37
42
|
requirements:
|
38
43
|
- - '='
|
39
44
|
- !ruby/object:Gem::Version
|
@@ -41,155 +46,177 @@ dependencies:
|
|
41
46
|
- !ruby/object:Gem::Dependency
|
42
47
|
name: bundler
|
43
48
|
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
44
50
|
requirements:
|
45
|
-
- -
|
51
|
+
- - ~>
|
46
52
|
- !ruby/object:Gem::Version
|
47
53
|
version: '1.9'
|
48
54
|
type: :development
|
49
55
|
prerelease: false
|
50
56
|
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
51
58
|
requirements:
|
52
|
-
- -
|
59
|
+
- - ~>
|
53
60
|
- !ruby/object:Gem::Version
|
54
61
|
version: '1.9'
|
55
62
|
- !ruby/object:Gem::Dependency
|
56
63
|
name: execjs
|
57
64
|
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
58
66
|
requirements:
|
59
|
-
- -
|
67
|
+
- - ~>
|
60
68
|
- !ruby/object:Gem::Version
|
61
69
|
version: '2.5'
|
62
70
|
type: :development
|
63
71
|
prerelease: false
|
64
72
|
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
65
74
|
requirements:
|
66
|
-
- -
|
75
|
+
- - ~>
|
67
76
|
- !ruby/object:Gem::Version
|
68
77
|
version: '2.5'
|
69
78
|
- !ruby/object:Gem::Dependency
|
70
79
|
name: gem-release
|
71
80
|
requirement: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
72
82
|
requirements:
|
73
|
-
- -
|
83
|
+
- - ~>
|
74
84
|
- !ruby/object:Gem::Version
|
75
85
|
version: '0.7'
|
76
86
|
type: :development
|
77
87
|
prerelease: false
|
78
88
|
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
79
90
|
requirements:
|
80
|
-
- -
|
91
|
+
- - ~>
|
81
92
|
- !ruby/object:Gem::Version
|
82
93
|
version: '0.7'
|
83
94
|
- !ruby/object:Gem::Dependency
|
84
95
|
name: jekyll
|
85
96
|
requirement: !ruby/object:Gem::Requirement
|
97
|
+
none: false
|
86
98
|
requirements:
|
87
|
-
- -
|
99
|
+
- - ~>
|
88
100
|
- !ruby/object:Gem::Version
|
89
101
|
version: '2.5'
|
90
102
|
type: :development
|
91
103
|
prerelease: false
|
92
104
|
version_requirements: !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
93
106
|
requirements:
|
94
|
-
- -
|
107
|
+
- - ~>
|
95
108
|
- !ruby/object:Gem::Version
|
96
109
|
version: '2.5'
|
97
110
|
- !ruby/object:Gem::Dependency
|
98
111
|
name: rake
|
99
112
|
requirement: !ruby/object:Gem::Requirement
|
113
|
+
none: false
|
100
114
|
requirements:
|
101
|
-
- -
|
115
|
+
- - ~>
|
102
116
|
- !ruby/object:Gem::Version
|
103
117
|
version: '10.4'
|
104
118
|
type: :development
|
105
119
|
prerelease: false
|
106
120
|
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
none: false
|
107
122
|
requirements:
|
108
|
-
- -
|
123
|
+
- - ~>
|
109
124
|
- !ruby/object:Gem::Version
|
110
125
|
version: '10.4'
|
111
126
|
- !ruby/object:Gem::Dependency
|
112
127
|
name: redcarpet
|
113
128
|
requirement: !ruby/object:Gem::Requirement
|
129
|
+
none: false
|
114
130
|
requirements:
|
115
|
-
- -
|
131
|
+
- - ~>
|
116
132
|
- !ruby/object:Gem::Version
|
117
133
|
version: '3.2'
|
118
134
|
type: :development
|
119
135
|
prerelease: false
|
120
136
|
version_requirements: !ruby/object:Gem::Requirement
|
137
|
+
none: false
|
121
138
|
requirements:
|
122
|
-
- -
|
139
|
+
- - ~>
|
123
140
|
- !ruby/object:Gem::Version
|
124
141
|
version: '3.2'
|
125
142
|
- !ruby/object:Gem::Dependency
|
126
143
|
name: rspec
|
127
144
|
requirement: !ruby/object:Gem::Requirement
|
145
|
+
none: false
|
128
146
|
requirements:
|
129
|
-
- -
|
147
|
+
- - ~>
|
130
148
|
- !ruby/object:Gem::Version
|
131
149
|
version: '3.2'
|
132
150
|
type: :development
|
133
151
|
prerelease: false
|
134
152
|
version_requirements: !ruby/object:Gem::Requirement
|
153
|
+
none: false
|
135
154
|
requirements:
|
136
|
-
- -
|
155
|
+
- - ~>
|
137
156
|
- !ruby/object:Gem::Version
|
138
157
|
version: '3.2'
|
139
158
|
- !ruby/object:Gem::Dependency
|
140
159
|
name: rubocop
|
141
160
|
requirement: !ruby/object:Gem::Requirement
|
161
|
+
none: false
|
142
162
|
requirements:
|
143
|
-
- -
|
163
|
+
- - ~>
|
144
164
|
- !ruby/object:Gem::Version
|
145
165
|
version: '0.31'
|
146
166
|
type: :development
|
147
167
|
prerelease: false
|
148
168
|
version_requirements: !ruby/object:Gem::Requirement
|
169
|
+
none: false
|
149
170
|
requirements:
|
150
|
-
- -
|
171
|
+
- - ~>
|
151
172
|
- !ruby/object:Gem::Version
|
152
173
|
version: '0.31'
|
153
174
|
- !ruby/object:Gem::Dependency
|
154
175
|
name: simplecov
|
155
176
|
requirement: !ruby/object:Gem::Requirement
|
177
|
+
none: false
|
156
178
|
requirements:
|
157
|
-
- -
|
179
|
+
- - ~>
|
158
180
|
- !ruby/object:Gem::Version
|
159
181
|
version: '0.10'
|
160
182
|
type: :development
|
161
183
|
prerelease: false
|
162
184
|
version_requirements: !ruby/object:Gem::Requirement
|
185
|
+
none: false
|
163
186
|
requirements:
|
164
|
-
- -
|
187
|
+
- - ~>
|
165
188
|
- !ruby/object:Gem::Version
|
166
189
|
version: '0.10'
|
167
190
|
- !ruby/object:Gem::Dependency
|
168
191
|
name: therubyracer
|
169
192
|
requirement: !ruby/object:Gem::Requirement
|
193
|
+
none: false
|
170
194
|
requirements:
|
171
|
-
- -
|
195
|
+
- - ~>
|
172
196
|
- !ruby/object:Gem::Version
|
173
197
|
version: '0.12'
|
174
198
|
type: :development
|
175
199
|
prerelease: false
|
176
200
|
version_requirements: !ruby/object:Gem::Requirement
|
201
|
+
none: false
|
177
202
|
requirements:
|
178
|
-
- -
|
203
|
+
- - ~>
|
179
204
|
- !ruby/object:Gem::Version
|
180
205
|
version: '0.12'
|
181
206
|
- !ruby/object:Gem::Dependency
|
182
207
|
name: yard
|
183
208
|
requirement: !ruby/object:Gem::Requirement
|
209
|
+
none: false
|
184
210
|
requirements:
|
185
|
-
- -
|
211
|
+
- - ~>
|
186
212
|
- !ruby/object:Gem::Version
|
187
213
|
version: '0.8'
|
188
214
|
type: :development
|
189
215
|
prerelease: false
|
190
216
|
version_requirements: !ruby/object:Gem::Requirement
|
217
|
+
none: false
|
191
218
|
requirements:
|
192
|
-
- -
|
219
|
+
- - ~>
|
193
220
|
- !ruby/object:Gem::Version
|
194
221
|
version: '0.8'
|
195
222
|
description: Build tool using Docker to specify build environment
|
@@ -200,8 +227,8 @@ executables:
|
|
200
227
|
extensions: []
|
201
228
|
extra_rdoc_files: []
|
202
229
|
files:
|
203
|
-
-
|
204
|
-
-
|
230
|
+
- .gitignore
|
231
|
+
- .rspec
|
205
232
|
- Gemfile
|
206
233
|
- LICENSE.txt
|
207
234
|
- README.md
|
@@ -236,26 +263,30 @@ files:
|
|
236
263
|
homepage: https://github.com/lstephen/construi
|
237
264
|
licenses:
|
238
265
|
- MIT
|
239
|
-
metadata: {}
|
240
266
|
post_install_message:
|
241
267
|
rdoc_options: []
|
242
268
|
require_paths:
|
243
269
|
- lib
|
244
270
|
required_ruby_version: !ruby/object:Gem::Requirement
|
271
|
+
none: false
|
245
272
|
requirements:
|
246
|
-
- -
|
273
|
+
- - ! '>='
|
247
274
|
- !ruby/object:Gem::Version
|
248
275
|
version: '1.9'
|
249
276
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
277
|
+
none: false
|
250
278
|
requirements:
|
251
|
-
- -
|
279
|
+
- - ! '>='
|
252
280
|
- !ruby/object:Gem::Version
|
253
281
|
version: '0'
|
282
|
+
segments:
|
283
|
+
- 0
|
284
|
+
hash: -3908895756660741766
|
254
285
|
requirements: []
|
255
286
|
rubyforge_project:
|
256
|
-
rubygems_version:
|
287
|
+
rubygems_version: 1.8.23.2
|
257
288
|
signing_key:
|
258
|
-
specification_version:
|
289
|
+
specification_version: 3
|
259
290
|
summary: Build tool using Docker to specify build environment
|
260
291
|
test_files:
|
261
292
|
- spec/lib/construi/config_spec.rb
|
checksums.yaml
DELETED
@@ -1,7 +0,0 @@
|
|
1
|
-
---
|
2
|
-
SHA1:
|
3
|
-
metadata.gz: 94c464f6d921f079a8cb7c7c89ca5937ead50759
|
4
|
-
data.tar.gz: e18328c8283dc1c6df7572c951fcd756f640a15d
|
5
|
-
SHA512:
|
6
|
-
metadata.gz: 4b773069990d7e2465736d372f91a6d363aa3bb93cea7a0381a2ac06f48f4ef074a1aaa0547f927f8ece9a1e9ae06958126a8a09856128d1ed22862f782de4a6
|
7
|
-
data.tar.gz: 5a7e38bce29e2cd0abc02bee3c2695dbe029357b088431c64a0ab0599832c15f183c8285772fbbbf982e85f539de772c82d2fcce142828666c8c2730e7037f0e
|