fpm-fry 0.7.2 → 0.7.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/lib/fpm/fry/client.rb +22 -10
- data/lib/fpm/fry/command/cook.rb +76 -70
- metadata +2 -78
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0544f44b67264b68111bb6f5a96e8132a423e8816afd6367fede81aa505bf1aa
|
4
|
+
data.tar.gz: 1e987b5493f30d69e0cf7501dcf4acec92f5190825f701c0401f9e1d72df97f3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b32603c869cfb37fb0062996affc6dddee51d3bd55d92c2fb6ce16560f18fb078c3399626537d8c79a8f57db72c56876bfc7fa18563cb4052505255e36caf7b0
|
7
|
+
data.tar.gz: 991eff30e175e76f634a120ee8fe14c45c7a04034f66af39bc24912c91b7d1c7e928b9de7ca272d205540432408cd1c9fc0c1033753a61020714a13204ad3db0
|
data/lib/fpm/fry/client.rb
CHANGED
@@ -22,6 +22,10 @@ class FPM::Fry::Client
|
|
22
22
|
include FPM::Fry::WithData
|
23
23
|
end
|
24
24
|
|
25
|
+
class ContainerDeletionFailed < StandardError
|
26
|
+
include FPM::Fry::WithData
|
27
|
+
end
|
28
|
+
|
25
29
|
# Raised when trying to read file that can't be read e.g. because it's a
|
26
30
|
# directory.
|
27
31
|
class NotAFile < StandardError
|
@@ -111,7 +115,7 @@ class FPM::Fry::Client
|
|
111
115
|
)
|
112
116
|
end
|
113
117
|
rescue Excon::Error => e
|
114
|
-
|
118
|
+
logger.error("unexpected response when reading resource: url: #{url}, error: #{e}")
|
115
119
|
raise
|
116
120
|
end
|
117
121
|
if [404,500].include? res.status
|
@@ -165,14 +169,14 @@ class FPM::Fry::Client
|
|
165
169
|
end
|
166
170
|
|
167
171
|
def copy(name, resource, map, options = {})
|
168
|
-
ex = FPM::Fry::Tar::Extractor.new(logger:
|
172
|
+
ex = FPM::Fry::Tar::Extractor.new(logger: logger)
|
169
173
|
base = File.dirname(resource)
|
170
174
|
read(name, resource) do | entry |
|
171
175
|
file = File.join(base, entry.full_name).chomp('/')
|
172
176
|
file = file.sub(%r"\A\./",'')
|
173
177
|
to = map[file]
|
174
178
|
next unless to
|
175
|
-
|
179
|
+
logger.debug("Copy",name: file, to: to)
|
176
180
|
ex.extract_entry(to, entry, options)
|
177
181
|
end
|
178
182
|
end
|
@@ -182,7 +186,7 @@ class FPM::Fry::Client
|
|
182
186
|
res = agent.get(path: url, expects: [200, 204])
|
183
187
|
return JSON.parse(res.body)
|
184
188
|
rescue Excon::Error => e
|
185
|
-
|
189
|
+
logger.error("could not retrieve changes for: #{name}, url: #{url}, error: #{e}")
|
186
190
|
raise
|
187
191
|
end
|
188
192
|
|
@@ -220,27 +224,35 @@ class FPM::Fry::Client
|
|
220
224
|
)
|
221
225
|
data = JSON.parse(res.body)
|
222
226
|
if res.status != 201
|
223
|
-
|
227
|
+
logger.error(data["message"])
|
224
228
|
if res.status == 404
|
225
|
-
|
229
|
+
logger.info("execute docker pull #{image} first or specify --pull argument for fpm-fry")
|
226
230
|
end
|
227
231
|
raise ContainerCreationFailed.new("could not create container from #{image}", message: data["message"])
|
228
232
|
end
|
229
233
|
data['Id']
|
230
234
|
rescue Excon::Error => e
|
231
|
-
|
235
|
+
logger.error("could not create container from #{image}, url: #{url}, error: #{e}")
|
232
236
|
raise
|
233
237
|
end
|
234
238
|
|
235
239
|
def destroy(container)
|
236
240
|
return unless container
|
241
|
+
|
237
242
|
url = self.url('containers', container)
|
238
|
-
agent.delete(
|
243
|
+
res = agent.delete(
|
239
244
|
path: url,
|
240
|
-
expects: [204]
|
245
|
+
expects: [204, 409]
|
241
246
|
)
|
247
|
+
return unless res.status == 409
|
248
|
+
data = JSON.parse(res.body) rescue ({"message" => "could not parse response body: '#{res.body}'"})
|
249
|
+
if data["message"] =~ /removal of container .* is already in progress/
|
250
|
+
logger.info(data["message"])
|
251
|
+
else
|
252
|
+
raise ContainerDeletionFailed.new("could not destroy container #{container}", data)
|
253
|
+
end
|
242
254
|
rescue Excon::Error => e
|
243
|
-
|
255
|
+
logger.error("could not destroy container: #{container}, url: #{url}, error: #{e}")
|
244
256
|
raise
|
245
257
|
end
|
246
258
|
|
data/lib/fpm/fry/command/cook.rb
CHANGED
@@ -2,6 +2,10 @@ require 'fpm/fry/command'
|
|
2
2
|
module FPM; module Fry
|
3
3
|
class Command::Cook < Command
|
4
4
|
|
5
|
+
class BuildFailed < StandardError
|
6
|
+
include FPM::Fry::WithData
|
7
|
+
end
|
8
|
+
|
5
9
|
option '--keep', :flag, 'Keep the container after build'
|
6
10
|
option '--overwrite', :flag, 'Overwrite package', default: true
|
7
11
|
option '--verbose', :flag, 'Verbose output', default: false
|
@@ -212,79 +216,81 @@ module FPM; module Fry
|
|
212
216
|
end
|
213
217
|
|
214
218
|
def build!
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
args[:query] = { platform: platform } if platform
|
226
|
-
res = client.post(args)
|
227
|
-
JSON.parse(res.body)
|
228
|
-
rescue Excon::Error
|
229
|
-
logger.error "could not create #{build_image}, url: #{url}"
|
230
|
-
raise
|
231
|
-
end
|
232
|
-
container = body['Id']
|
233
|
-
begin
|
234
|
-
begin
|
235
|
-
url = client.url('containers',container,'start')
|
236
|
-
client.post(
|
237
|
-
headers: {
|
238
|
-
'Content-Type' => 'application/json'
|
239
|
-
},
|
240
|
-
path: url,
|
241
|
-
expects: [204],
|
242
|
-
body: JSON.generate({})
|
243
|
-
)
|
244
|
-
rescue Excon::Error
|
245
|
-
logger.error "could not start container #{container}, url: #{url}"
|
246
|
-
raise
|
247
|
-
end
|
219
|
+
container = create_build_container
|
220
|
+
start_build_container(container)
|
221
|
+
attach_to_build_container_and_stream_logs(container)
|
222
|
+
wait_for_build_container_to_shut_down(container)
|
223
|
+
yield container
|
224
|
+
ensure
|
225
|
+
unless keep?
|
226
|
+
client.destroy(container) if container
|
227
|
+
end
|
228
|
+
end
|
248
229
|
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
230
|
+
def create_build_container
|
231
|
+
url = client.url('containers','create')
|
232
|
+
args = {
|
233
|
+
headers: {
|
234
|
+
'Content-Type' => 'application/json'
|
235
|
+
},
|
236
|
+
path: url,
|
237
|
+
expects: [201],
|
238
|
+
body: JSON.generate({"Image" => build_image})
|
239
|
+
}
|
240
|
+
args[:query] = { platform: platform } if platform
|
241
|
+
res = client.post(args)
|
242
|
+
JSON.parse(res.body)['Id']
|
243
|
+
rescue Excon::Error
|
244
|
+
logger.error "could not create #{build_image}, url: #{url}"
|
245
|
+
raise
|
246
|
+
end
|
266
247
|
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
248
|
+
def start_build_container(container)
|
249
|
+
url = client.url('containers',container,'start')
|
250
|
+
client.post(
|
251
|
+
headers: {
|
252
|
+
'Content-Type' => 'application/json'
|
253
|
+
},
|
254
|
+
path: url,
|
255
|
+
expects: [204],
|
256
|
+
body: JSON.generate({})
|
257
|
+
)
|
258
|
+
rescue Excon::Error
|
259
|
+
logger.error "could not start container #{container}, url: #{url}"
|
260
|
+
raise
|
261
|
+
end
|
281
262
|
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
263
|
+
def attach_to_build_container_and_stream_logs(container)
|
264
|
+
url = client.url('containers',container,'attach?stderr=1&stdout=1&stream=1&logs=1')
|
265
|
+
client.post(
|
266
|
+
path: url,
|
267
|
+
body: '',
|
268
|
+
expects: [200],
|
269
|
+
middlewares: [
|
270
|
+
StreamParser.new(out,err),
|
271
|
+
Excon::Middleware::Expects,
|
272
|
+
Excon::Middleware::Instrumentor,
|
273
|
+
Excon::Middleware::Mock
|
274
|
+
]
|
275
|
+
)
|
276
|
+
rescue Excon::Error
|
277
|
+
logger.error "could not attach to container #{container}, url: #{url}"
|
278
|
+
raise
|
279
|
+
end
|
280
|
+
|
281
|
+
def wait_for_build_container_to_shut_down(container)
|
282
|
+
res = client.post(
|
283
|
+
path: client.url('containers',container,'wait'),
|
284
|
+
expects: [200],
|
285
|
+
body: ''
|
286
|
+
)
|
287
|
+
json = JSON.parse(res.body)
|
288
|
+
if json["StatusCode"] != 0
|
289
|
+
raise BuildFailed.new("Build script failed with non zero exit code", json)
|
287
290
|
end
|
291
|
+
rescue Excon::Error
|
292
|
+
logger.error "could not wait successfully for container #{container}, url: #{url}"
|
293
|
+
raise
|
288
294
|
end
|
289
295
|
|
290
296
|
def input_package(container)
|
@@ -292,7 +298,7 @@ module FPM; module Fry
|
|
292
298
|
logger: logger,
|
293
299
|
client: client,
|
294
300
|
keep_modified_files: builder.keep_modified_files,
|
295
|
-
verbose: verbose
|
301
|
+
verbose: verbose?,
|
296
302
|
)
|
297
303
|
builder.recipe.apply_input(input)
|
298
304
|
begin
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fpm-fry
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.7.
|
4
|
+
version: 0.7.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Maxime Lagresle
|
@@ -13,7 +13,7 @@ authors:
|
|
13
13
|
autorequire:
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
|
-
date: 2024-
|
16
|
+
date: 2024-03-06 00:00:00.000000000 Z
|
17
17
|
dependencies:
|
18
18
|
- !ruby/object:Gem::Dependency
|
19
19
|
name: excon
|
@@ -43,82 +43,6 @@ dependencies:
|
|
43
43
|
- - "~>"
|
44
44
|
- !ruby/object:Gem::Version
|
45
45
|
version: '1.13'
|
46
|
-
- !ruby/object:Gem::Dependency
|
47
|
-
name: rake
|
48
|
-
requirement: !ruby/object:Gem::Requirement
|
49
|
-
requirements:
|
50
|
-
- - "~>"
|
51
|
-
- !ruby/object:Gem::Version
|
52
|
-
version: '12.0'
|
53
|
-
type: :development
|
54
|
-
prerelease: false
|
55
|
-
version_requirements: !ruby/object:Gem::Requirement
|
56
|
-
requirements:
|
57
|
-
- - "~>"
|
58
|
-
- !ruby/object:Gem::Version
|
59
|
-
version: '12.0'
|
60
|
-
- !ruby/object:Gem::Dependency
|
61
|
-
name: rspec
|
62
|
-
requirement: !ruby/object:Gem::Requirement
|
63
|
-
requirements:
|
64
|
-
- - "~>"
|
65
|
-
- !ruby/object:Gem::Version
|
66
|
-
version: '3.0'
|
67
|
-
- - ">="
|
68
|
-
- !ruby/object:Gem::Version
|
69
|
-
version: 3.0.0
|
70
|
-
type: :development
|
71
|
-
prerelease: false
|
72
|
-
version_requirements: !ruby/object:Gem::Requirement
|
73
|
-
requirements:
|
74
|
-
- - "~>"
|
75
|
-
- !ruby/object:Gem::Version
|
76
|
-
version: '3.0'
|
77
|
-
- - ">="
|
78
|
-
- !ruby/object:Gem::Version
|
79
|
-
version: 3.0.0
|
80
|
-
- !ruby/object:Gem::Dependency
|
81
|
-
name: webmock
|
82
|
-
requirement: !ruby/object:Gem::Requirement
|
83
|
-
requirements:
|
84
|
-
- - "~>"
|
85
|
-
- !ruby/object:Gem::Version
|
86
|
-
version: '3.0'
|
87
|
-
type: :development
|
88
|
-
prerelease: false
|
89
|
-
version_requirements: !ruby/object:Gem::Requirement
|
90
|
-
requirements:
|
91
|
-
- - "~>"
|
92
|
-
- !ruby/object:Gem::Version
|
93
|
-
version: '3.0'
|
94
|
-
- !ruby/object:Gem::Dependency
|
95
|
-
name: coveralls
|
96
|
-
requirement: !ruby/object:Gem::Requirement
|
97
|
-
requirements:
|
98
|
-
- - ">="
|
99
|
-
- !ruby/object:Gem::Version
|
100
|
-
version: 0.8.23
|
101
|
-
type: :development
|
102
|
-
prerelease: false
|
103
|
-
version_requirements: !ruby/object:Gem::Requirement
|
104
|
-
requirements:
|
105
|
-
- - ">="
|
106
|
-
- !ruby/object:Gem::Version
|
107
|
-
version: 0.8.23
|
108
|
-
- !ruby/object:Gem::Dependency
|
109
|
-
name: simplecov
|
110
|
-
requirement: !ruby/object:Gem::Requirement
|
111
|
-
requirements:
|
112
|
-
- - ">="
|
113
|
-
- !ruby/object:Gem::Version
|
114
|
-
version: '0'
|
115
|
-
type: :development
|
116
|
-
prerelease: false
|
117
|
-
version_requirements: !ruby/object:Gem::Requirement
|
118
|
-
requirements:
|
119
|
-
- - ">="
|
120
|
-
- !ruby/object:Gem::Version
|
121
|
-
version: '0'
|
122
46
|
description: deep-fried package builder
|
123
47
|
email: dennis.konert@new-work.se
|
124
48
|
executables:
|