puppet_module_packaging 0.1.1 → 0.2.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/.travis.yml +0 -2
- data/Changelog.md +5 -0
- data/README.md +18 -0
- data/lib/puppet_module/pkg/tasks.rb +2 -3
- data/lib/puppet_module/pkg/tasks/build.rb +12 -81
- data/lib/puppet_module/pkg/tasks/deb.rb +4 -0
- data/lib/puppet_module/pkg/tasks/install.rb +17 -2
- data/lib/puppet_module/pkg/tasks/module_finder.rb +24 -0
- data/lib/puppet_module/pkg/tasks/modulefile.rb +1 -1
- data/lib/puppet_module/pkg/tasks/packager.rb +107 -0
- data/lib/puppet_module/pkg/tasks/rake_tasks.rb +12 -6
- data/lib/puppet_module/pkg/tasks/rpm.rb +4 -0
- data/lib/puppet_module/pkg/tasks/system.rb +6 -1
- data/lib/puppet_module/pkg/version.rb +1 -1
- data/puppet_module_packaging.gemspec +1 -0
- data/test/end_to_end/pkg_test.rb +18 -2
- data/test/fixture/testmod/Modulefile +1 -2
- data/test/fixture/testmod/Modulefile.deprecated +2 -0
- data/test/fixture/testmod/Modulefile.ok +13 -0
- data/test/fixture/testmod/Rakefile.recursive +3 -0
- data/test/integration/modulefile_test.rb +8 -1
- data/test/integration/system_test.rb +17 -1
- data/test/unit/build_test.rb +59 -6
- data/test/unit/install_test.rb +71 -3
- data/test/unit/module_finder_test.rb +37 -0
- metadata +26 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: dd5dba623fbe049e9833d313d879c7e1406c14f5
|
4
|
+
data.tar.gz: 103b9a8a5357e19a8210d1982d84f27ef6a2c0c0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 118a93d9fc1f1cc2647fc84fb7003985f7e20d338ffb631629d9a3479023646e92aba26f508710b9f28f2bdc38f3675daaab26547ea7d5d24fdca0778046f280
|
7
|
+
data.tar.gz: 718a9760b856f780f6171b1acf1c45ca04f349d7253fa212c83720d89d1b8b34863af83ae309058693f83533aa56d07aa3b98964b4a3886633a7b51b402623a8
|
data/.travis.yml
CHANGED
data/Changelog.md
CHANGED
data/README.md
CHANGED
@@ -60,6 +60,24 @@ optional and are mapped into package fields with equivalent meaning.
|
|
60
60
|
**NOTE**: The module will be installed under `/usr/share/puppet/modules`, not
|
61
61
|
into `/etc/puppet`!
|
62
62
|
|
63
|
+
### Recursive packaging
|
64
|
+
|
65
|
+
The library can also take care of packaging the whole dependency tree of a
|
66
|
+
module as well, so that you don't need to manually track and package
|
67
|
+
dependencies. To enable this feature, just specify the `:recursive` option when
|
68
|
+
declaring the tasks:
|
69
|
+
|
70
|
+
require 'puppet_module/pkg/rake_task'
|
71
|
+
|
72
|
+
PuppetModule::Pkg::Tasks.new :recursive => true
|
73
|
+
|
74
|
+
This way, the library will take care of downloading the module's dependencies,
|
75
|
+
installing their relevant assets into a separate folder and packaging them into
|
76
|
+
individual packages.
|
77
|
+
|
78
|
+
Note that, as of now, **only dependencies downloadable from Puppet Forge are
|
79
|
+
supported**.
|
80
|
+
|
63
81
|
## Compatibility
|
64
82
|
|
65
83
|
OS compatibility resembles the one of FPM; in particular:
|
@@ -1,12 +1,11 @@
|
|
1
1
|
require 'puppet_module/pkg/tasks/rake_tasks'
|
2
|
-
|
3
2
|
require 'puppet_module/pkg/tasks/modulefile'
|
4
3
|
|
5
4
|
module PuppetModule
|
6
5
|
module Pkg
|
7
6
|
class Tasks
|
8
|
-
def initialize
|
9
|
-
RakeTasks.new(Modulefile.parse("Modulefile"))
|
7
|
+
def initialize(options = {})
|
8
|
+
RakeTasks.new(Modulefile.parse("Modulefile"), options)
|
10
9
|
end
|
11
10
|
end
|
12
11
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'puppet_module/pkg/tasks/packager'
|
2
|
+
|
1
3
|
class Class
|
2
4
|
def type(sym)
|
3
5
|
self.class_eval <<-EOS
|
@@ -20,8 +22,9 @@ module PuppetModule
|
|
20
22
|
module Pkg
|
21
23
|
class Tasks
|
22
24
|
class Build
|
23
|
-
def initialize(system)
|
25
|
+
def initialize(system, mod_finder)
|
24
26
|
@sys = system
|
27
|
+
@mod_finder = mod_finder
|
25
28
|
end
|
26
29
|
|
27
30
|
def invoke(mod, opts)
|
@@ -29,7 +32,12 @@ module PuppetModule
|
|
29
32
|
self.build_opts = opts
|
30
33
|
|
31
34
|
@sys.mkdir opts.pkg_dir
|
32
|
-
@
|
35
|
+
@packager = Packager.new(@sys)
|
36
|
+
@packager.package(mod, opts.install_dir, opts.pkg_dir, type, filename)
|
37
|
+
|
38
|
+
@mod_finder.find_in(opts.dep_install_path).each do |dep|
|
39
|
+
@packager.package(dep, File.join(opts.dep_build_path, dep.name), opts.pkg_dir, type, filename_for(dep.name, dep.author))
|
40
|
+
end
|
33
41
|
end
|
34
42
|
|
35
43
|
def type
|
@@ -45,85 +53,8 @@ module PuppetModule
|
|
45
53
|
attr_accessor :modinfo
|
46
54
|
attr_accessor :build_opts
|
47
55
|
|
48
|
-
def
|
49
|
-
|
50
|
-
dest_fmt,
|
51
|
-
name,
|
52
|
-
version,
|
53
|
-
arch,
|
54
|
-
maintainer,
|
55
|
-
url,
|
56
|
-
description,
|
57
|
-
license,
|
58
|
-
dependencies,
|
59
|
-
chdir,
|
60
|
-
output ].join " "
|
61
|
-
end
|
62
|
-
|
63
|
-
def pkg_name
|
64
|
-
"puppet-mod-#{modinfo.author}-#{modinfo.name}"
|
65
|
-
end
|
66
|
-
|
67
|
-
def name
|
68
|
-
"-n #{pkg_name}"
|
69
|
-
end
|
70
|
-
|
71
|
-
def version
|
72
|
-
"-v #{modinfo.version}"
|
73
|
-
end
|
74
|
-
|
75
|
-
def arch
|
76
|
-
"-a all"
|
77
|
-
end
|
78
|
-
|
79
|
-
def maintainer
|
80
|
-
optionally('-m', modinfo.author_full)
|
81
|
-
end
|
82
|
-
|
83
|
-
def url
|
84
|
-
optionally('--url', modinfo.project_page)
|
85
|
-
end
|
86
|
-
|
87
|
-
def description
|
88
|
-
optionally('--description', modinfo.summary)
|
89
|
-
end
|
90
|
-
|
91
|
-
def license
|
92
|
-
optionally('--license', modinfo.license)
|
93
|
-
end
|
94
|
-
|
95
|
-
def dependencies
|
96
|
-
return "" unless modinfo.dependencies
|
97
|
-
|
98
|
-
modinfo.dependencies.map do |dep|
|
99
|
-
dep[:versions].map do |version_constraint|
|
100
|
-
"-d 'puppet-mod-#{dep[:author]}-#{dep[:name]} #{version_constraint}'"
|
101
|
-
end
|
102
|
-
end
|
103
|
-
end
|
104
|
-
|
105
|
-
def src_fmt
|
106
|
-
"-s dir"
|
107
|
-
end
|
108
|
-
|
109
|
-
def chdir
|
110
|
-
"-C #{build_opts.install_dir}"
|
111
|
-
end
|
112
|
-
|
113
|
-
def installed_files
|
114
|
-
"."
|
115
|
-
end
|
116
|
-
|
117
|
-
def output
|
118
|
-
"-p #{build_opts.pkg_dir}/#{filename}"
|
119
|
-
end
|
120
|
-
|
121
|
-
def dest_fmt
|
122
|
-
"-t #{type}"
|
123
|
-
end
|
124
|
-
|
125
|
-
def optionally(switch, field)
|
126
|
-
field ? "#{switch} '#{field}'" : ""
|
56
|
+
def pkg_name(mod = modinfo.name, author = modinfo.author)
|
57
|
+
"puppet-mod-#{author}-#{mod}"
|
127
58
|
end
|
128
59
|
end
|
129
60
|
end
|
@@ -7,17 +7,19 @@ module PuppetModule
|
|
7
7
|
end
|
8
8
|
|
9
9
|
def invoke(mod, opts)
|
10
|
-
@
|
10
|
+
@mod = mod
|
11
11
|
@out_dir = opts.install_dir
|
12
12
|
|
13
13
|
@sys.mkdir install_path
|
14
14
|
@sys.cp assets_to_install, install_path
|
15
|
+
|
16
|
+
install_deps if opts.recursive
|
15
17
|
end
|
16
18
|
|
17
19
|
private
|
18
20
|
|
19
21
|
def install_path
|
20
|
-
File.join(@out_dir, dest_path, @
|
22
|
+
File.join(@out_dir, dest_path, @mod.name)
|
21
23
|
end
|
22
24
|
|
23
25
|
def dest_path
|
@@ -27,6 +29,19 @@ module PuppetModule
|
|
27
29
|
def assets_to_install
|
28
30
|
['Modulefile','manifests','templates','lib','files']
|
29
31
|
end
|
32
|
+
|
33
|
+
def install_deps
|
34
|
+
# TODO: Refactor!!! Too many hardcoded paths
|
35
|
+
@mod.dependencies.each do |dep|
|
36
|
+
@sys.sh("puppet module install -i tmp/deps_inst -v '#{dep[:versions].join(' ')}' #{dep[:author]}/#{dep[:name]}")
|
37
|
+
end
|
38
|
+
|
39
|
+
@sys.ls('tmp/deps_inst').each do |dep|
|
40
|
+
@sys.mkdir "tmp/deps_build/#{dep}#{dest_path}/#{dep}"
|
41
|
+
@sys.cp assets_to_install.map { |a| "tmp/deps_inst/#{dep}/#{a}" },
|
42
|
+
"tmp/deps_build/#{dep}#{dest_path}/#{dep}"
|
43
|
+
end
|
44
|
+
end
|
30
45
|
end
|
31
46
|
end
|
32
47
|
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module PuppetModule
|
2
|
+
module Pkg
|
3
|
+
class Tasks
|
4
|
+
class ModuleFinder
|
5
|
+
def initialize(system, parser = Modulefile)
|
6
|
+
@sys = system
|
7
|
+
@parser = parser
|
8
|
+
end
|
9
|
+
|
10
|
+
def find_in(path)
|
11
|
+
@sys.ls(path).map do |mod|
|
12
|
+
@parser.parse(File.join(path, mod, "Modulefile"))
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
class Disabled < ModuleFinder
|
17
|
+
def find_in(path)
|
18
|
+
[]
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,107 @@
|
|
1
|
+
module PuppetModule
|
2
|
+
module Pkg
|
3
|
+
class Tasks
|
4
|
+
class Packager
|
5
|
+
def initialize(system)
|
6
|
+
@sys = system
|
7
|
+
end
|
8
|
+
|
9
|
+
def package(mod, install_dir, pkg_dir, type, filename)
|
10
|
+
self.modinfo = mod
|
11
|
+
@install_dir = install_dir
|
12
|
+
@pkg_dir = pkg_dir
|
13
|
+
|
14
|
+
@type = type
|
15
|
+
@filename = filename
|
16
|
+
@sys.sh("fpm #{fpm_opts} #{installed_files}")
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
attr_accessor :modinfo
|
22
|
+
|
23
|
+
def fpm_opts
|
24
|
+
[ src_fmt,
|
25
|
+
dest_fmt,
|
26
|
+
name,
|
27
|
+
version,
|
28
|
+
arch,
|
29
|
+
maintainer,
|
30
|
+
url,
|
31
|
+
description,
|
32
|
+
license,
|
33
|
+
dependencies,
|
34
|
+
chdir,
|
35
|
+
output ].join " "
|
36
|
+
end
|
37
|
+
|
38
|
+
def pkg_name
|
39
|
+
"puppet-mod-#{modinfo.author}-#{modinfo.name}"
|
40
|
+
end
|
41
|
+
|
42
|
+
def name
|
43
|
+
"-n #{pkg_name}"
|
44
|
+
end
|
45
|
+
|
46
|
+
def version
|
47
|
+
"-v #{modinfo.version}"
|
48
|
+
end
|
49
|
+
|
50
|
+
def arch
|
51
|
+
"-a all"
|
52
|
+
end
|
53
|
+
|
54
|
+
def maintainer
|
55
|
+
optionally('-m', modinfo.author_full)
|
56
|
+
end
|
57
|
+
|
58
|
+
def url
|
59
|
+
optionally('--url', modinfo.project_page)
|
60
|
+
end
|
61
|
+
|
62
|
+
def description
|
63
|
+
optionally('--description', modinfo.summary)
|
64
|
+
end
|
65
|
+
|
66
|
+
def license
|
67
|
+
optionally('--license', modinfo.license)
|
68
|
+
end
|
69
|
+
|
70
|
+
def dependencies
|
71
|
+
return "" unless modinfo.dependencies
|
72
|
+
|
73
|
+
modinfo.dependencies.map do |dep|
|
74
|
+
dep[:versions].map do |version_constraint|
|
75
|
+
"-d 'puppet-mod-#{dep[:author]}-#{dep[:name]} #{version_constraint}'"
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
def src_fmt
|
81
|
+
"-s dir"
|
82
|
+
end
|
83
|
+
|
84
|
+
def chdir
|
85
|
+
"-C #{@install_dir}"
|
86
|
+
end
|
87
|
+
|
88
|
+
def installed_files
|
89
|
+
"."
|
90
|
+
end
|
91
|
+
|
92
|
+
def output
|
93
|
+
"-p #{@pkg_dir}/#{@filename}"
|
94
|
+
end
|
95
|
+
|
96
|
+
def dest_fmt
|
97
|
+
"-t #{@type}"
|
98
|
+
end
|
99
|
+
|
100
|
+
def optionally(switch, field)
|
101
|
+
field ? "#{switch} '#{field}'" : ""
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'rake/tasklib'
|
2
2
|
|
3
3
|
require 'puppet_module/pkg/tasks/system'
|
4
|
+
require 'puppet_module/pkg/tasks/module_finder'
|
4
5
|
require 'puppet_module/pkg/tasks/deb'
|
5
6
|
require 'puppet_module/pkg/tasks/rpm'
|
6
7
|
require 'puppet_module/pkg/tasks/install'
|
@@ -10,11 +11,16 @@ module PuppetModule
|
|
10
11
|
module Pkg
|
11
12
|
class Tasks
|
12
13
|
class RakeTasks < Rake::TaskLib
|
13
|
-
def initialize(mod_info)
|
14
|
+
def initialize(mod_info, custom_opts)
|
14
15
|
sys = System.new
|
15
|
-
options = OpenStruct.new(
|
16
|
-
:install_dir
|
17
|
-
:pkg_dir
|
16
|
+
options = OpenStruct.new({
|
17
|
+
:install_dir => 'build',
|
18
|
+
:pkg_dir => 'pkg',
|
19
|
+
:dep_install_path => 'tmp/deps_inst',
|
20
|
+
:dep_build_path => 'tmp/deps_build',
|
21
|
+
:recursive => false
|
22
|
+
}.merge(custom_opts))
|
23
|
+
mod_finder = (options.recursive ? ModuleFinder : ModuleFinder::Disabled).new sys
|
18
24
|
|
19
25
|
desc "Install the module in a local temp dir"
|
20
26
|
task :install => :clean do
|
@@ -28,12 +34,12 @@ module PuppetModule
|
|
28
34
|
|
29
35
|
desc "Wraps the module into a Debian package"
|
30
36
|
task :deb => :install do
|
31
|
-
Deb.new(sys).invoke(mod_info, options)
|
37
|
+
Deb.new(sys, mod_finder).invoke(mod_info, options)
|
32
38
|
end
|
33
39
|
|
34
40
|
desc "Wraps the module into a RPM package"
|
35
41
|
task :rpm => :install do
|
36
|
-
RPM.new(sys).invoke(mod_info, options)
|
42
|
+
RPM.new(sys, mod_finder).invoke(mod_info, options)
|
37
43
|
end
|
38
44
|
end
|
39
45
|
end
|
@@ -26,6 +26,7 @@ Gem::Specification.new do |spec|
|
|
26
26
|
spec.require_paths = ["lib"]
|
27
27
|
|
28
28
|
spec.add_runtime_dependency "fpm", "~> 0.4"
|
29
|
+
spec.add_runtime_dependency "puppet", "~> 3.4"
|
29
30
|
|
30
31
|
spec.add_development_dependency "bundler", "~> 1.3"
|
31
32
|
spec.add_development_dependency "rake"
|
data/test/end_to_end/pkg_test.rb
CHANGED
@@ -5,15 +5,31 @@ describe 'deb task' do
|
|
5
5
|
do_into_tmp_module('testmod', t)
|
6
6
|
end
|
7
7
|
|
8
|
-
|
9
|
-
let(:pkg) { 'pkg/puppet-mod-testdev-testmod_0.0.1_all.deb' }
|
8
|
+
let(:pkg) { 'pkg/puppet-mod-testdev-testmod_0.0.1_all.deb' }
|
10
9
|
|
10
|
+
describe 'by default' do
|
11
11
|
it 'build a package into the `pkg` folder' do
|
12
12
|
`rake deb`
|
13
13
|
|
14
14
|
assert file?(pkg), "expected package #{pkg} to exist"
|
15
15
|
end
|
16
16
|
end
|
17
|
+
|
18
|
+
describe 'when asked to build packages for dependencies as well' do
|
19
|
+
let(:dep_pkgs) {[
|
20
|
+
'pkg/puppet-mod-puppetlabs-apache_*_all.deb',
|
21
|
+
'pkg/puppet-mod-puppetlabs-stdlib_*_all.deb',
|
22
|
+
'pkg/puppet-mod-puppetlabs-concat_*_all.deb',
|
23
|
+
]}
|
24
|
+
|
25
|
+
it 'recursively builds packages for each dependency' do
|
26
|
+
`rake -f Rakefile.recursive deb`
|
27
|
+
|
28
|
+
dep_pkgs.each do |dep_pkg|
|
29
|
+
refute Dir.glob(dep_pkg).empty?, "expected package #{dep_pkg} to exist"
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
17
33
|
end
|
18
34
|
|
19
35
|
describe 'rpm task' do
|
@@ -7,7 +7,6 @@ summary 'A silly module, only useful for testing'
|
|
7
7
|
description 'A long description of this silly module'
|
8
8
|
project_page 'https://example.com/testmod/home'
|
9
9
|
|
10
|
-
dependency '
|
11
|
-
dependency 'user_2/mod_2', '>= 1.0.0 <3.2'
|
10
|
+
dependency 'puppetlabs/apache', '1.0.1'
|
12
11
|
|
13
12
|
unsupported_field 'I don`t know what I am for'
|
@@ -0,0 +1,13 @@
|
|
1
|
+
name 'testdev-testmod'
|
2
|
+
version '0.0.1'
|
3
|
+
source 'https://example.com/git/testmod'
|
4
|
+
author 'Test Developer <test@example.com>'
|
5
|
+
license 'Apache License, Version 2.0'
|
6
|
+
summary 'A silly module, only useful for testing'
|
7
|
+
description 'A long description of this silly module'
|
8
|
+
project_page 'https://example.com/testmod/home'
|
9
|
+
|
10
|
+
dependency 'user_1/mod_1', '= 1.2.3'
|
11
|
+
dependency 'user_2/mod_2', '>= 1.0.0 <3.2'
|
12
|
+
|
13
|
+
unsupported_field 'I don`t know what I am for'
|
@@ -16,7 +16,7 @@ describe PuppetModule::Pkg::Tasks::Modulefile do
|
|
16
16
|
let(:parser) { PuppetModule::Pkg::Tasks::Modulefile }
|
17
17
|
|
18
18
|
it 'reads a Modulefile and maps its fields to an object value' do
|
19
|
-
metadata = parser.parse 'Modulefile'
|
19
|
+
metadata = parser.parse 'Modulefile.ok'
|
20
20
|
|
21
21
|
metadata.name.must_equal 'testmod'
|
22
22
|
metadata.author.must_equal 'testdev'
|
@@ -49,4 +49,11 @@ describe PuppetModule::Pkg::Tasks::Modulefile do
|
|
49
49
|
metadata = parser.parse 'Modulefile'
|
50
50
|
metadata.unsupported_field.must_be_nil
|
51
51
|
end
|
52
|
+
|
53
|
+
it 'also supports name in the old `author/name` format' do
|
54
|
+
metadata = parser.parse 'Modulefile.deprecated'
|
55
|
+
metadata.name.must_equal 'oldmod'
|
56
|
+
metadata.author.must_equal 'olddev'
|
57
|
+
metadata.version.must_equal 'deprecated_version'
|
58
|
+
end
|
52
59
|
end
|
@@ -59,11 +59,27 @@ describe PuppetModule::Pkg::Tasks::System do
|
|
59
59
|
end
|
60
60
|
end
|
61
61
|
|
62
|
-
describe '
|
62
|
+
describe 'sh' do
|
63
63
|
it 'executes given command in system`s shell' do
|
64
64
|
fs.sh 'touch test_file'
|
65
65
|
|
66
66
|
assert file?('test_file'), "expected file test_file to have been created, but it was not"
|
67
67
|
end
|
68
68
|
end
|
69
|
+
|
70
|
+
describe 'ls' do
|
71
|
+
it 'returns an array with the entries of a specific folder' do
|
72
|
+
mkdir 'a_dir/a'
|
73
|
+
mkdir 'a_dir/b'
|
74
|
+
mkdir 'a_dir/c'
|
75
|
+
mkdir 'a_dir/c/d'
|
76
|
+
|
77
|
+
listing = fs.ls 'a_dir'
|
78
|
+
|
79
|
+
listing.length.must_equal 3
|
80
|
+
listing.must_include 'a'
|
81
|
+
listing.must_include 'b'
|
82
|
+
listing.must_include 'c'
|
83
|
+
end
|
84
|
+
end
|
69
85
|
end
|
data/test/unit/build_test.rb
CHANGED
@@ -4,6 +4,8 @@ describe 'packaging tasks' do
|
|
4
4
|
let(:deb_task) { PuppetModule::Pkg::Tasks::Deb }
|
5
5
|
let(:rpm_task) { PuppetModule::Pkg::Tasks::RPM }
|
6
6
|
let(:sys) { stub_everything }
|
7
|
+
let(:mod_finder) { stub_everything }
|
8
|
+
|
7
9
|
let(:minimal_mod) { OpenStruct.new(
|
8
10
|
:name => 'my_mod',
|
9
11
|
:author => 'a_dev',
|
@@ -23,15 +25,21 @@ describe 'packaging tasks' do
|
|
23
25
|
{ :author => 'user_2', :name => 'mod_2', :versions => ['> 2.0', '<= 3.0'] },
|
24
26
|
])
|
25
27
|
}
|
28
|
+
|
26
29
|
let(:opts) { OpenStruct.new(
|
27
30
|
:pkg_dir => 'pkg',
|
28
|
-
:install_dir => 'some/where'
|
31
|
+
:install_dir => 'some/where',
|
32
|
+
:recursive => false)
|
29
33
|
}
|
30
34
|
|
35
|
+
before do
|
36
|
+
mod_finder.stubs(:find_in).returns([])
|
37
|
+
end
|
38
|
+
|
31
39
|
it 'creates the output folder' do
|
32
40
|
sys.expects(:mkdir).with(regexp_matches(/#{opts.pkg_dir}/))
|
33
41
|
|
34
|
-
deb_task.new(sys).invoke(mod, opts)
|
42
|
+
deb_task.new(sys, mod_finder).invoke(mod, opts)
|
35
43
|
end
|
36
44
|
|
37
45
|
it 'builds a package using all available module info' do
|
@@ -51,7 +59,7 @@ describe 'packaging tasks' do
|
|
51
59
|
regexp_matches(/-C #{opts.install_dir}/),
|
52
60
|
regexp_matches(/\.$/)))
|
53
61
|
|
54
|
-
deb_task.new(sys).invoke(mod, opts)
|
62
|
+
deb_task.new(sys, mod_finder).invoke(mod, opts)
|
55
63
|
end
|
56
64
|
|
57
65
|
it 'doesn`t complain if optional module info are missing' do
|
@@ -62,7 +70,7 @@ describe 'packaging tasks' do
|
|
62
70
|
regexp_matches(/--license /)
|
63
71
|
)))
|
64
72
|
|
65
|
-
deb_task.new(sys).invoke(minimal_mod, opts)
|
73
|
+
deb_task.new(sys, mod_finder).invoke(minimal_mod, opts)
|
66
74
|
end
|
67
75
|
|
68
76
|
describe 'deb task' do
|
@@ -71,7 +79,7 @@ describe 'packaging tasks' do
|
|
71
79
|
regexp_matches(/-t deb/),
|
72
80
|
regexp_matches(/-p #{opts.pkg_dir}\/puppet-mod-#{mod.author}-#{mod.name}_VERSION_ARCH.deb/)))
|
73
81
|
|
74
|
-
deb_task.new(sys).invoke(mod, opts)
|
82
|
+
deb_task.new(sys, mod_finder).invoke(mod, opts)
|
75
83
|
end
|
76
84
|
end
|
77
85
|
|
@@ -81,7 +89,52 @@ describe 'packaging tasks' do
|
|
81
89
|
regexp_matches(/-t rpm/),
|
82
90
|
regexp_matches(/-p #{opts.pkg_dir}\/puppet-mod-#{mod.author}-#{mod.name}-VERSION.ARCH.rpm/)))
|
83
91
|
|
84
|
-
rpm_task.new(sys).invoke(mod, opts)
|
92
|
+
rpm_task.new(sys, mod_finder).invoke(mod, opts)
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
describe 'when recursively building packages for module`s dependencies' do
|
97
|
+
let(:opts) { OpenStruct.new(
|
98
|
+
:pkg_dir => 'module_pkg',
|
99
|
+
:install_dir => 'some/where/else',
|
100
|
+
:dep_build_path => 'some/tmp/folder',
|
101
|
+
:dep_install_path => 'another/tmp/folder',
|
102
|
+
:recursive => true)
|
103
|
+
}
|
104
|
+
|
105
|
+
let(:depmod_1) { OpenStruct.new(
|
106
|
+
:name => 'mod_1',
|
107
|
+
:author => 'dev_1',
|
108
|
+
:version => 'version_1',
|
109
|
+
)}
|
110
|
+
|
111
|
+
let(:depmod_2) { OpenStruct.new(
|
112
|
+
:name => 'mod_2',
|
113
|
+
:author => 'dev_2',
|
114
|
+
:version => 'version_2',
|
115
|
+
)}
|
116
|
+
|
117
|
+
it 'builds a package for each installed dependency' do
|
118
|
+
mod_finder.expects(:find_in).with(opts.dep_install_path)\
|
119
|
+
.returns([ depmod_1, depmod_2 ])
|
120
|
+
|
121
|
+
sys.expects(:sh)\
|
122
|
+
.with(all_of(
|
123
|
+
regexp_matches(/^fpm/),
|
124
|
+
regexp_matches(/-n puppet-mod-#{depmod_1.author}-#{depmod_1.name}/),
|
125
|
+
regexp_matches(/-v #{depmod_1.version}/),
|
126
|
+
regexp_matches(/-C #{opts.dep_build_path}\/#{depmod_1.name}/),
|
127
|
+
regexp_matches(/-p #{opts.pkg_dir}\/puppet-mod-#{depmod_1.author}-#{depmod_1.name}_VERSION_ARCH.deb/),
|
128
|
+
regexp_matches(/\.$/)))\
|
129
|
+
.with(all_of(
|
130
|
+
regexp_matches(/^fpm/),
|
131
|
+
regexp_matches(/-n puppet-mod-#{depmod_2.author}-#{depmod_2.name}/),
|
132
|
+
regexp_matches(/-v #{depmod_2.version}/),
|
133
|
+
regexp_matches(/-C #{opts.dep_build_path}\/#{depmod_2.name}/),
|
134
|
+
regexp_matches(/-p #{opts.pkg_dir}\/puppet-mod-#{depmod_2.author}-#{depmod_2.name}_VERSION_ARCH.deb/),
|
135
|
+
regexp_matches(/\.$/)))
|
136
|
+
|
137
|
+
deb_task.new(sys, mod_finder).invoke(minimal_mod, opts)
|
85
138
|
end
|
86
139
|
end
|
87
140
|
end
|
data/test/unit/install_test.rb
CHANGED
@@ -3,11 +3,24 @@ require 'test_helper'
|
|
3
3
|
describe PuppetModule::Pkg::Tasks::Install do
|
4
4
|
let(:install_task) { PuppetModule::Pkg::Tasks::Install }
|
5
5
|
let(:sys) { stub_everything }
|
6
|
-
let(:mod)
|
7
|
-
|
6
|
+
let(:mod) { OpenStruct.new(
|
7
|
+
:name => 'my_mod',
|
8
|
+
:dependencies => [
|
9
|
+
{ :author => 'user_1', :name => 'mod_1', :versions => ['< 1'] },
|
10
|
+
{ :author => 'user_2', :name => 'mod_2', :versions => ['> 2.0', '<= 3.0'] },
|
11
|
+
])
|
12
|
+
}
|
13
|
+
let(:opts) { OpenStruct.new(
|
14
|
+
:install_dir => 'build',
|
15
|
+
:recursive => false
|
16
|
+
)}
|
8
17
|
let(:dest_path) { "usr/share/puppet/modules/#{mod.name}" }
|
9
18
|
let(:install_path) { join(opts.install_dir, dest_path) }
|
10
19
|
|
20
|
+
before do
|
21
|
+
sys.stubs(:ls).returns(['mod_1', 'mod_2'])
|
22
|
+
end
|
23
|
+
|
11
24
|
it 'creates the output folder' do
|
12
25
|
sys.expects(:mkdir).with(regexp_matches(/#{opts.install_dir}/))
|
13
26
|
|
@@ -20,7 +33,7 @@ describe PuppetModule::Pkg::Tasks::Install do
|
|
20
33
|
install_task.new(sys).invoke(mod, opts)
|
21
34
|
end
|
22
35
|
|
23
|
-
it 'installs all the relevant
|
36
|
+
it 'installs all the relevant assets into the output folder' do
|
24
37
|
sys.expects(:cp).with(
|
25
38
|
includes(
|
26
39
|
'Modulefile',
|
@@ -32,4 +45,59 @@ describe PuppetModule::Pkg::Tasks::Install do
|
|
32
45
|
|
33
46
|
install_task.new(sys).invoke(mod, opts)
|
34
47
|
end
|
48
|
+
|
49
|
+
it 'doesn`t install dependencies by default' do
|
50
|
+
sys.expects(:sh).at_most_once.with(Not(regexp_matches(/puppet module install/)))
|
51
|
+
|
52
|
+
install_task.new(sys).invoke(mod, opts)
|
53
|
+
end
|
54
|
+
|
55
|
+
describe 'when managing dependencies recursively' do
|
56
|
+
let(:opts) { OpenStruct.new(
|
57
|
+
:install_dir => 'build',
|
58
|
+
:recursive => true
|
59
|
+
)}
|
60
|
+
|
61
|
+
it 'asks puppet to install all the dependencies into a temp folder' do
|
62
|
+
sys.expects(:sh)\
|
63
|
+
.with(
|
64
|
+
regexp_matches(/puppet module install -i tmp\/deps_inst -v '< 1' user_1\/mod_1/))\
|
65
|
+
.with(
|
66
|
+
regexp_matches(/puppet module install -i tmp\/deps_inst -v '> 2.0 <= 3.0' user_2\/mod_2/))
|
67
|
+
|
68
|
+
install_task.new(sys).invoke(mod, opts)
|
69
|
+
end
|
70
|
+
|
71
|
+
it 'creates the build folder for each installed dependency' do
|
72
|
+
sys.expects(:ls).with('tmp/deps_inst').returns(['mod_1','mod_2','mod_3'])
|
73
|
+
sys.expects(:mkdir)\
|
74
|
+
.with(regexp_matches(%r{tmp/deps_build/mod_1/usr/share/puppet/modules/mod_1}))
|
75
|
+
.with(regexp_matches(%r{tmp/deps_build/mod_2/usr/share/puppet/modules/mod_2}))
|
76
|
+
.with(regexp_matches(%r{tmp/deps_build/mod_3/usr/share/puppet/modules/mod_3}))
|
77
|
+
|
78
|
+
install_task.new(sys).invoke(mod, opts)
|
79
|
+
end
|
80
|
+
|
81
|
+
it 'installs the relevant assets for each dependency into a separate directory' do
|
82
|
+
sys.expects(:cp)\
|
83
|
+
.with(
|
84
|
+
includes(
|
85
|
+
'tmp/deps_inst/mod_1/Modulefile',
|
86
|
+
'tmp/deps_inst/mod_1/manifests',
|
87
|
+
'tmp/deps_inst/mod_1/templates',
|
88
|
+
'tmp/deps_inst/mod_1/files',
|
89
|
+
'tmp/deps_inst/mod_1/lib'),
|
90
|
+
'tmp/deps_build/mod_1/usr/share/puppet/modules/mod_1')
|
91
|
+
.with(
|
92
|
+
includes(
|
93
|
+
'tmp/deps_inst/mod_2/Modulefile',
|
94
|
+
'tmp/deps_inst/mod_2/manifests',
|
95
|
+
'tmp/deps_inst/mod_2/templates',
|
96
|
+
'tmp/deps_inst/mod_2/files',
|
97
|
+
'tmp/deps_inst/mod_2/lib'),
|
98
|
+
'tmp/deps_build/mod_2/usr/share/puppet/modules/mod_2')
|
99
|
+
|
100
|
+
install_task.new(sys).invoke(mod, opts)
|
101
|
+
end
|
102
|
+
end
|
35
103
|
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
describe PuppetModule::Pkg::Tasks::ModuleFinder do
|
4
|
+
let(:sys) { mock }
|
5
|
+
let(:parser_class) { stub_everything }
|
6
|
+
let(:mod_finder) { PuppetModule::Pkg::Tasks::ModuleFinder.new sys, parser_class }
|
7
|
+
|
8
|
+
describe '#find_in' do
|
9
|
+
it 'parses the modulefile for each module found in the given directory' do
|
10
|
+
sys.expects(:ls).with('root/folder').returns(['mod_1', 'mod_2'])
|
11
|
+
parser_class.expects(:parse)\
|
12
|
+
.with('root/folder/mod_1/Modulefile')\
|
13
|
+
.with('root/folder/mod_2/Modulefile')\
|
14
|
+
|
15
|
+
mod_finder.find_in('root/folder')
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'returns a list of parsed modulefiles' do
|
19
|
+
sys.stubs(:ls).with('root/folder').returns(['mod_3', 'mod_4'])
|
20
|
+
parser_class.stubs(:parse).returns(OpenStruct.new)
|
21
|
+
|
22
|
+
modules = mod_finder.find_in('root/folder')
|
23
|
+
modules.length.must_equal 2
|
24
|
+
modules.first.must_be_kind_of OpenStruct
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
describe PuppetModule::Pkg::Tasks::ModuleFinder::Disabled do
|
29
|
+
let(:mod_finder) { PuppetModule::Pkg::Tasks::ModuleFinder::Disabled.new nil, nil}
|
30
|
+
|
31
|
+
describe '#find_in' do
|
32
|
+
it 'returns an empty list of dependencies, no matter the arguments' do
|
33
|
+
mod_finder.find_in('one/two/three').must_equal []
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: puppet_module_packaging
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Stefano Zanella
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain:
|
11
11
|
- rubygems-stefanozanella.crt
|
12
|
-
date: 2014-04-
|
12
|
+
date: 2014-04-07 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: fpm
|
@@ -25,6 +25,20 @@ dependencies:
|
|
25
25
|
- - "~>"
|
26
26
|
- !ruby/object:Gem::Version
|
27
27
|
version: '0.4'
|
28
|
+
- !ruby/object:Gem::Dependency
|
29
|
+
name: puppet
|
30
|
+
requirement: !ruby/object:Gem::Requirement
|
31
|
+
requirements:
|
32
|
+
- - "~>"
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: '3.4'
|
35
|
+
type: :runtime
|
36
|
+
prerelease: false
|
37
|
+
version_requirements: !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - "~>"
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: '3.4'
|
28
42
|
- !ruby/object:Gem::Dependency
|
29
43
|
name: bundler
|
30
44
|
requirement: !ruby/object:Gem::Requirement
|
@@ -146,7 +160,9 @@ files:
|
|
146
160
|
- lib/puppet_module/pkg/tasks/clean.rb
|
147
161
|
- lib/puppet_module/pkg/tasks/deb.rb
|
148
162
|
- lib/puppet_module/pkg/tasks/install.rb
|
163
|
+
- lib/puppet_module/pkg/tasks/module_finder.rb
|
149
164
|
- lib/puppet_module/pkg/tasks/modulefile.rb
|
165
|
+
- lib/puppet_module/pkg/tasks/packager.rb
|
150
166
|
- lib/puppet_module/pkg/tasks/rake_tasks.rb
|
151
167
|
- lib/puppet_module/pkg/tasks/rpm.rb
|
152
168
|
- lib/puppet_module/pkg/tasks/system.rb
|
@@ -159,10 +175,13 @@ files:
|
|
159
175
|
- test/end_to_end/pkg_test.rb
|
160
176
|
- test/end_to_end/tasks_test.rb
|
161
177
|
- test/fixture/testmod/Modulefile
|
178
|
+
- test/fixture/testmod/Modulefile.deprecated
|
162
179
|
- test/fixture/testmod/Modulefile.no_name_or_author
|
163
180
|
- test/fixture/testmod/Modulefile.no_version
|
181
|
+
- test/fixture/testmod/Modulefile.ok
|
164
182
|
- test/fixture/testmod/README.md
|
165
183
|
- test/fixture/testmod/Rakefile
|
184
|
+
- test/fixture/testmod/Rakefile.recursive
|
166
185
|
- test/fixture/testmod/files/example.dat
|
167
186
|
- test/fixture/testmod/lib/utils.rb
|
168
187
|
- test/fixture/testmod/manifests/defined_type.pp
|
@@ -181,6 +200,7 @@ files:
|
|
181
200
|
- test/unit/build_test.rb
|
182
201
|
- test/unit/clean_test.rb
|
183
202
|
- test/unit/install_test.rb
|
203
|
+
- test/unit/module_finder_test.rb
|
184
204
|
homepage: https://github.com/stefanozanella/puppet_module_packaging
|
185
205
|
licenses:
|
186
206
|
- MIT
|
@@ -212,10 +232,13 @@ test_files:
|
|
212
232
|
- test/end_to_end/pkg_test.rb
|
213
233
|
- test/end_to_end/tasks_test.rb
|
214
234
|
- test/fixture/testmod/Modulefile
|
235
|
+
- test/fixture/testmod/Modulefile.deprecated
|
215
236
|
- test/fixture/testmod/Modulefile.no_name_or_author
|
216
237
|
- test/fixture/testmod/Modulefile.no_version
|
238
|
+
- test/fixture/testmod/Modulefile.ok
|
217
239
|
- test/fixture/testmod/README.md
|
218
240
|
- test/fixture/testmod/Rakefile
|
241
|
+
- test/fixture/testmod/Rakefile.recursive
|
219
242
|
- test/fixture/testmod/files/example.dat
|
220
243
|
- test/fixture/testmod/lib/utils.rb
|
221
244
|
- test/fixture/testmod/manifests/defined_type.pp
|
@@ -234,3 +257,4 @@ test_files:
|
|
234
257
|
- test/unit/build_test.rb
|
235
258
|
- test/unit/clean_test.rb
|
236
259
|
- test/unit/install_test.rb
|
260
|
+
- test/unit/module_finder_test.rb
|