fpm-fry 0.2.1 → 0.2.2
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/bin/fpm-fry +1 -0
- data/lib/cabin/nice_output.rb +8 -0
- data/lib/fpm/fry/client.rb +4 -5
- data/lib/fpm/fry/command/cook.rb +1 -1
- data/lib/fpm/fry/docker_file.rb +14 -0
- data/lib/fpm/fry/os_db.rb +2 -1
- data/lib/fpm/fry/plugin/script_helper.rb +2 -1
- data/lib/fpm/fry/plugin/service.rb +13 -0
- data/lib/fpm/fry/recipe/builder.rb +8 -0
- data/lib/fpm/fry/recipe.rb +4 -0
- data/lib/fpm/fry/source/git.rb +5 -5
- data/lib/fpm/fry/source/package.rb +26 -9
- data/lib/fpm/fry/source.rb +4 -4
- data/lib/fpm/fry/templates/debian/after_remove.erb +13 -0
- data/lib/fpm/fry/templates/redhat/after_remove.erb +6 -0
- data/lib/fpm/fry/templates/systemd.erb +19 -0
- data/lib/fpm/fry/with_data.rb +11 -0
- metadata +19 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 30f03302993885946a899feba8c6f6a63f9cc46a
|
4
|
+
data.tar.gz: 6cf9d78c60aca34c1c8feab1b58ddd9234fe28b9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d832baed68a8f809a009bcdb7d8addb4847393475f1bc4ae12d5a562210ddbc3506f1e6e310d4798b68197b75a649152ea05449ce2ef18ad4e34f321094efb9d
|
7
|
+
data.tar.gz: ca77a79b3aad02271b8dd9cf4e9c31d556c7125065ea7b1df0917d3677a433b64b8a32a7bd90e3a527a5f7016533dcd766393472cf5c30cb8b4d99e16fb6107f
|
data/bin/fpm-fry
CHANGED
data/lib/cabin/nice_output.rb
CHANGED
@@ -35,6 +35,14 @@ class Cabin::NiceOutput
|
|
35
35
|
|
36
36
|
def <<(event)
|
37
37
|
data = event.clone
|
38
|
+
if data[:exception].respond_to? :data
|
39
|
+
ed = data[:exception].data
|
40
|
+
if ed.kind_of? Hash
|
41
|
+
data = ed.merge( data )
|
42
|
+
else
|
43
|
+
data[:exception_data] = ed.inspect
|
44
|
+
end
|
45
|
+
end
|
38
46
|
data.delete(:line)
|
39
47
|
data.delete(:file)
|
40
48
|
level = data.delete(:level) || :normal
|
data/lib/fpm/fry/client.rb
CHANGED
@@ -70,12 +70,11 @@ class FPM::Fry::Client
|
|
70
70
|
|
71
71
|
def read(name, resource)
|
72
72
|
return to_enum(:read, name, resource) unless block_given?
|
73
|
-
|
74
|
-
|
75
|
-
|
73
|
+
res = agent.get(
|
74
|
+
path: url('containers',name,'archive'),
|
75
|
+
query: URI.encode_www_form('path' => resource),
|
76
76
|
headers: { 'Content-Type' => 'application/json' },
|
77
|
-
|
78
|
-
expects: [200,500]
|
77
|
+
expects: [200,404,500]
|
79
78
|
)
|
80
79
|
if res.status == 500
|
81
80
|
raise FileNotFound, "File #{resource.inspect} not found: #{res.body}"
|
data/lib/fpm/fry/command/cook.rb
CHANGED
@@ -237,7 +237,7 @@ module FPM; module Fry
|
|
237
237
|
)
|
238
238
|
json = JSON.parse(res.body)
|
239
239
|
if json["StatusCode"] != 0
|
240
|
-
raise "Build failed
|
240
|
+
raise Fry::WithData("Build failed", exit_code: json["StatusCode"])
|
241
241
|
end
|
242
242
|
return yield container
|
243
243
|
ensure
|
data/lib/fpm/fry/docker_file.rb
CHANGED
@@ -90,6 +90,15 @@ module FPM; module Fry
|
|
90
90
|
df << "FROM #{base}"
|
91
91
|
df << "WORKDIR /tmp/build"
|
92
92
|
|
93
|
+
# need to add external sources before running any command
|
94
|
+
recipe.build_mounts.each do |source, target|
|
95
|
+
df << "ADD #{source} /tmp/build/#{target}"
|
96
|
+
end
|
97
|
+
|
98
|
+
recipe.apt_setup.each do |step|
|
99
|
+
df << "RUN #{step}"
|
100
|
+
end
|
101
|
+
|
93
102
|
if build_dependencies.any?
|
94
103
|
case(variables[:flavour])
|
95
104
|
when 'debian'
|
@@ -137,6 +146,11 @@ module FPM; module Fry
|
|
137
146
|
tar.add_file(NAME,'0777') do |io|
|
138
147
|
io.write(dockerfile)
|
139
148
|
end
|
149
|
+
recipe.build_mounts.each do |source, _|
|
150
|
+
tar.add_file(source,'0777') do |io|
|
151
|
+
io.write(File.read(source))
|
152
|
+
end
|
153
|
+
end
|
140
154
|
#tar.close
|
141
155
|
sio.rewind
|
142
156
|
return sio
|
data/lib/fpm/fry/os_db.rb
CHANGED
@@ -129,7 +129,20 @@ BASH
|
|
129
129
|
co.include "etc/init.d/#{name}"
|
130
130
|
end
|
131
131
|
when 'systemd' then
|
132
|
+
edit.add_file "/lib/systemd/system/#{name}.service", StringIO.new( env.render('systemd.erb') ), chmod: '644'
|
133
|
+
builder.plugin('script_helper') do |sh|
|
134
|
+
sh.after_install_or_upgrade(<<BASH)
|
135
|
+
systemctl preset #{Shellwords.shellescape name}.service
|
136
|
+
if systemctl is-enabled --quiet #{Shellwords.shellescape name}.service ; then
|
137
|
+
systemctl --system daemon-reload
|
138
|
+
systemctl try-reload-or-restart #{Shellwords.shellescape name}.service
|
139
|
+
fi
|
140
|
+
BASH
|
141
|
+
sh.before_remove_entirely(<<BASH)
|
142
|
+
systemctl disable --now #{Shellwords.shellescape name}.service
|
143
|
+
BASH
|
132
144
|
|
145
|
+
end
|
133
146
|
end
|
134
147
|
end
|
135
148
|
|
@@ -213,6 +213,14 @@ module FPM::Fry
|
|
213
213
|
recipe.source = source
|
214
214
|
end
|
215
215
|
|
216
|
+
def add(source, target)
|
217
|
+
recipe.build_mounts << [source, target]
|
218
|
+
end
|
219
|
+
|
220
|
+
def apt_setup(cmd)
|
221
|
+
recipe.apt_setup << cmd
|
222
|
+
end
|
223
|
+
|
216
224
|
def run(*args)
|
217
225
|
if args.first.kind_of? Hash
|
218
226
|
options = args.shift
|
data/lib/fpm/fry/recipe.rb
CHANGED
@@ -125,6 +125,8 @@ module FPM; module Fry
|
|
125
125
|
end
|
126
126
|
|
127
127
|
attr_accessor :source,
|
128
|
+
:build_mounts,
|
129
|
+
:apt_setup,
|
128
130
|
:before_build_steps,
|
129
131
|
:steps,
|
130
132
|
:packages,
|
@@ -139,6 +141,8 @@ module FPM; module Fry
|
|
139
141
|
@packages[0].files << '**'
|
140
142
|
@build_depends = {}
|
141
143
|
@input_hooks = []
|
144
|
+
@build_mounts = []
|
145
|
+
@apt_setup = []
|
142
146
|
end
|
143
147
|
|
144
148
|
def depends
|
data/lib/fpm/fry/source/git.rb
CHANGED
@@ -23,12 +23,12 @@ module FPM; module Fry ; module Source
|
|
23
23
|
def update
|
24
24
|
begin
|
25
25
|
if !File.exists? repodir
|
26
|
-
if git('init', '--bare') != 0
|
27
|
-
raise "Initializing git repository failed"
|
26
|
+
if (ecode = git('init', '--bare')) != 0
|
27
|
+
raise CacheFailed.new("Initializing git repository failed", exit_code: ecode)
|
28
28
|
end
|
29
29
|
end
|
30
|
-
if git('fetch','--depth=1', url.to_s, rev) != 0
|
31
|
-
raise "Failed to fetch from remote
|
30
|
+
if (ecode = git('fetch','--depth=1', url.to_s, rev)) != 0
|
31
|
+
raise CacheFailed.new("Failed to fetch from remote", exit_code: ecode, url: url.to_s, rev: rev)
|
32
32
|
end
|
33
33
|
return self
|
34
34
|
rescue Errno::ENOENT
|
@@ -69,7 +69,7 @@ module FPM; module Fry ; module Source
|
|
69
69
|
err.each_line do |line|
|
70
70
|
logger.debug(line.chomp)
|
71
71
|
end
|
72
|
-
return thr.value
|
72
|
+
return thr.value.exitstatus
|
73
73
|
end
|
74
74
|
end
|
75
75
|
|
@@ -4,6 +4,7 @@ require 'net/http'
|
|
4
4
|
require 'forwardable'
|
5
5
|
require 'zlib'
|
6
6
|
require 'fpm/fry/source'
|
7
|
+
require 'cabin'
|
7
8
|
module FPM; module Fry ; module Source
|
8
9
|
class Package
|
9
10
|
|
@@ -29,6 +30,12 @@ module FPM; module Fry ; module Source
|
|
29
30
|
|
30
31
|
def_delegators :package, :url, :checksum, :checksum_algorithm, :agent, :logger, :file_map
|
31
32
|
|
33
|
+
def cachekey
|
34
|
+
@observed_checksum || checksum
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
|
32
39
|
def initialize(*_)
|
33
40
|
super
|
34
41
|
if !checksum
|
@@ -52,7 +59,9 @@ module FPM; module Fry ; module Source
|
|
52
59
|
end
|
53
60
|
d = checksum_algorithm.new
|
54
61
|
f = nil
|
55
|
-
|
62
|
+
actual_url = url.to_s
|
63
|
+
fetch_url(url) do | last_url, resp|
|
64
|
+
actual_url = last_url.to_s
|
56
65
|
begin
|
57
66
|
f = File.new(tempfile,'w')
|
58
67
|
resp.read_body do | chunk |
|
@@ -67,10 +76,10 @@ module FPM; module Fry ; module Source
|
|
67
76
|
end
|
68
77
|
|
69
78
|
@observed_checksum = d.hexdigest
|
70
|
-
logger.debug("
|
79
|
+
logger.debug("Got checksum", checksum: @observed_checksum, url: actual_url)
|
71
80
|
if checksum
|
72
81
|
if d.hexdigest != checksum
|
73
|
-
raise CacheFailed.new("Checksum failed",given: d.hexdigest, expected: checksum)
|
82
|
+
raise CacheFailed.new("Checksum failed",given: d.hexdigest, expected: checksum, url: actual_url)
|
74
83
|
end
|
75
84
|
else
|
76
85
|
return true
|
@@ -88,9 +97,9 @@ module FPM; module Fry ; module Source
|
|
88
97
|
logger.debug("Following redirect", url: url.to_s , location: resp['location'])
|
89
98
|
return fetch_url( resp['location'], redirs - 1, &block)
|
90
99
|
when Net::HTTPSuccess
|
91
|
-
return block.call(resp)
|
100
|
+
return block.call( url, resp)
|
92
101
|
else
|
93
|
-
raise CacheFailed.new('Unable to fetch file',url: url.to_s, http_code: resp.code, http_message: resp.message)
|
102
|
+
raise CacheFailed.new('Unable to fetch file',url: url.to_s, http_code: resp.code.to_i, http_message: resp.message)
|
94
103
|
end
|
95
104
|
end
|
96
105
|
end
|
@@ -99,10 +108,6 @@ module FPM; module Fry ; module Source
|
|
99
108
|
File.join(tempdir,File.basename(url.path))
|
100
109
|
end
|
101
110
|
|
102
|
-
def cachekey
|
103
|
-
@observed_checksum || checksum
|
104
|
-
end
|
105
|
-
|
106
111
|
end
|
107
112
|
|
108
113
|
class TarCache < Cache
|
@@ -133,6 +138,17 @@ module FPM; module Fry ; module Source
|
|
133
138
|
end
|
134
139
|
end
|
135
140
|
|
141
|
+
class TarBz2Cache < TarCache
|
142
|
+
|
143
|
+
def tar_io
|
144
|
+
update!
|
145
|
+
cmd = ['bzcat',tempfile]
|
146
|
+
logger.debug("Running bzcat",cmd: cmd)
|
147
|
+
return IO.popen(cmd)
|
148
|
+
end
|
149
|
+
|
150
|
+
end
|
151
|
+
|
136
152
|
class ZipCache < Cache
|
137
153
|
|
138
154
|
def tar_io
|
@@ -189,6 +205,7 @@ module FPM; module Fry ; module Source
|
|
189
205
|
'.tar' => TarCache,
|
190
206
|
'.tar.gz' => TarGzCache,
|
191
207
|
'.tgz' => TarGzCache,
|
208
|
+
'.tar.bz2' => TarBz2Cache,
|
192
209
|
'.zip' => ZipCache,
|
193
210
|
'.bin' => PlainCache,
|
194
211
|
'.bundle' => PlainCache
|
data/lib/fpm/fry/source.rb
CHANGED
@@ -2,14 +2,14 @@ module FPM; module Fry ; module Source
|
|
2
2
|
|
3
3
|
class CacheFailed < StandardError
|
4
4
|
|
5
|
-
attr :
|
5
|
+
attr :data
|
6
6
|
|
7
|
-
def initialize(e,
|
7
|
+
def initialize(e, data = {})
|
8
8
|
if e.kind_of? Exception
|
9
|
-
@
|
9
|
+
@data = {reason: e}.merge data
|
10
10
|
super(e.message)
|
11
11
|
else
|
12
|
-
@
|
12
|
+
@data = data.dup
|
13
13
|
super(e.to_s)
|
14
14
|
end
|
15
15
|
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
[Unit]
|
2
|
+
Description=<%= description %>
|
3
|
+
|
4
|
+
[Service]
|
5
|
+
Type=simple
|
6
|
+
ExecStart=<%= Shellwords.shelljoin(command) %>
|
7
|
+
Restart=on-failure
|
8
|
+
<% if user %>User=<%= user %>
|
9
|
+
<% end -%>
|
10
|
+
<% if group %>Group=<%= group %>
|
11
|
+
<% end -%>
|
12
|
+
<% if chdir %>WorkingDirectory=<%= chdir %>
|
13
|
+
<% end -%>
|
14
|
+
<% limits.each do | name, (soft, hard) | -%>
|
15
|
+
Limit<%= name.upcase %>=<%= soft %>:<%= hard %>
|
16
|
+
<% end -%>
|
17
|
+
|
18
|
+
[Install]
|
19
|
+
WantedBy=multi-user.target
|
data/lib/fpm/fry/with_data.rb
CHANGED
@@ -1,6 +1,17 @@
|
|
1
1
|
module FPM ; module Fry
|
2
2
|
|
3
|
+
# Annotates an arbitrary exception with logable data.
|
4
|
+
#
|
5
|
+
# @example
|
6
|
+
# raise FPM::Fry::WithData("Something went wrong", key: "value")
|
7
|
+
# @param [String,Exception] ex
|
8
|
+
# @param [Hash] data
|
9
|
+
# @return [Exception] annotated exception
|
10
|
+
#
|
3
11
|
def self.WithData(ex, data)
|
12
|
+
if ex.kind_of? String
|
13
|
+
ex = StandardError.new(ex)
|
14
|
+
end
|
4
15
|
ex.define_singleton_method(:data){ data }
|
5
16
|
return ex
|
6
17
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fpm-fry
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Hannes Georg
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-09-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: excon
|
@@ -38,6 +38,20 @@ dependencies:
|
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '1.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: json
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '1.8'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '1.8'
|
41
55
|
description: deep-fried package builder
|
42
56
|
email: hannes.georg@xing.com
|
43
57
|
executables:
|
@@ -80,11 +94,14 @@ files:
|
|
80
94
|
- lib/fpm/fry/stream_parser.rb
|
81
95
|
- lib/fpm/fry/tar.rb
|
82
96
|
- lib/fpm/fry/templates/debian/after_install.erb
|
97
|
+
- lib/fpm/fry/templates/debian/after_remove.erb
|
83
98
|
- lib/fpm/fry/templates/debian/before_install.erb
|
84
99
|
- lib/fpm/fry/templates/debian/before_remove.erb
|
85
100
|
- lib/fpm/fry/templates/redhat/after_install.erb
|
101
|
+
- lib/fpm/fry/templates/redhat/after_remove.erb
|
86
102
|
- lib/fpm/fry/templates/redhat/before_install.erb
|
87
103
|
- lib/fpm/fry/templates/redhat/before_remove.erb
|
104
|
+
- lib/fpm/fry/templates/systemd.erb
|
88
105
|
- lib/fpm/fry/templates/sysv.erb
|
89
106
|
- lib/fpm/fry/templates/upstart.erb
|
90
107
|
- lib/fpm/fry/ui.rb
|