construi 0.37.0 → 0.38.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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 `get rev-parse HEAD`:develop
25
+ git push origin `git rev-parse HEAD`:develop
25
26
  echo "Push to develop done."
26
27
 
27
28
  echo "Release done."
@@ -14,7 +14,7 @@ module Construi
14
14
  end
15
15
 
16
16
  def delete
17
- @container.delete
17
+ @container.delete force: true, v: true
18
18
  end
19
19
 
20
20
  def attach_stdout
@@ -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.seed(self).reduce(files) { |i, f| i.insert_local f }.image
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
- chmod = "chmod -R #{permissions} #{file}"
55
+ def chmod(file, permissions, options = {})
56
+ chmod = "chmod -R #{permissions} #{file}"
54
57
 
55
- puts " > #{chmod}"
56
- run chmod
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? Image and id == other.id
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
- raise Error, "Invalid image configuration: #{config}" unless image
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? or progress.empty?
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, :rm => 0) { |s|
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, env = [])
119
- map { |i| i.run cmd, env: env }
124
+ def run(cmd, options = {})
125
+ map { |i| i.run cmd, options }
120
126
  end
121
127
 
122
128
  def map
@@ -1,3 +1,3 @@
1
1
  module Construi
2
- VERSION = "0.37.0"
2
+ VERSION = "0.38.0"
3
3
  end
@@ -5,11 +5,15 @@ require 'securerandom'
5
5
 
6
6
  RSpec.describe Construi::Image do
7
7
  let(:id) { SecureRandom.hex(16) }
8
- let(:docker_image) { instance_double(Docker::Image, :id => id).as_null_object }
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) { { env: [] } }
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 { allow(docker_image).to receive(:info).and_return({ 'RepoTags' => tag }) }
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
- before { allow(docker_image).to receive(:info).and_return({ 'RepoTags' => '<none>:<none>' }) }
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
- Config = Struct.new :image, :build, :files
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(:config) { Config.new image, build, files }
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(:env) { ['VAR1=VALUE1'] }
249
+ let(:options) { { env: ['VAR1=VALUE1']} }
233
250
 
234
251
  context "single run" do
235
- subject! { intermediate_image.run(cmd, env) }
252
+ subject! { intermediate_image.run(cmd, options) }
236
253
 
237
- it { expect(image).to have_received(:run).with(cmd, env: env) }
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, env).run(cmd, env) }
260
+ subject! { intermediate_image.run(cmd, options).run(cmd, options) }
244
261
 
245
- it { expect(second_image).to have_received(:run).with(cmd, env: env) }
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.37.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-03 00:00:00.000000000 Z
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
- - ".gitignore"
204
- - ".rspec"
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: 2.2.2
287
+ rubygems_version: 1.8.23.2
257
288
  signing_key:
258
- specification_version: 4
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