simp-rake-helpers 4.1.1 → 5.0.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/CHANGELOG.md +11 -0
- data/lib/simp/rake.rb +4 -19
- data/lib/simp/rake/build/auto.rb +241 -506
- data/lib/simp/rake/build/build.rb +22 -155
- data/lib/simp/rake/build/clean.rb +3 -11
- data/lib/simp/rake/build/constants.rb +16 -78
- data/lib/simp/rake/build/deps.rb +8 -1
- data/lib/simp/rake/build/iso.rb +8 -6
- data/lib/simp/rake/build/pkg.rb +372 -304
- data/lib/simp/rake/build/rpmdeps.rb +2 -2
- data/lib/simp/rake/build/spec.rb +2 -1
- data/lib/simp/rake/build/tar.rb +11 -13
- data/lib/simp/rake/build/unpack.rb +2 -1
- data/lib/simp/rake/build/upload.rb +2 -1
- data/lib/simp/rake/helpers.rb +23 -0
- data/lib/simp/rake/helpers/version.rb +1 -1
- data/lib/simp/rake/pkg.rb +177 -312
- data/lib/simp/rake/pupmod/helpers.rb +13 -10
- data/lib/simp/rpm.rb +348 -65
- data/lib/simp/yum.rb +209 -0
- data/spec/lib/simp/files/simp_build/src/{build → assets/simp/build}/simp.spec +0 -0
- data/spec/lib/simp/files/testpackage-1-0.el7.noarch.rpm +0 -0
- data/spec/lib/simp/files/testpackage-dist.spec +42 -0
- data/spec/lib/simp/files/testpackage-multi.spec +7 -5
- data/spec/lib/simp/rpm_spec.rb +289 -14
- data/spec/spec_helper.rb +3 -0
- metadata +6 -3
@@ -110,7 +110,7 @@ module Simp::Rake::Build::RpmDeps
|
|
110
110
|
|
111
111
|
begin
|
112
112
|
rpm_metadata_content << get_version_requires(pkg, dep_version)
|
113
|
-
rescue SIMPRpmDepVersionException
|
113
|
+
rescue SIMPRpmDepVersionException
|
114
114
|
err_msg = "Unable to parse #{short_names.first} dependency" +
|
115
115
|
" version '#{dep_version}'"
|
116
116
|
raise SIMPRpmDepException.new(err_msg)
|
@@ -141,7 +141,7 @@ module Simp::Rake::Build::RpmDeps
|
|
141
141
|
|
142
142
|
begin
|
143
143
|
rpm_metadata_content << get_version_requires(pkg, dep_version)
|
144
|
-
rescue SIMPRpmDepVersionException
|
144
|
+
rescue SIMPRpmDepVersionException
|
145
145
|
err_msg = "Unable to parse #{dep['name']} dependency" +
|
146
146
|
" version '#{dep_version}'"
|
147
147
|
raise SIMPRpmDepException.new(err_msg)
|
data/lib/simp/rake/build/spec.rb
CHANGED
@@ -10,7 +10,6 @@ module Simp::Rake::Build
|
|
10
10
|
def initialize( base_dir )
|
11
11
|
init_member_vars( base_dir )
|
12
12
|
|
13
|
-
@mock = ENV['mock'] || '/usr/bin/mock'
|
14
13
|
define_tasks
|
15
14
|
end
|
16
15
|
|
@@ -23,8 +22,10 @@ module Simp::Rake::Build
|
|
23
22
|
end
|
24
23
|
|
25
24
|
|
25
|
+
=begin
|
26
26
|
desc "Bump spec files. Bump all spec files' release numbers up by one.
|
27
27
|
* :list - Flag to just print the current version numbers."
|
28
|
+
=end
|
28
29
|
task :bump,[:list] => [:prep] do |t,args|
|
29
30
|
(
|
30
31
|
Dir.glob("#{@spec_dir}/*.spec") +
|
data/lib/simp/rake/build/tar.rb
CHANGED
@@ -32,7 +32,8 @@ module Simp::Rake::Build
|
|
32
32
|
def get_simp_version
|
33
33
|
simp_rpm = Dir.glob("#{@build_dir}/SIMP/RPMS/*/simp-[0-9]*.rpm").max_by {|f| File.mtime(f)}
|
34
34
|
fail("Could not find simp main RPM in output directory!") unless simp_rpm
|
35
|
-
|
35
|
+
|
36
|
+
simp_version = Simp::RPM.new(simp_rpm).full_version
|
36
37
|
|
37
38
|
# For picking up the correct RPM template
|
38
39
|
ENV['SIMP_BUILD_version'] ||= simp_version
|
@@ -45,10 +46,6 @@ module Simp::Rake::Build
|
|
45
46
|
##############################################################################
|
46
47
|
|
47
48
|
task :validate => [:prep] do |t,args|
|
48
|
-
rpm_dir = File.join(@build_dir,'SIMP','RPMS')
|
49
|
-
|
50
|
-
fail("Could not find output dir: '#{rpm_dir}'") unless File.directory?(rpm_dir)
|
51
|
-
|
52
49
|
required_rpms = {
|
53
50
|
'noarch' => [
|
54
51
|
'rubygem-simp-cli',
|
@@ -59,10 +56,13 @@ module Simp::Rake::Build
|
|
59
56
|
]
|
60
57
|
}
|
61
58
|
|
59
|
+
rpm_dir = File.join(@build_dir,'SIMP','RPMS')
|
60
|
+
fail("Could not find directory '#{rpm_dir}'") unless File.directory?(rpm_dir)
|
61
|
+
|
62
62
|
Dir.chdir(rpm_dir) do
|
63
63
|
failures = []
|
64
64
|
required_rpms.keys.each do |dir|
|
65
|
-
fail("Could not find directory '#{File.join(rpm_dir,dir)}'") unless File.directory?(dir)
|
65
|
+
fail("Could not find directory '#{File.join(rpm_dir, dir)}'") unless File.directory?(dir)
|
66
66
|
|
67
67
|
Dir.chdir(dir) do
|
68
68
|
required_rpms[dir].each do |pkg|
|
@@ -85,19 +85,17 @@ module Simp::Rake::Build
|
|
85
85
|
end
|
86
86
|
end
|
87
87
|
|
88
|
+
=begin
|
88
89
|
desc <<-EOM
|
89
90
|
Build the DVD tarball(s).
|
90
91
|
|
91
|
-
* :chroot - The mock chroot to use for pkg:build
|
92
92
|
* :key - What key to use for signing the RPMs
|
93
93
|
* :docs - Whether or not to build the documentation
|
94
|
-
* :snapshot_release - Append the timestamp to the SIMP tarball(s)
|
95
94
|
EOM
|
96
|
-
|
95
|
+
=end
|
96
|
+
task :build,[:key,:docs] => ['pkg:build','pkg:checksig','tar:validate'] do |t,args|
|
97
97
|
args.with_defaults(:docs => 'true')
|
98
98
|
|
99
|
-
validate_in_mock_group?
|
100
|
-
|
101
99
|
if $tarball_tgt
|
102
100
|
target_dists = ['simp6']
|
103
101
|
else
|
@@ -161,7 +159,7 @@ module Simp::Rake::Build
|
|
161
159
|
raise(StandardError,"Error: Could not find simp-doc*.rpm in the build, something went very wrong")
|
162
160
|
end
|
163
161
|
|
164
|
-
Dir.mktmpdir
|
162
|
+
Dir.mktmpdir do |dir|
|
165
163
|
Dir.chdir(dir) do
|
166
164
|
%x{rpm2cpio #{simp_doc_rpm} | cpio -u --quiet --warning none -ivd ./usr/share/doc/simp-*/pdf/SIMP*.pdf 2>&1 > /dev/null}
|
167
165
|
pdf_docs = Dir.glob("usr/share/doc/simp-*/pdf/*.pdf")
|
@@ -174,7 +172,7 @@ module Simp::Rake::Build
|
|
174
172
|
cp(pdf,base_dir)
|
175
173
|
end
|
176
174
|
end
|
177
|
-
|
175
|
+
end
|
178
176
|
end
|
179
177
|
end
|
180
178
|
end
|
@@ -11,13 +11,13 @@ module Simp::Rake::Build
|
|
11
11
|
def initialize( base_dir )
|
12
12
|
init_member_vars( base_dir )
|
13
13
|
|
14
|
-
@mock = ENV['mock'] || '/usr/bin/mock'
|
15
14
|
define_tasks
|
16
15
|
end
|
17
16
|
|
18
17
|
def define_tasks
|
19
18
|
#!/usr/bin/rake -T
|
20
19
|
|
20
|
+
=begin
|
21
21
|
desc "Unpack an ISO. Unpacks either a RHEL or CentOS ISO into
|
22
22
|
<targetdir>/<RHEL|CentOS><version>-<arch>.
|
23
23
|
* :iso_path - Full path to the ISO image to unpack.
|
@@ -30,6 +30,7 @@ module Simp::Rake::Build
|
|
30
30
|
* :version - optional override for the <version> number (e.g., '7.0' instead of '7')
|
31
31
|
|
32
32
|
"
|
33
|
+
=end
|
33
34
|
task :unpack,[:iso_path, :merge, :targetdir, :isoinfo, :version] do |t,args|
|
34
35
|
args.with_defaults(
|
35
36
|
:iso_path => '',
|
@@ -13,7 +13,6 @@ module Simp::Rake::Build
|
|
13
13
|
def initialize( base_dir )
|
14
14
|
init_member_vars( base_dir )
|
15
15
|
|
16
|
-
@mock = ENV['mock'] || '/usr/bin/mock'
|
17
16
|
define_tasks
|
18
17
|
end
|
19
18
|
|
@@ -112,11 +111,13 @@ module Simp::Rake::Build
|
|
112
111
|
return pkg_info
|
113
112
|
end
|
114
113
|
|
114
|
+
=begin
|
115
115
|
desc <<-EOM
|
116
116
|
Get a list of modified packages.
|
117
117
|
|
118
118
|
The package list is created from the given date or git identifier (tag, branch, or hash)
|
119
119
|
EOM
|
120
|
+
=end
|
120
121
|
task :get_modified,[:start,:script_format] => [:prep] do |t,args|
|
121
122
|
args.with_defaults(:script_format => false)
|
122
123
|
|
data/lib/simp/rake/helpers.rb
CHANGED
@@ -14,4 +14,27 @@ class Simp::Rake::Helpers
|
|
14
14
|
Simp::Rake::Fixtures.new( dir )
|
15
15
|
end
|
16
16
|
|
17
|
+
def self.check_required_commands(required_commands)
|
18
|
+
require 'facter'
|
19
|
+
|
20
|
+
invalid_commands = Array.new
|
21
|
+
|
22
|
+
Array(required_commands).each do |command|
|
23
|
+
unless Facter::Core::Execution.which(command)
|
24
|
+
invalid_commands << command
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
unless invalid_commands.empty?
|
29
|
+
errmsg = <<-EOM
|
30
|
+
Error: The following required commands were not found on your system:
|
31
|
+
|
32
|
+
* #{invalid_commands.join("\n * ")}
|
33
|
+
|
34
|
+
Please update your system and try again.
|
35
|
+
EOM
|
36
|
+
|
37
|
+
raise(errmsg)
|
38
|
+
end
|
39
|
+
end
|
17
40
|
end
|
data/lib/simp/rake/pkg.rb
CHANGED
@@ -24,7 +24,7 @@ module Simp::Rake
|
|
24
24
|
# path to the project's RPM specfile
|
25
25
|
attr_accessor :spec_file
|
26
26
|
|
27
|
-
# path to the directory to place generated assets (e.g., rpm,
|
27
|
+
# path to the directory to place generated assets (e.g., rpm, tar.gz)
|
28
28
|
attr_accessor :pkg_dir
|
29
29
|
|
30
30
|
# array of items to exclude from the tarball
|
@@ -38,26 +38,28 @@ module Simp::Rake
|
|
38
38
|
|
39
39
|
attr_reader :spec_info
|
40
40
|
|
41
|
-
def initialize( base_dir,
|
41
|
+
def initialize( base_dir, unique_namespace = nil, simp_version=nil )
|
42
42
|
@base_dir = base_dir
|
43
43
|
@pkg_name = File.basename(@base_dir)
|
44
44
|
@pkg_dir = File.join(@base_dir, 'dist')
|
45
45
|
@pkg_tmp_dir = File.join(@pkg_dir, 'tmp')
|
46
|
-
@pkg_stash_dir = File.join(@pkg_tmp_dir, '.stash')
|
47
46
|
@exclude_list = [ File.basename(@pkg_dir) ]
|
48
47
|
@clean_list = []
|
49
48
|
@ignore_changes_list = [
|
50
49
|
'Gemfile.lock',
|
50
|
+
'dist/logs',
|
51
|
+
'dist/tmp',
|
52
|
+
'dist/*.rpm',
|
53
|
+
'dist/rpmbuild',
|
51
54
|
'spec/fixtures/modules'
|
52
55
|
]
|
53
|
-
|
56
|
+
|
57
|
+
FileUtils.mkdir_p(@pkg_tmp_dir)
|
54
58
|
|
55
59
|
local_spec = Dir.glob(File.join(@base_dir, 'build', '*.spec'))
|
56
60
|
unless local_spec.empty?
|
57
61
|
@spec_file = local_spec.first
|
58
62
|
else
|
59
|
-
FileUtils.mkdir_p(@pkg_stash_dir) unless File.directory?(@pkg_stash_dir)
|
60
|
-
|
61
63
|
@spec_tempfile = File.open(File.join(@pkg_tmp_dir, "#{@pkg_name}.spec"), 'w')
|
62
64
|
@spec_tempfile.write(rpm_template(simp_version))
|
63
65
|
|
@@ -73,11 +75,10 @@ module Simp::Rake
|
|
73
75
|
# LUA-based RPM template
|
74
76
|
|
75
77
|
@puppet_module_info_files = [
|
76
|
-
@
|
77
|
-
%(#{@base_dir}/build),
|
78
|
+
Dir.glob(%(#{@base_dir}/build/rpm_metadata/*)),
|
78
79
|
%(#{@base_dir}/CHANGELOG),
|
79
80
|
%(#{@base_dir}/metadata.json)
|
80
|
-
]
|
81
|
+
].flatten
|
81
82
|
|
82
83
|
::CLEAN.include( @pkg_dir )
|
83
84
|
|
@@ -102,94 +103,46 @@ module Simp::Rake
|
|
102
103
|
define_clean
|
103
104
|
define_clobber
|
104
105
|
define_pkg_tar
|
105
|
-
define_pkg_srpm
|
106
106
|
define_pkg_rpm
|
107
|
-
define_pkg_scrub
|
108
107
|
define_pkg_check_version
|
109
108
|
task :default => 'pkg:tar'
|
110
109
|
|
111
|
-
Rake::Task['pkg:tar']
|
112
|
-
Rake::Task['pkg:
|
113
|
-
Rake::Task['pkg:rpm'].enhance(['pkg:restore_stash'])
|
110
|
+
Rake::Task['pkg:tar']
|
111
|
+
Rake::Task['pkg:rpm']
|
114
112
|
|
115
113
|
self
|
116
114
|
end
|
117
115
|
|
118
|
-
# Add a file to the pkg stash
|
119
|
-
# These will be restored to the @pkg_dir at the end of the run
|
120
|
-
def stash(file)
|
121
|
-
FileUtils.mv(file, @pkg_stash_dir)
|
122
|
-
end
|
123
|
-
|
124
|
-
# Restore everything from the stash dir
|
125
|
-
def restore_stash
|
126
|
-
Dir.glob(File.join(@pkg_stash_dir, '*')).each do |file|
|
127
|
-
FileUtils.mv(file, @pkg_dir)
|
128
|
-
end
|
129
|
-
end
|
130
|
-
|
131
|
-
# Initialize the mock space if passed and retrieve the spec info from that
|
132
|
-
# space directly.
|
133
|
-
#
|
134
116
|
# Ensures that the correct file names are used across the board.
|
135
|
-
def initialize_spec_info
|
117
|
+
def initialize_spec_info
|
136
118
|
unless @spec_info
|
137
119
|
# This gets the resting spec file and allows us to pull out the name
|
138
|
-
@spec_info
|
139
|
-
@spec_info_dir
|
120
|
+
@spec_info ||= Simp::RPM.new(@spec_file)
|
121
|
+
@spec_info_dir ||= @base_dir
|
140
122
|
|
141
|
-
|
142
|
-
|
123
|
+
@dir_name ||= "#{@spec_info.basename}-#{@spec_info.version}"
|
124
|
+
@full_pkg_name ||= "#{@dir_name}-#{@spec_info.release}"
|
143
125
|
|
144
|
-
|
145
|
-
@chroot_name = @chroot_name + '__' + Time.now.strftime('%s%L')
|
146
|
-
end
|
147
|
-
|
148
|
-
if @spec_info[:has_dist_tag]
|
149
|
-
mock_cmd = mock_pre_check( chroot, @chroot_name, unique ) + " --root #{chroot}"
|
150
|
-
|
151
|
-
# Need to do this in case there is already a directory in /tmp
|
152
|
-
rand_dirname = (0...10).map { ('a'..'z').to_a[rand(26)] }.join
|
153
|
-
rand_tmpdir = %(/tmp/#{rand_dirname}_tmp)
|
154
|
-
|
155
|
-
# Hack to work around the fact that we have conflicting '-D' entries
|
156
|
-
# TODO: Refactor this
|
157
|
-
mock_cmd = mock_cmd.split(/-D '.*?'/).join
|
158
|
-
mock_cmd = "#{mock_cmd} -D 'pup_module_info_dir #{rand_tmpdir}'"
|
126
|
+
_rpmbuild_srcdir = `rpm -E '%{_sourcedir}'`.strip
|
159
127
|
|
160
|
-
|
161
|
-
|
162
|
-
@puppet_module_info_files.each do |copy_in|
|
163
|
-
if File.exist?(copy_in)
|
164
|
-
sh %Q(#{mock_cmd} --copyin #{copy_in} #{rand_tmpdir})
|
165
|
-
end
|
166
|
-
end
|
167
|
-
|
168
|
-
sh %Q(#{mock_cmd} --chroot 'chmod -R ugo+rwX #{rand_tmpdir}')
|
169
|
-
|
170
|
-
info_hash = {
|
171
|
-
:command => %Q(#{mock_cmd} --chroot --cwd='#{rand_tmpdir}'),
|
172
|
-
:rpm_extras => %(--specfile #{rand_tmpdir}/#{File.basename(@spec_file)} )
|
173
|
-
}
|
174
|
-
|
175
|
-
@spec_info = Simp::RPM.get_info(@spec_file, info_hash)
|
176
|
-
end
|
128
|
+
unless File.exist?(_rpmbuild_srcdir)
|
129
|
+
sh 'rpmdev-setuptree'
|
177
130
|
end
|
178
131
|
|
179
|
-
@
|
180
|
-
|
181
|
-
|
182
|
-
@tar_dest
|
132
|
+
@rpm_srcdir ||= "#{@pkg_dir}/rpmbuild/SOURCES"
|
133
|
+
FileUtils.mkdir_p(@rpm_srcdir)
|
134
|
+
|
135
|
+
@tar_dest ||= "#{@pkg_dir}/#{@full_pkg_name}.tar.gz"
|
183
136
|
|
184
|
-
if @
|
185
|
-
fail("Error: Could not determine package information from 'metadata.json'. Got '#{
|
137
|
+
if @full_pkg_name =~ /UNKNOWN/
|
138
|
+
fail("Error: Could not determine package information from 'metadata.json'. Got '#{@full_pkg_name}'")
|
186
139
|
end
|
187
140
|
end
|
188
141
|
end
|
189
142
|
|
190
143
|
def define_clean
|
191
144
|
desc <<-EOM
|
192
|
-
Clean build artifacts for #{@pkg_name}
|
145
|
+
Clean build artifacts for #{@pkg_name}
|
193
146
|
EOM
|
194
147
|
task :clean do |t,args|
|
195
148
|
# this is provided by 'rake/clean' and the ::CLEAN constant
|
@@ -198,7 +151,7 @@ module Simp::Rake
|
|
198
151
|
|
199
152
|
def define_clobber
|
200
153
|
desc <<-EOM
|
201
|
-
Clobber build artifacts for #{@pkg_name}
|
154
|
+
Clobber build artifacts for #{@pkg_name}
|
202
155
|
EOM
|
203
156
|
task :clobber do |t,args|
|
204
157
|
end
|
@@ -208,47 +161,21 @@ module Simp::Rake
|
|
208
161
|
namespace :pkg do
|
209
162
|
directory @pkg_dir
|
210
163
|
|
211
|
-
task :
|
212
|
-
|
213
|
-
end
|
214
|
-
|
215
|
-
task :initialize_spec_info,[:chroot,:unique] => [@pkg_dir] do |t,args|
|
216
|
-
args.with_defaults(:chroot => nil)
|
217
|
-
args.with_defaults(:unique => false)
|
218
|
-
|
219
|
-
initialize_spec_info(args[:chroot], args[:unique])
|
164
|
+
task :initialize_spec_info => [@pkg_dir] do |t,args|
|
165
|
+
initialize_spec_info
|
220
166
|
end
|
221
167
|
|
222
168
|
# :pkg:tar
|
223
169
|
# -----------------------------
|
224
170
|
desc <<-EOM
|
225
171
|
Build the #{@pkg_name} tar package.
|
226
|
-
* :snapshot_release - Add snapshot_release (date and time) to rpm
|
227
|
-
version, rpm spec file must have macro for
|
228
|
-
this to work.
|
229
172
|
EOM
|
230
|
-
task :tar
|
231
|
-
args.with_defaults(:snapshot_release => 'false')
|
232
|
-
args.with_defaults(:chroot => nil)
|
233
|
-
args.with_defaults(:unique => 'false')
|
234
|
-
|
235
|
-
l_date = ''
|
236
|
-
if args[:snapshot_release] == 'true'
|
237
|
-
l_date = '.' + "#{TIMESTAMP}"
|
238
|
-
@tar_dest = "#{@pkg_dir}/#{@full_pkg_name}#{l_date}.tar.gz"
|
239
|
-
end
|
240
|
-
|
241
|
-
# Remove any tar files that are not from this version
|
242
|
-
tar_files = Dir.glob(%(#{@pkg_dir}/#{@spec_info[:name]}-#{@spec_info[:version]}*.tar.gz))
|
243
|
-
tar_files.delete(@tar_dest)
|
244
|
-
tar_files.each do |tf|
|
245
|
-
stash(tf)
|
246
|
-
end
|
247
|
-
|
173
|
+
task :tar => [:initialize_spec_info] do |t,args|
|
248
174
|
target_dir = File.basename(@base_dir)
|
249
175
|
|
250
176
|
Dir.chdir(%(#{@base_dir}/..)) do
|
251
177
|
require_rebuild = false
|
178
|
+
|
252
179
|
if File.exist?(@tar_dest)
|
253
180
|
Find.find(target_dir) do |path|
|
254
181
|
filename = File.basename(path)
|
@@ -261,7 +188,7 @@ module Simp::Rake
|
|
261
188
|
|
262
189
|
next if File.directory?(path)
|
263
190
|
|
264
|
-
|
191
|
+
if require_rebuild?(@tar_dest, path)
|
265
192
|
require_rebuild = true
|
266
193
|
break
|
267
194
|
end
|
@@ -278,156 +205,180 @@ module Simp::Rake
|
|
278
205
|
end
|
279
206
|
end
|
280
207
|
|
281
|
-
def
|
208
|
+
def define_pkg_rpm
|
282
209
|
namespace :pkg do
|
283
210
|
desc <<-EOM
|
284
|
-
Build the #{@pkg_name}
|
285
|
-
Building RPMs requires a working Mock setup (http://fedoraproject.org/wiki/Projects/Mock)
|
286
|
-
* :chroot - The Mock chroot configuration to use. See the '--root' option in mock(1)."
|
287
|
-
* :unique - Whether or not to build the SRPM in a unique Mock environment.
|
288
|
-
This can be very useful for parallel builds of all modules.
|
289
|
-
* :snapshot_release - Add snapshot_release (date and time) to rpm version.
|
290
|
-
Rpm spec file must have macro for this to work.
|
211
|
+
Build the #{@pkg_name} RPM.
|
291
212
|
|
292
213
|
By default, the package will be built to support a SIMP-6.X file structure.
|
293
214
|
To build the package for a different version of SIMP, export SIMP_BUILD_version=<5.X,4.X>
|
294
|
-
|
295
|
-
task :
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
|
304
|
-
|
215
|
+
EOM
|
216
|
+
task :rpm => [:tar] do |t,args|
|
217
|
+
rpm_opts = [
|
218
|
+
%(-D 'buildroot #{@pkg_dir}/rpmbuild/BUILDROOT'),
|
219
|
+
%(-D 'builddir #{@pkg_dir}/rpmbuild/BUILD'),
|
220
|
+
%(-D '_sourcedir #{@rpm_srcdir}'),
|
221
|
+
%(-D '_rpmdir #{@pkg_dir}'),
|
222
|
+
%(-D '_srcrpmdir #{@pkg_dir}'),
|
223
|
+
%(-D '_build_name_fmt %%{NAME}-%%{VERSION}-%%{RELEASE}.%%{ARCH}.rpm')
|
224
|
+
]
|
225
|
+
|
226
|
+
Dir.chdir(@pkg_dir) do
|
227
|
+
|
228
|
+
# Copy in the materials required for the module builds
|
229
|
+
@puppet_module_info_files.each do |f|
|
230
|
+
if File.exist?(f)
|
231
|
+
FileUtils.cp_r(f, @rpm_srcdir)
|
232
|
+
end
|
233
|
+
end
|
305
234
|
|
306
|
-
|
235
|
+
# Link in any misc artifacts that got dumped into 'dist' by other code
|
236
|
+
extra_deps = Dir.glob("*")
|
237
|
+
extra_deps.delete_if{|x| x =~ /(\.rpm$|(^(rpmbuild|logs|tmp$)))/}
|
307
238
|
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
if srpm.split(@spec_info[:dist_tag]).last != '.src.rpm'
|
313
|
-
if File.exist?(srpm)
|
314
|
-
stash(srpm)
|
239
|
+
Dir.chdir(@rpm_srcdir) do
|
240
|
+
extra_deps.each do |dep|
|
241
|
+
unless File.exist?(dep)
|
242
|
+
FileUtils.cp_r("../../#{dep}", dep)
|
315
243
|
end
|
316
|
-
|
317
|
-
true
|
318
|
-
else
|
319
|
-
false
|
320
244
|
end
|
321
245
|
end
|
322
|
-
end
|
323
|
-
|
324
|
-
if require_rebuild?(srpms, @tar_dest)
|
325
246
|
|
326
|
-
|
247
|
+
FileUtils.mkdir_p('logs')
|
248
|
+
FileUtils.mkdir_p('rpmbuild/BUILDROOT')
|
249
|
+
FileUtils.mkdir_p('rpmbuild/BUILD')
|
327
250
|
|
328
|
-
@
|
329
|
-
|
251
|
+
srpms = [@full_pkg_name + '.src.rpm']
|
252
|
+
if require_rebuild?(srpms.first, @tar_dest)
|
253
|
+
# Need to build the SRPM so that we can get the build dependencies
|
254
|
+
%x(rpmbuild #{rpm_opts.join(' ')} -bs #{@spec_file} > logs/build.out 2> logs/build.err)
|
330
255
|
|
331
|
-
|
332
|
-
next if File.directory?(path)
|
256
|
+
srpms = File.read('logs/build.out').scan(%r(Wrote:\s+(.*\.rpm))).flatten
|
333
257
|
|
334
|
-
|
335
|
-
|
336
|
-
|
258
|
+
if srpms.empty?
|
259
|
+
raise <<-EOM
|
260
|
+
Could not create SRPM for '#{@spec_info.basename}
|
261
|
+
Error: #{File.read('logs/build.err')}
|
262
|
+
EOM
|
337
263
|
end
|
338
264
|
end
|
339
265
|
|
340
|
-
|
266
|
+
# Collect the built, or downloaded, RPMs
|
267
|
+
rpms = []
|
268
|
+
|
269
|
+
@spec_info.packages
|
270
|
+
expected_rpms = @spec_info.packages.map{|f|
|
271
|
+
latest_rpm = Dir.glob("#{f}-#{@spec_info.version}*.rpm").select{|x|
|
272
|
+
# Get all local RPMs that are not SRPMs
|
273
|
+
x !~ /\.src\.rpm$/
|
274
|
+
}.map{|x|
|
275
|
+
# Convert them to objects
|
276
|
+
x = Simp::RPM.new(x)
|
277
|
+
}.sort_by{|x|
|
278
|
+
# Sort by the full version of the package and return the one
|
279
|
+
# with the highest version
|
280
|
+
Gem::Version.new(x.full_version)
|
281
|
+
}.last
|
282
|
+
|
283
|
+
if latest_rpm && (
|
284
|
+
Gem::Version.new(latest_rpm.full_version) >=
|
285
|
+
Gem::Version.new(@spec_info.full_version)
|
286
|
+
)
|
287
|
+
f = latest_rpm.rpm_name
|
288
|
+
else
|
289
|
+
f = "#{f}-#{@spec_info.full_version}-#{@spec_info.arch}.rpm"
|
290
|
+
end
|
291
|
+
}
|
341
292
|
|
342
|
-
|
343
|
-
end
|
344
|
-
end
|
345
|
-
end
|
346
|
-
end
|
293
|
+
if expected_rpms.empty? || require_rebuild?(expected_rpms, srpms)
|
347
294
|
|
348
|
-
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
This can be very useful for parallel builds of all modules.
|
356
|
-
* :snapshot_release - Add snapshot_release (date and time) to rpm version.
|
357
|
-
Rpm spec file must have macro for this to work.
|
295
|
+
expected_rpms_data = expected_rpms.map{ |f|
|
296
|
+
if File.exist?(f)
|
297
|
+
f = Simp::RPM.new(f)
|
298
|
+
else
|
299
|
+
f = nil
|
300
|
+
end
|
301
|
+
}
|
358
302
|
|
359
|
-
|
360
|
-
To build the package for a different version of SIMP, export SIMP_BUILD_version=<5.X,4.X>
|
361
|
-
EOM
|
362
|
-
task :rpm,[:chroot,:unique,:snapshot_release] => [:srpm] do |t,args|
|
363
|
-
args.with_defaults(:unique => 'false')
|
364
|
-
args.with_defaults(:snapshot_release => 'false')
|
365
|
-
|
366
|
-
l_date = ''
|
367
|
-
if args[:snapshot_release] == 'true'
|
368
|
-
l_date = '.' + "#{TIMESTAMP}"
|
369
|
-
mocksnap = "-D 'snapshot_release #{l_date}'"
|
370
|
-
@tar_dest = "#{@pkg_dir}/#{@full_pkg_name}#{l_date}.tar.gz"
|
371
|
-
end
|
303
|
+
require_rebuild = true
|
372
304
|
|
373
|
-
|
305
|
+
# We need to rebuild if not *all* of the expected RPMs are present
|
306
|
+
unless expected_rpms_data.include?(nil)
|
307
|
+
# If all of the RPMs are signed, we do not need a rebuild
|
308
|
+
require_rebuild = !expected_rpms_data.compact.select{|x| !x.signature}.empty?
|
309
|
+
end
|
374
310
|
|
375
|
-
|
376
|
-
|
311
|
+
if !require_rebuild
|
312
|
+
# We found all expected RPMs and they all had valid signatures
|
313
|
+
#
|
314
|
+
# Record the existing RPM metadata in the output file
|
315
|
+
rpms = expected_rpms
|
316
|
+
else
|
317
|
+
# Try a build
|
318
|
+
%x(rpmbuild #{rpm_opts.join(' ')} --rebuild #{srpms.first} > logs/build.out 2> logs/build.err)
|
319
|
+
|
320
|
+
# If the build failed, it was probably due to missing dependencies
|
321
|
+
unless $?.success?
|
322
|
+
# Find the RPM build dependencies
|
323
|
+
rpm_build_deps = %x(rpm -q -R -p #{srpms.first}).strip.split("\n")
|
324
|
+
|
325
|
+
# RPM stuffs this in every time
|
326
|
+
rpm_build_deps.delete_if {|x| x =~ /^rpmlib/}
|
327
|
+
|
328
|
+
# See if we have the ability to install things
|
329
|
+
unless Process.uid == 0
|
330
|
+
unless %x(sudo -ln) =~ %r(NOPASSWD:\s+(ALL|yum( install)?))
|
331
|
+
raise <<-EOM
|
332
|
+
Please install the following dependencies and try again:
|
333
|
+
#{rpm_build_deps.map{|x| x = " * #{x}"}.join("\n")}
|
334
|
+
EOM
|
335
|
+
end
|
336
|
+
end
|
377
337
|
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
|
382
|
-
if rpm.split(@spec_info[:dist_tag]).last != ".#{@spec_info[:arch]}.rpm"
|
383
|
-
if File.exist?(rpm)
|
384
|
-
stash(rpm)
|
385
|
-
end
|
338
|
+
rpm_build_deps.map! do |rpm|
|
339
|
+
if rpm =~ %r((.*)\s+(?:<=|=|==)\s+(.+))
|
340
|
+
rpm = "#{$1}-#{$2}"
|
341
|
+
end
|
386
342
|
|
387
|
-
|
388
|
-
|
389
|
-
false
|
390
|
-
end
|
391
|
-
end
|
392
|
-
end
|
343
|
+
rpm
|
344
|
+
end
|
393
345
|
|
394
|
-
|
395
|
-
|
396
|
-
|
397
|
-
|
346
|
+
yum_install_cmd = %(yum -y install '#{rpm_build_deps.join("' '")}')
|
347
|
+
unless Process.uid == 0
|
348
|
+
yum_install_cmd = 'sudo ' + yum_install_cmd
|
349
|
+
end
|
398
350
|
|
399
|
-
|
400
|
-
|
401
|
-
|
351
|
+
install_output = %x(#{yum_install_cmd} 2>&1)
|
352
|
+
|
353
|
+
if !$?.success? || (install_output =~ %r((N|n)o package))
|
354
|
+
raise <<-EOM
|
355
|
+
Could not run #{yum_install_cmd}
|
356
|
+
Error: #{install_output}
|
357
|
+
EOM
|
358
|
+
end
|
359
|
+
end
|
402
360
|
|
403
|
-
|
361
|
+
# Try it again!
|
362
|
+
#
|
363
|
+
# If this doesn't work, something we can't fix automatically is wrong
|
364
|
+
%x(rpmbuild #{rpm_opts.join(' ')} --rebuild #{srpms.first} > logs/build.out 2> logs/build.err)
|
404
365
|
|
405
|
-
|
366
|
+
rpms = File.read('logs/build.out').scan(%r(Wrote:\s+(.*\.rpm))).flatten - srpms
|
406
367
|
|
407
|
-
|
408
|
-
|
409
|
-
|
410
|
-
|
368
|
+
if rpms.empty?
|
369
|
+
raise <<-EOM
|
370
|
+
Could not create RPM for '#{@spec_info.basename}
|
371
|
+
Error: #{File.read('logs/build.err')}
|
372
|
+
EOM
|
373
|
+
end
|
411
374
|
end
|
412
|
-
end
|
413
|
-
end
|
414
|
-
end
|
415
|
-
end
|
416
|
-
end
|
417
375
|
|
418
|
-
|
419
|
-
|
420
|
-
# :pkg:scrub
|
421
|
-
# -----------------------------
|
422
|
-
desc <<-EOM
|
423
|
-
Scrub the #{@pkg_name} mock build directory.
|
424
|
-
EOM
|
425
|
-
task :scrub,[:chroot,:unique] do |t,args|
|
426
|
-
args.with_defaults(:unique => 'false')
|
376
|
+
# Prevent overwriting the last good metadata file
|
377
|
+
raise %(Could not find any valid RPMs for '#{@spec_info.basename}') if rpms.empty?
|
427
378
|
|
428
|
-
|
429
|
-
|
430
|
-
|
379
|
+
Simp::RPM.create_rpm_build_metadata(File.expand_path(@base_dir), srpms, rpms)
|
380
|
+
end
|
381
|
+
end
|
431
382
|
end
|
432
383
|
end
|
433
384
|
end
|
@@ -506,103 +457,17 @@ module Simp::Rake
|
|
506
457
|
# ------------------------------------------------------------------------------
|
507
458
|
# helper methods
|
508
459
|
# ------------------------------------------------------------------------------
|
509
|
-
# Get a list of all of the mock configs available on the system.
|
510
|
-
def Pkg.get_mock_configs
|
511
|
-
Dir.glob('/etc/mock/*.cfg').sort.map{ |x| x = File.basename(x,'.cfg')}
|
512
|
-
end
|
513
|
-
|
514
460
|
# Return True if any of the 'old' Array are newer than the 'new' Array
|
515
461
|
def require_rebuild?(new, old)
|
516
462
|
return true if ( Array(old).empty? || Array(new).empty?)
|
517
463
|
|
518
464
|
Array(new).each do |new_file|
|
519
|
-
unless File.exist?(new_file)
|
520
|
-
return true
|
521
|
-
end
|
465
|
+
return true unless File.exist?(new_file)
|
522
466
|
|
523
|
-
unless uptodate?(new_file, Array(old))
|
524
|
-
return true
|
525
|
-
end
|
467
|
+
return true unless uptodate?(new_file, Array(old))
|
526
468
|
end
|
527
469
|
|
528
470
|
return false
|
529
471
|
end
|
530
|
-
|
531
|
-
# Run some pre-checks to make sure that mock will work properly.
|
532
|
-
#
|
533
|
-
# chroot = name of mock chroot to use
|
534
|
-
# unique_ext = TODO
|
535
|
-
# Pass init=false if you do not want the function to initialize.
|
536
|
-
#
|
537
|
-
# Returns a String that contains the appropriate mock command.
|
538
|
-
def mock_pre_check( chroot, unique_ext, unique='false', init=true )
|
539
|
-
|
540
|
-
mock = ENV['mock'] || '/usr/bin/mock'
|
541
|
-
|
542
|
-
raise(StandardError,"Could not find mock on your system, exiting") unless File.executable?(mock)
|
543
|
-
|
544
|
-
mock_configs = Pkg.get_mock_configs
|
545
|
-
unless chroot
|
546
|
-
raise(StandardError,
|
547
|
-
"Error: No mock chroot provided. Your choices are:\n #{mock_configs.join("\n ")}"
|
548
|
-
)
|
549
|
-
end
|
550
|
-
|
551
|
-
# If you pass a config file, just take it
|
552
|
-
unless chroot.split('.').last == 'cfg'
|
553
|
-
unless mock_configs.include?(chroot)
|
554
|
-
raise(StandardError,
|
555
|
-
"Error: Invalid mock chroot provided. Your choices are:\n #{mock_configs.join("\n ")}"
|
556
|
-
)
|
557
|
-
end
|
558
|
-
end
|
559
|
-
|
560
|
-
raise %Q(unique_ext must be a String ("#{unique_ext}" = #{unique_ext.class})) unless unique_ext.is_a?(String)
|
561
|
-
|
562
|
-
# if true, restrict yum to the chroot's local yum cache (defaults to false)
|
563
|
-
mock_offline = ENV.fetch( 'SIMP_RAKE_MOCK_OFFLINE', 'N' ).chomp.index( %r{^(1|Y|true|yes)$} ) || false
|
564
|
-
|
565
|
-
mock_cmd = "#{mock} --quiet"
|
566
|
-
mock_cmd += " --uniqueext=#{unique_ext}" if unique
|
567
|
-
mock_cmd += ' --offline' if mock_offline
|
568
|
-
|
569
|
-
initialized = is_mock_initialized(mock_cmd, chroot)
|
570
|
-
|
571
|
-
unless initialized && init
|
572
|
-
sh %Q(#{mock_cmd} --root #{chroot} --init #{unique_ext})
|
573
|
-
else
|
574
|
-
# Remove any old build cruft from the mock directory.
|
575
|
-
# This is kludgy but WAY faster than rebuilding them all, even with a cache.
|
576
|
-
sh %Q(#{mock_cmd} --root #{chroot} --chroot "/bin/rm -rf /builddir/build/BUILDROOT /builddir/build/*/*")
|
577
|
-
end
|
578
|
-
|
579
|
-
# Install useful stock packages
|
580
|
-
if ENV.fetch( 'SIMP_RAKE_MOCK_EXTRAS', 'yes' ) == 'yes'
|
581
|
-
pkgs = ['openssl', 'openssl-devel']
|
582
|
-
|
583
|
-
env_pkgs = ENV.fetch('SIMP_RAKE_MOCK_PKGS','')
|
584
|
-
unless env_pkgs.empty?
|
585
|
-
pkgs = pkgs + env_pkgs.split(',')
|
586
|
-
end
|
587
|
-
|
588
|
-
pkgs.each do |pkg|
|
589
|
-
sh %Q(#{mock_cmd} --root #{chroot} --install #{pkg})
|
590
|
-
end
|
591
|
-
end
|
592
|
-
|
593
|
-
return mock_cmd + " --no-clean --no-cleanup-after --resultdir=#{@pkg_dir} --disable-plugin=package_state"
|
594
|
-
end
|
595
|
-
|
596
|
-
def is_mock_initialized( mock_cmd, chroot )
|
597
|
-
@@initialized_mocks ||= []
|
598
|
-
return true if @@initialized_mocks.include?(chroot)
|
599
|
-
|
600
|
-
%x{#{mock_cmd} --root #{chroot} --chroot "test -d /tmp" &> /dev/null }
|
601
|
-
initialized = $?.success?
|
602
|
-
@@initialized_mocks << chroot
|
603
|
-
|
604
|
-
# A simple test to see if the chroot is initialized.
|
605
|
-
initialized
|
606
|
-
end
|
607
472
|
end
|
608
473
|
end
|