fpm-cookery 0.34.0 → 0.35.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.
- checksums.yaml +4 -4
- data/.github/workflows/ruby.yml +23 -0
- data/CHANGELOG.md +3 -0
- data/docker/Dockerfile.ubuntu-1604 +27 -0
- data/docker/docker-entrypoint.sh +38 -0
- data/lib/fpm/cookery/cli.rb +22 -2
- data/lib/fpm/cookery/config.rb +9 -2
- data/lib/fpm/cookery/docker_packager.rb +109 -0
- data/lib/fpm/cookery/facts.rb +1 -1
- data/lib/fpm/cookery/recipe.rb +2 -2
- data/lib/fpm/cookery/version.rb +1 -1
- data/spec/config_spec.rb +7 -1
- data/spec/facts_spec.rb +3 -3
- data/spec/recipe_spec.rb +19 -0
- metadata +6 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3a561efdfc9652a27acb7f35a433d93cd063bfb0
|
4
|
+
data.tar.gz: 5a20b744b3b77ea485c29553316938b3ada4982d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 14313ecb17e285a764f981fbd67fb60b136183999df07cb1eaf2b6c76cefc310f80d4952a9e191c854bbd9ddfca5a51d634c983285f80ef4688db342a987396a
|
7
|
+
data.tar.gz: fa98c581f573b84022e03be9bffff9b92e92e964eb7b2508e9c49eb0e0ef238006775ee5a7778e86a26f037170df8745eb156b2ce10b5d296ddc71851fe98fcf
|
@@ -0,0 +1,23 @@
|
|
1
|
+
name: Ruby
|
2
|
+
|
3
|
+
on: [push]
|
4
|
+
|
5
|
+
jobs:
|
6
|
+
build:
|
7
|
+
|
8
|
+
runs-on: ubuntu-latest
|
9
|
+
strategy:
|
10
|
+
matrix:
|
11
|
+
ruby: [2.4, 2.5, 2.6]
|
12
|
+
|
13
|
+
steps:
|
14
|
+
- uses: actions/checkout@v1
|
15
|
+
- name: Set up Ruby ${{ matrix.ruby }}
|
16
|
+
uses: actions/setup-ruby@v1
|
17
|
+
with:
|
18
|
+
ruby-version: ${{ matrix.ruby }}.x
|
19
|
+
- name: Build and test with Rake
|
20
|
+
run: |
|
21
|
+
gem install bundler
|
22
|
+
bundle install --jobs 4 --retry 3
|
23
|
+
bundle exec rake
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,6 @@
|
|
1
|
+
# v0.35.0 (2019-12-18)
|
2
|
+
* Add support for building packages inside Docker containers.
|
3
|
+
|
1
4
|
# v0.34.0 (2019-06-01)
|
2
5
|
* Use factor defaults for `platform` and `target` values. (FooBarQuaxx / #189)
|
3
6
|
* Add `:username` and `:password` parameters to the SVN source handler. (tomeon / #191)
|
@@ -0,0 +1,27 @@
|
|
1
|
+
FROM ubuntu:16.04
|
2
|
+
|
3
|
+
RUN apt-get update
|
4
|
+
RUN \
|
5
|
+
apt-get install --no-install-recommends -y \
|
6
|
+
curl \
|
7
|
+
wget \
|
8
|
+
git \
|
9
|
+
ruby2.3-dev \
|
10
|
+
build-essential \
|
11
|
+
man-db \
|
12
|
+
&& gem install --no-ri --no-rdoc fpm-cookery \
|
13
|
+
&& apt-get clean \
|
14
|
+
&& rm -rf \
|
15
|
+
/tmp/* \
|
16
|
+
/root/.gem \
|
17
|
+
/var/cache/debconf/* \
|
18
|
+
/var/lib/gems/*/cache/* \
|
19
|
+
/var/lib/apt/lists/* \
|
20
|
+
/var/log/* \
|
21
|
+
/usr/share/X11 \
|
22
|
+
/usr/share/doc/*
|
23
|
+
|
24
|
+
COPY docker-entrypoint.sh /
|
25
|
+
|
26
|
+
ENTRYPOINT ["/docker-entrypoint.sh"]
|
27
|
+
CMD ["fpm-cook"]
|
@@ -0,0 +1,38 @@
|
|
1
|
+
#!/bin/bash
|
2
|
+
|
3
|
+
set -eo pipefail
|
4
|
+
|
5
|
+
if [ "$1" != "fpm-cook" ]; then
|
6
|
+
exec "$@"
|
7
|
+
fi
|
8
|
+
|
9
|
+
# Signal fpm-cook that we are already running inside a container to avoid
|
10
|
+
# trying to start another one.
|
11
|
+
export FPMC_INSIDE_DOCKER=true
|
12
|
+
|
13
|
+
if [ -x "/usr/bin/apt-get" ]; then
|
14
|
+
# Ubuntu/Debian containers use a custom apt config to remove archives
|
15
|
+
# after installing a package. We don't want that because it removes
|
16
|
+
# the possibility to cache the apt archive directory.
|
17
|
+
rm -f /etc/apt/apt.conf.d/docker-clean
|
18
|
+
|
19
|
+
# Make sure we have updated apt repositories. Container images usually
|
20
|
+
# have either no updated lists or they are outdated.
|
21
|
+
if [ -n "$FPMC_DEBUG" ]; then
|
22
|
+
apt-get update
|
23
|
+
else
|
24
|
+
apt-get update >/dev/null
|
25
|
+
fi
|
26
|
+
fi
|
27
|
+
|
28
|
+
# Remove existing temporary directories to ensure a full build
|
29
|
+
rm -rf tmp-build tmp-dest
|
30
|
+
|
31
|
+
shift
|
32
|
+
fpm-cook "$@"
|
33
|
+
|
34
|
+
if [ -n "$FPMC_UID" -a -n "$FPMC_GID" ]; then
|
35
|
+
# Change ownership to make sure the user that executed fpm-cook can
|
36
|
+
# modify created files.
|
37
|
+
chown -R ${FPMC_UID}:${FPMC_GID} cache pkg tmp-build tmp-dest
|
38
|
+
fi
|
data/lib/fpm/cookery/cli.rb
CHANGED
@@ -2,6 +2,7 @@ require 'fpm/cookery/book_hook'
|
|
2
2
|
require 'fpm/cookery/recipe'
|
3
3
|
require 'fpm/cookery/facts'
|
4
4
|
require 'fpm/cookery/packager'
|
5
|
+
require 'fpm/cookery/docker_packager'
|
5
6
|
require 'fpm/cookery/chain_packager'
|
6
7
|
require 'fpm/cookery/omnibus_packager'
|
7
8
|
require 'fpm/cookery/log'
|
@@ -36,6 +37,20 @@ module FPM
|
|
36
37
|
option '--vendor-delimiter', 'DELIMITER', 'vendor delimiter for version string',
|
37
38
|
:attribute_name => 'vendor_delimiter'
|
38
39
|
|
40
|
+
# Docker related flags
|
41
|
+
option '--docker', :flag, 'Execute fpm-cookery inside a Docker container',
|
42
|
+
:attribute_name => 'docker'
|
43
|
+
option '--docker-bin', 'BINARY', 'Docker binary to use',
|
44
|
+
:attribute_name => 'docker_bin'
|
45
|
+
option '--docker-image', 'IMAGE-NAME', 'Docker image to use',
|
46
|
+
:attribute_name => 'docker_image'
|
47
|
+
option '--docker-keep-container', :flag, 'Keep Docker container after build (e.g. to debug issues)',
|
48
|
+
:attribute_name => 'docker_keep_container'
|
49
|
+
option '--docker-cache', 'PATHS', 'Container paths to cache (can be a comma separated list)',
|
50
|
+
:attribute_name => 'docker_cache'
|
51
|
+
option '--dockerfile', 'PATHS', 'The Dockerfile to use for a custom container',
|
52
|
+
:attribute_name => 'dockerfile'
|
53
|
+
|
39
54
|
class Command < self
|
40
55
|
def self.add_recipe_parameter!
|
41
56
|
parameter '[RECIPE]', 'the recipe file', :default => 'recipe.rb'
|
@@ -116,7 +131,10 @@ module FPM
|
|
116
131
|
add_recipe_parameter!
|
117
132
|
|
118
133
|
def exec(config, recipe, packager)
|
119
|
-
if
|
134
|
+
# Don't try to launch a new container if we are already running inside one
|
135
|
+
if (config.docker == true or recipe.docker == true) and ENV['FPMC_INSIDE_DOCKER'].nil?
|
136
|
+
FPM::Cookery::DockerPackager.new(recipe, config).run
|
137
|
+
elsif recipe.omnibus_package == true
|
120
138
|
FPM::Cookery::OmnibusPackager.new(packager, config).run
|
121
139
|
elsif recipe.chain_package == true
|
122
140
|
FPM::Cookery::ChainPackager.new(packager, config).run
|
@@ -146,7 +164,9 @@ module FPM
|
|
146
164
|
add_recipe_parameter!
|
147
165
|
|
148
166
|
def exec(config, recipe, packager)
|
149
|
-
if
|
167
|
+
if config.docker == true
|
168
|
+
# Nothing to do!
|
169
|
+
elsif recipe.omnibus_package == true
|
150
170
|
FPM::Cookery::OmnibusPackager.new(packager, config).install_build_deps
|
151
171
|
elsif recipe.chain_package == true
|
152
172
|
FPM::Cookery::ChainPackager.new(packager, config).install_build_deps
|
data/lib/fpm/cookery/config.rb
CHANGED
@@ -8,7 +8,8 @@ module FPM
|
|
8
8
|
:color, :debug, :target, :platform, :maintainer, :vendor,
|
9
9
|
:skip_package, :keep_destdir, :dependency_check, :quiet,
|
10
10
|
:tmp_root, :pkg_dir, :cache_dir, :data_dir, :hiera_config,
|
11
|
-
:vendor_delimiter
|
11
|
+
:vendor_delimiter, :docker, :docker_image, :docker_keep_container,
|
12
|
+
:docker_cache, :docker_bin, :dockerfile
|
12
13
|
].freeze
|
13
14
|
|
14
15
|
DEFAULTS = {
|
@@ -17,7 +18,13 @@ module FPM
|
|
17
18
|
:dependency_check => true,
|
18
19
|
:skip_package => false,
|
19
20
|
:keep_destdir => false,
|
20
|
-
:quiet => false
|
21
|
+
:quiet => false,
|
22
|
+
:docker => false,
|
23
|
+
:docker_image => nil,
|
24
|
+
:docker_keep_container => false,
|
25
|
+
:docker_cache => nil,
|
26
|
+
:docker_bin => 'docker',
|
27
|
+
:dockerfile => 'Dockerfile'
|
21
28
|
}.freeze
|
22
29
|
|
23
30
|
def self.load_file(paths)
|
@@ -0,0 +1,109 @@
|
|
1
|
+
require 'digest/sha1'
|
2
|
+
require 'fileutils'
|
3
|
+
require 'pathname'
|
4
|
+
|
5
|
+
require 'fpm/cookery/version'
|
6
|
+
require 'fpm/cookery/facts'
|
7
|
+
require 'fpm/cookery/packager'
|
8
|
+
require 'fpm/cookery/exceptions'
|
9
|
+
|
10
|
+
# Runs the package creation inside a Docker container.
|
11
|
+
module FPM
|
12
|
+
module Cookery
|
13
|
+
class DockerPackager
|
14
|
+
include FPM::Cookery::Utils
|
15
|
+
|
16
|
+
attr_reader :packager, :recipe, :config
|
17
|
+
|
18
|
+
def initialize(recipe, config)
|
19
|
+
@recipe = recipe
|
20
|
+
@config = config
|
21
|
+
end
|
22
|
+
|
23
|
+
def run
|
24
|
+
recipe_dir = File.dirname(recipe.filename)
|
25
|
+
|
26
|
+
# The cli settings should have precendence
|
27
|
+
image_name = config.docker_image || recipe.docker_image
|
28
|
+
cache_paths = get_cache_paths
|
29
|
+
docker_bin = config.docker_bin.nil? || config.docker_bin.empty? ? 'docker' : config.docker_bin
|
30
|
+
dockerfile = get_dockerfile(recipe_dir)
|
31
|
+
|
32
|
+
if File.exist?(dockerfile)
|
33
|
+
image_name = "local/fpm-cookery/#{File.basename(recipe_dir)}:latest"
|
34
|
+
Log.info "Building custom Docker image #{image_name} from #{dockerfile}"
|
35
|
+
build_cmd = [
|
36
|
+
config.docker_bin, 'build',
|
37
|
+
'-f', dockerfile,
|
38
|
+
'-t', image_name,
|
39
|
+
'--force-rm',
|
40
|
+
'.'
|
41
|
+
].compact.flatten.join(' ')
|
42
|
+
sh build_cmd
|
43
|
+
else
|
44
|
+
Log.warn "File #{dockerfile} does not exist - not building a custom Docker image"
|
45
|
+
end
|
46
|
+
|
47
|
+
if image_name.nil? || image_name.empty?
|
48
|
+
image_name = "fpm-cookery:#{FPM::Cookery::VERSION}-#{FPM::Cookery::Facts.platform}-#{FPM::Cookery::Facts.osrelease}"
|
49
|
+
end
|
50
|
+
|
51
|
+
Log.info "Building #{recipe.name}-#{recipe.version} inside a Docker container using image #{image_name}"
|
52
|
+
Log.info "Mounting #{recipe_dir} as /recipe"
|
53
|
+
|
54
|
+
cmd = [
|
55
|
+
config.docker_bin, "run", "-ti",
|
56
|
+
"--name", "fpm-cookery-build-#{File.basename(recipe_dir)}",
|
57
|
+
config.docker_keep_container ? nil : "--rm",
|
58
|
+
"-e", "FPMC_UID=#{Process.uid}",
|
59
|
+
"-e", "FPMC_GID=#{Process.gid}",
|
60
|
+
config.debug ? ["-e", "FPMC_DEBUG=true"] : nil,
|
61
|
+
build_cache_mounts(cache_paths),
|
62
|
+
"-v", "#{recipe_dir}:/recipe",
|
63
|
+
"-w", "/recipe",
|
64
|
+
image_name,
|
65
|
+
"fpm-cook", "package",
|
66
|
+
config.debug ? '-D' : nil,
|
67
|
+
File.basename(recipe.filename)
|
68
|
+
].compact.flatten.join(' ')
|
69
|
+
|
70
|
+
|
71
|
+
Log.info "Running: #{cmd}"
|
72
|
+
begin
|
73
|
+
sh cmd
|
74
|
+
rescue => e
|
75
|
+
Log.debug e
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
private
|
80
|
+
|
81
|
+
def get_dockerfile(recipe_dir)
|
82
|
+
path = if config.dockerfile.nil? || config.dockerfile.empty?
|
83
|
+
Pathname.new(recipe.dockerfile)
|
84
|
+
else
|
85
|
+
Pathname.new(config.dockerfile)
|
86
|
+
end
|
87
|
+
|
88
|
+
path.absolute? ? path.to_s : File.join(recipe_dir, path.to_s)
|
89
|
+
end
|
90
|
+
|
91
|
+
def get_cache_paths
|
92
|
+
if config.docker_cache.nil? || config.docker_cache.empty?
|
93
|
+
recipe.docker_cache
|
94
|
+
else
|
95
|
+
config.docker_cache.split(',').select do |path|
|
96
|
+
!path.empty?
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
def build_cache_mounts(cache_paths)
|
102
|
+
cache_paths.map do |path|
|
103
|
+
next if path.nil? || path.empty?
|
104
|
+
"-v #{recipe.cachedir}/docker/#{Digest::SHA256.hexdigest(path)}:#{path}"
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
data/lib/fpm/cookery/facts.rb
CHANGED
data/lib/fpm/cookery/recipe.rb
CHANGED
@@ -34,12 +34,12 @@ module FPM
|
|
34
34
|
:revision, :section, :sha1, :sha256, :sha512, :spec, :vendor, :version,
|
35
35
|
:pre_install, :post_install, :pre_uninstall, :post_uninstall,
|
36
36
|
:license, :omnibus_package, :omnibus_dir, :chain_package,
|
37
|
-
:default_prefix
|
37
|
+
:default_prefix, :docker, :docker_image, :dockerfile
|
38
38
|
|
39
39
|
attr_rw_list :build_depends, :config_files, :conflicts, :depends,
|
40
40
|
:exclude, :patches, :provides, :replaces, :omnibus_recipes,
|
41
41
|
:omnibus_additional_paths, :chain_recipes,
|
42
|
-
:directories
|
42
|
+
:directories, :docker_cache
|
43
43
|
|
44
44
|
attr_rw_hash :fpm_attributes, :environment
|
45
45
|
|
data/lib/fpm/cookery/version.rb
CHANGED
data/spec/config_spec.rb
CHANGED
@@ -165,7 +165,13 @@ describe 'Config' do
|
|
165
165
|
:skip_package => false,
|
166
166
|
:keep_destdir => false,
|
167
167
|
:dependency_check => true,
|
168
|
-
:quiet => false
|
168
|
+
:quiet => false,
|
169
|
+
:docker => false,
|
170
|
+
:docker_image => nil,
|
171
|
+
:docker_keep_container => false,
|
172
|
+
:docker_cache => nil,
|
173
|
+
:docker_bin => 'docker',
|
174
|
+
:dockerfile => 'Dockerfile'
|
169
175
|
})
|
170
176
|
end
|
171
177
|
end
|
data/spec/facts_spec.rb
CHANGED
@@ -31,11 +31,11 @@ describe "Facts" do
|
|
31
31
|
end
|
32
32
|
end
|
33
33
|
|
34
|
-
context "where lsbcodename is not present" do
|
35
|
-
include_context "mock facts", { :lsbcodename => nil }
|
34
|
+
context "where lsbcodename is not present but lsbdistcodename is" do
|
35
|
+
include_context "mock facts", { :lsbcodename => nil, :lsbdistcodename => 'trusty' }
|
36
36
|
|
37
37
|
it "returns nil" do
|
38
|
-
expect(FPM::Cookery::Facts.lsbcodename).to
|
38
|
+
expect(FPM::Cookery::Facts.lsbcodename).to eq :trusty
|
39
39
|
end
|
40
40
|
end
|
41
41
|
end
|
data/spec/recipe_spec.rb
CHANGED
@@ -99,6 +99,24 @@ describe "Recipe" do
|
|
99
99
|
end
|
100
100
|
end
|
101
101
|
|
102
|
+
describe "#docker" do
|
103
|
+
it "can be set" do
|
104
|
+
check_attribute(:docker, true)
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
describe "#docker_image" do
|
109
|
+
it "can be set" do
|
110
|
+
check_attribute(:docker_image, "hello:world")
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
describe "#dockerfile" do
|
115
|
+
it "can be set" do
|
116
|
+
check_attribute(:dockerfile, "Dockefile")
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
102
120
|
describe "#license" do
|
103
121
|
it "can be set" do
|
104
122
|
check_attribute(:license, 'MIT')
|
@@ -305,6 +323,7 @@ describe "Recipe" do
|
|
305
323
|
spec_recipe_attribute_list(:omnibus_recipes, %w{one two})
|
306
324
|
spec_recipe_attribute_list(:chain_recipes, %w{one two})
|
307
325
|
spec_recipe_attribute_list(:directories, %w{one two})
|
326
|
+
spec_recipe_attribute_list(:docker_cache, %w{one two})
|
308
327
|
|
309
328
|
describe ".source" do
|
310
329
|
it "sets a source url" do
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fpm-cookery
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.35.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Bernd Ahlers
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-12-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rspec
|
@@ -204,6 +204,7 @@ executables:
|
|
204
204
|
extensions: []
|
205
205
|
extra_rdoc_files: []
|
206
206
|
files:
|
207
|
+
- ".github/workflows/ruby.yml"
|
207
208
|
- ".gitignore"
|
208
209
|
- ".travis.yml"
|
209
210
|
- CHANGELOG.md
|
@@ -212,6 +213,8 @@ files:
|
|
212
213
|
- README.md
|
213
214
|
- Rakefile
|
214
215
|
- bin/fpm-cook
|
216
|
+
- docker/Dockerfile.ubuntu-1604
|
217
|
+
- docker/docker-entrypoint.sh
|
215
218
|
- docs/.gitignore
|
216
219
|
- docs/Makefile
|
217
220
|
- docs/conf.py
|
@@ -225,6 +228,7 @@ files:
|
|
225
228
|
- lib/fpm/cookery/cli.rb
|
226
229
|
- lib/fpm/cookery/config.rb
|
227
230
|
- lib/fpm/cookery/dependency_inspector.rb
|
231
|
+
- lib/fpm/cookery/docker_packager.rb
|
228
232
|
- lib/fpm/cookery/environment.rb
|
229
233
|
- lib/fpm/cookery/exceptions.rb
|
230
234
|
- lib/fpm/cookery/facts.rb
|