simp-rake-helpers 1.0.15 → 1.1.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 +8 -8
- data/lib/simp/rake/build/auto.rb +363 -0
- data/lib/simp/rake/build/build.rb +707 -0
- data/lib/simp/rake/build/clean.rb +54 -0
- data/lib/simp/rake/build/code.rb +150 -0
- data/lib/simp/rake/build/constants.rb +23 -0
- data/lib/simp/rake/build/deps.rb +207 -0
- data/lib/simp/rake/build/helpers.rb +26 -0
- data/lib/simp/rake/build/iso.rb +287 -0
- data/lib/simp/rake/build/pkg.rb +731 -0
- data/lib/simp/rake/build/spec.rb +56 -0
- data/lib/simp/rake/build/tar.rb +134 -0
- data/lib/simp/rake/build/unpack.rb +115 -0
- data/lib/simp/rake/build/upload.rb +127 -0
- data/lib/simp/rake/build/vermap.yaml +4 -0
- data/lib/simp/rake/fixtures.rb +2 -0
- data/lib/simp/rake/helpers/version.rb +1 -1
- metadata +16 -2
@@ -0,0 +1,56 @@
|
|
1
|
+
require 'simp/rake/build/constants'
|
2
|
+
|
3
|
+
module Simp; end
|
4
|
+
module Simp::Rake; end
|
5
|
+
module Simp::Rake::Build
|
6
|
+
|
7
|
+
class Spec < ::Rake::TaskLib
|
8
|
+
include Simp::Rake::Build::Constants
|
9
|
+
|
10
|
+
def initialize( base_dir )
|
11
|
+
init_member_vars( base_dir )
|
12
|
+
@mock = ENV['mock'] || '/usr/bin/mock'
|
13
|
+
define_tasks
|
14
|
+
end
|
15
|
+
|
16
|
+
def define_tasks
|
17
|
+
namespace :spec do
|
18
|
+
|
19
|
+
desc "Bump spec files. Bump all spec files' release numbers up by one.
|
20
|
+
* :list - Flag to just print the current version numbers."
|
21
|
+
task :bump,[:list] do |t,args|
|
22
|
+
(
|
23
|
+
Dir.glob("#{@spec_dir}/*.spec") +
|
24
|
+
Dir.glob("#{@src_dir}/puppet/modules/*/pkg/pupmod-*.spec")
|
25
|
+
).each do |spec|
|
26
|
+
if args.list then
|
27
|
+
File.open(spec).each do |line|
|
28
|
+
if line =~ /Name:\s*(.*)/ then
|
29
|
+
print $1.chomp + ' -> '
|
30
|
+
next
|
31
|
+
elsif line =~ /Version:\s*(.*)/ then
|
32
|
+
print $1.chomp + '-'
|
33
|
+
next
|
34
|
+
elsif line =~ /Release:\s*(.*)/ then
|
35
|
+
puts $1.chomp
|
36
|
+
next
|
37
|
+
end
|
38
|
+
end
|
39
|
+
else
|
40
|
+
tmpfile = File.open("#{@spec_dir}/~#{File.basename(spec)}","w+")
|
41
|
+
File.open(spec).each do |line|
|
42
|
+
if line =~ /Release:/ then
|
43
|
+
tmpfile.puts "Release: #{line.split(/\s/)[1].to_i + 1}"
|
44
|
+
else
|
45
|
+
tmpfile.puts line.chomp
|
46
|
+
end
|
47
|
+
end
|
48
|
+
tmpfile.close
|
49
|
+
mv(tmpfile.path,spec)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end # End of bump task
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,134 @@
|
|
1
|
+
#!/usr/bin/rake -T
|
2
|
+
|
3
|
+
require 'simp/rake/build/constants'
|
4
|
+
|
5
|
+
module Simp; end
|
6
|
+
module Simp::Rake; end
|
7
|
+
module Simp::Rake::Build
|
8
|
+
|
9
|
+
class Tar < ::Rake::TaskLib
|
10
|
+
include Simp::Rake::Build::Constants
|
11
|
+
|
12
|
+
def initialize( base_dir )
|
13
|
+
init_member_vars( base_dir )
|
14
|
+
define_tasks
|
15
|
+
end
|
16
|
+
|
17
|
+
# define rake tasks
|
18
|
+
def define_tasks
|
19
|
+
namespace :tar do
|
20
|
+
|
21
|
+
directory "#{@dvd_dir}/staging"
|
22
|
+
|
23
|
+
def get_simp_version
|
24
|
+
simp_rpm = Dir.glob("#{@base_dir}/build/SIMP/RPMS/*/simp-[0-9]*.rpm").max_by {|f| File.mtime(f)}
|
25
|
+
fail("Could not find simp main RPM in output directory!") unless simp_rpm
|
26
|
+
simp_version = File.basename(simp_rpm).gsub(".noarch.rpm","").gsub("simp-","")
|
27
|
+
|
28
|
+
return simp_version
|
29
|
+
end
|
30
|
+
|
31
|
+
##############################################################################
|
32
|
+
# Main tasks
|
33
|
+
##############################################################################
|
34
|
+
|
35
|
+
desc <<-EOM
|
36
|
+
Build the DVD tarball(s).
|
37
|
+
|
38
|
+
* :chroot - The mock chroot to use for pkg:build
|
39
|
+
* :key - What key to use for signing the RPMs
|
40
|
+
* :docs - Whether or not to build the documentation
|
41
|
+
* :snapshot_release - Append the timestamp to the SIMP tarball(s)
|
42
|
+
EOM
|
43
|
+
task :build,[:chroot,:key,:docs,:snapshot_release] => ['pkg:build','pkg:checksig'] do |t,args|
|
44
|
+
args.with_defaults(:docs => 'true')
|
45
|
+
|
46
|
+
validate_in_mock_group?
|
47
|
+
|
48
|
+
Parallel.map(
|
49
|
+
@target_dists,
|
50
|
+
:in_processes => get_cpu_limit,
|
51
|
+
:process => t.name
|
52
|
+
) do |dist|
|
53
|
+
base_dir = "#{@dvd_dir}/#{dist}/staging"
|
54
|
+
destdir = "#{base_dir}/SIMP"
|
55
|
+
|
56
|
+
# Build the staging area
|
57
|
+
mkdir_p(destdir)
|
58
|
+
Simp::RPM.copy_wo_vcs(@dvd_src,".",base_dir)
|
59
|
+
|
60
|
+
# Copy in the GPG Public Keys
|
61
|
+
mkdir_p("#{destdir}/GPGKEYS")
|
62
|
+
ln(Dir.glob("#{@build_dir}/GPGKEYS/RPM-GPG-KEY*"), "#{destdir}/GPGKEYS", :force => true)
|
63
|
+
|
64
|
+
# Copy in the auto-build RPMs
|
65
|
+
Dir.chdir("#{@build_dir}/SIMP/RPMS") do
|
66
|
+
Dir.glob('*').each do |type|
|
67
|
+
dest_type = type
|
68
|
+
if File.directory?(type) then
|
69
|
+
if type =~ /i.*86/ then
|
70
|
+
dest_type = 'i386'
|
71
|
+
end
|
72
|
+
|
73
|
+
mkdir_p("#{destdir}/#{dest_type}")
|
74
|
+
Dir.chdir(type) do
|
75
|
+
ln(Dir.glob("*.#{type}.rpm"),"#{destdir}/#{dest_type}", :force => true)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
if args.docs.casecmp('true') == 0 then
|
82
|
+
# Finally, the PDF docs if they exist.
|
83
|
+
pdfs = Dir.glob("#{@src_dir}/doc/pdf/*")
|
84
|
+
if ! pdfs.empty? then
|
85
|
+
pdfs.each do |pdf|
|
86
|
+
cp(pdf,base_dir)
|
87
|
+
end
|
88
|
+
else
|
89
|
+
# If we don't have PDFs in the directory, yank them out of the
|
90
|
+
# RPM itself!
|
91
|
+
simp_doc_rpm = Dir.glob("#{@build_dir}/SIMP/RPMS/*/simp-doc*.rpm").last
|
92
|
+
if not simp_doc_rpm then
|
93
|
+
raise(Exception,"Error: Could not find simp-doc*.rpm in the build, something went very wrong")
|
94
|
+
end
|
95
|
+
|
96
|
+
Dir.mktmpdir { |dir|
|
97
|
+
Dir.chdir(dir) do
|
98
|
+
%x{rpm2cpio #{simp_doc_rpm} | cpio -u --quiet --warning none -ivd ./usr/share/doc/simp-*/pdf/SIMP*.pdf 2>&1 > /dev/null}
|
99
|
+
pdf_docs = Dir.glob("usr/share/doc/simp-*/pdf/*.pdf")
|
100
|
+
|
101
|
+
if pdf_docs.empty? then
|
102
|
+
raise(Exception,"Error: Could not find any PDFs in the simp-doc RPM, aborting.")
|
103
|
+
end
|
104
|
+
|
105
|
+
pdf_docs.each do |pdf|
|
106
|
+
cp(pdf,base_dir)
|
107
|
+
end
|
108
|
+
end
|
109
|
+
}
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
#Seeing race conditions when this is parallelized.
|
115
|
+
@simp_tarballs = {}
|
116
|
+
@target_dists.each do |dist|
|
117
|
+
base_dir = "#{@dvd_dir}/#{dist}/staging"
|
118
|
+
dvd_name = [ 'SIMP', 'DVD', dist, get_simp_version ]
|
119
|
+
dvd_tarball = "#{dvd_name.join('-')}.tar.gz"
|
120
|
+
Dir.chdir(base_dir) do
|
121
|
+
sh %{tar --owner 0 --group 0 --exclude-vcs --mode=u=rwX,g=rX,o=rX -cpzf "../#{dvd_tarball}" ./*}
|
122
|
+
mv("../#{dvd_tarball}",@dvd_dir)
|
123
|
+
end
|
124
|
+
|
125
|
+
puts "Package DVD: #{@dvd_dir}/#{dvd_tarball}"
|
126
|
+
@simp_tarballs[dist] = "#{@dvd_dir}/#{dvd_tarball}"
|
127
|
+
rm_rf(base_dir)
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
@@ -0,0 +1,115 @@
|
|
1
|
+
require 'ruby-progressbar'
|
2
|
+
require 'simp/rake/build/constants'
|
3
|
+
|
4
|
+
module Simp; end
|
5
|
+
module Simp::Rake; end
|
6
|
+
module Simp::Rake::Build
|
7
|
+
|
8
|
+
class Unpack < ::Rake::TaskLib
|
9
|
+
include Simp::Rake::Build::Constants
|
10
|
+
|
11
|
+
def initialize( base_dir )
|
12
|
+
init_member_vars( base_dir )
|
13
|
+
@mock = ENV['mock'] || '/usr/bin/mock'
|
14
|
+
define_tasks
|
15
|
+
end
|
16
|
+
|
17
|
+
def define_tasks
|
18
|
+
#!/usr/bin/rake -T
|
19
|
+
|
20
|
+
desc "Unpack an ISO. Unpacks either a RHEL or CentOS ISO into
|
21
|
+
<targetdir>/<RHEL|CentOS><version>-<arch>.
|
22
|
+
* :iso_path - Full path to the ISO image to unpack.
|
23
|
+
* :merge - If true, then automatically merge any existing
|
24
|
+
directories. Defaults to prompting.
|
25
|
+
* :targetdir - The parent directory for the to-be-created directory
|
26
|
+
containing the unpacked ISO. Defaults to the current directory.
|
27
|
+
* :isoinfo - The isoinfo executable to use to extract stuff from the ISO.
|
28
|
+
Defaults to 'isoinfo'.
|
29
|
+
* :version - optional override for the <version> number (e.g., '7.0' instead of '7')
|
30
|
+
|
31
|
+
"
|
32
|
+
task :unpack,[:iso_path, :merge, :targetdir, :isoinfo, :version] do |t,args|
|
33
|
+
args.with_defaults(
|
34
|
+
:iso_path => '',
|
35
|
+
:isoinfo => 'isoinfo',
|
36
|
+
:targetdir => Dir.pwd,
|
37
|
+
:merge => false,
|
38
|
+
:version => false,
|
39
|
+
)
|
40
|
+
|
41
|
+
iso_path = args.iso_path
|
42
|
+
iso_info = which(args.isoinfo)
|
43
|
+
targetdir = args.targetdir
|
44
|
+
merge = args.merge
|
45
|
+
version = args.version
|
46
|
+
|
47
|
+
# Checking for valid arguments
|
48
|
+
File.exist?(args.iso_path) or
|
49
|
+
fail "Error: You must provide the full path and filename of the ISO image."
|
50
|
+
|
51
|
+
%x{file #{iso_path}}.split(":")[1..-1].to_s =~ /ISO/ or
|
52
|
+
fail "Error: The file provided is not a valid ISO."
|
53
|
+
|
54
|
+
pieces = File.basename(iso_path,'.iso').split('-')
|
55
|
+
|
56
|
+
# Mappings of ISO name to target directory name.
|
57
|
+
# This is a hash of hashes to provide room for growth.
|
58
|
+
dvd_map = {
|
59
|
+
# RHEL structure as provided from RHN:
|
60
|
+
# rhel-server-<version>-<arch>-<whatever>
|
61
|
+
'rhel' => {
|
62
|
+
'baseos' => 'RHEL',
|
63
|
+
'version' => version || pieces[2],
|
64
|
+
'arch' => pieces[3]
|
65
|
+
},
|
66
|
+
# CentOS structure as provided from the CentOS website:
|
67
|
+
# CentOS-<version>-<arch>-<whatever>
|
68
|
+
'CentOS' => {
|
69
|
+
'baseos' => 'CentOS',
|
70
|
+
'version' => version || pieces[1],
|
71
|
+
'arch' => pieces[2]
|
72
|
+
}
|
73
|
+
}
|
74
|
+
|
75
|
+
# Determine the target directory
|
76
|
+
map = dvd_map[pieces[0]]
|
77
|
+
map.nil? and fail "Error: Could not find a mapping for '#{iso_path}'."
|
78
|
+
out_dir = "#{File.expand_path(targetdir)}/#{map['baseos']}#{map['version']}-#{map['arch']}"
|
79
|
+
|
80
|
+
# Attempt a merge
|
81
|
+
if File.exist?(out_dir) and merge.to_s.strip == 'false' then
|
82
|
+
puts "Directory '#{out_dir}' already exists! Would you like to merge? [Yn]?"
|
83
|
+
if not $stdin.gets.strip.match(/^(y.*|$)/i) then
|
84
|
+
puts "Skipping #{iso_path}"
|
85
|
+
next
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
puts "Target dir: #{out_dir}"
|
90
|
+
mkdir_p(out_dir)
|
91
|
+
|
92
|
+
# Unpack the ISO
|
93
|
+
iso_toc = %x{#{iso_info} -Rf -i #{iso_path}}.split("\n")
|
94
|
+
iso_toc.each do |iso_entry|
|
95
|
+
iso_toc.delete(File.dirname(iso_entry))
|
96
|
+
end
|
97
|
+
|
98
|
+
progress = ProgressBar.create(:title => 'Unpacking', :total => iso_toc.size)
|
99
|
+
|
100
|
+
iso_toc.each do |iso_entry|
|
101
|
+
target = "#{out_dir}#{iso_entry}"
|
102
|
+
if not File.exist?(target) then
|
103
|
+
FileUtils.mkdir_p(File.dirname(target))
|
104
|
+
system("#{iso_info} -R -x #{iso_entry} -i #{iso_path} > #{target}")
|
105
|
+
end
|
106
|
+
if progress then
|
107
|
+
progress.increment
|
108
|
+
else
|
109
|
+
print "#"
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
@@ -0,0 +1,127 @@
|
|
1
|
+
#!/usr/bin/rake -T
|
2
|
+
require 'open3'
|
3
|
+
require 'simp/rpm'
|
4
|
+
require 'simp/rake/build/constants'
|
5
|
+
|
6
|
+
module Simp; end
|
7
|
+
module Simp::Rake; end
|
8
|
+
module Simp::Rake::Build
|
9
|
+
|
10
|
+
class Upload < ::Rake::TaskLib
|
11
|
+
include Simp::Rake::Build::Constants
|
12
|
+
|
13
|
+
def initialize( base_dir )
|
14
|
+
init_member_vars( base_dir )
|
15
|
+
@mock = ENV['mock'] || '/usr/bin/mock'
|
16
|
+
define_tasks
|
17
|
+
end
|
18
|
+
|
19
|
+
def define_tasks
|
20
|
+
|
21
|
+
namespace :upload do
|
22
|
+
|
23
|
+
##############################################################################
|
24
|
+
# Helper methods
|
25
|
+
##############################################################################
|
26
|
+
|
27
|
+
# Get a list of all packages that have been updated since the passed
|
28
|
+
# date or git identifier (tag, branch, or commit).
|
29
|
+
|
30
|
+
def get_updated_packages(start,script_format)
|
31
|
+
pkg_info = Hash.new
|
32
|
+
printed_info = false
|
33
|
+
|
34
|
+
to_check = []
|
35
|
+
# Find all static RPMs and GPGKEYS that we may need to update so
|
36
|
+
# that we can see if we have newer versions to upload!
|
37
|
+
Find.find(@build_dir) do |file|
|
38
|
+
next if file == @build_dir
|
39
|
+
Find.prune if file !~ /^#{@build_dir}\/(Ext.*(\.rpm)?|GPGKEYS)/
|
40
|
+
to_check << file if File.file?(file)
|
41
|
+
end
|
42
|
+
|
43
|
+
# Smash in all of the file files!
|
44
|
+
to_check += Dir.glob("#{@spec_dir}/*.spec")
|
45
|
+
to_check += Dir.glob("#{@src_dir}/puppet/modules/*/pkg/*.spec")
|
46
|
+
|
47
|
+
to_check.each do |file|
|
48
|
+
|
49
|
+
is_commit = false
|
50
|
+
oldstart = start
|
51
|
+
humanstart = ''
|
52
|
+
# Before changing the directory, see if we've got a commit or a
|
53
|
+
# date. If we've got a tag or branch from the top level, then we
|
54
|
+
# need to get the date from there and use it later.
|
55
|
+
Dir.chdir(@spec_dir) do
|
56
|
+
stdin,stdout,stderr = Open3.popen3('git','rev-list',start)
|
57
|
+
stderr.read !~ /^fatal:/ and is_commit = true
|
58
|
+
|
59
|
+
if is_commit then
|
60
|
+
# Snag the date.
|
61
|
+
start, humanstart = `git log #{start} --pretty=format:"%ct##%cd" --max-count=1`.chomp.split('##')
|
62
|
+
else
|
63
|
+
printed_info = true
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
!printed_info and puts "Info: Comparing to '#{humanstart}' based on input of '#{oldstart}'"
|
68
|
+
|
69
|
+
Dir.chdir(File.dirname(file)) do
|
70
|
+
# Get the file HEAD commit
|
71
|
+
# If we're not in a git repo, this will explode, but that's just
|
72
|
+
# fine.
|
73
|
+
current_head = `git rev-list HEAD --max-count=1`.chomp
|
74
|
+
|
75
|
+
begin
|
76
|
+
# Convert the spec files to something more human readable...
|
77
|
+
pkg_info[file] = {
|
78
|
+
:is_new => false
|
79
|
+
}
|
80
|
+
pkg_info[file][:alias] = file
|
81
|
+
if file =~ /.spec$/ then
|
82
|
+
if script_format then
|
83
|
+
pkg_info[file][:alias] = "#{@build_dir}/RPMS/#{Simp::RPM.new(file).name}*.rpm"
|
84
|
+
else
|
85
|
+
pkg_info[file][:alias] = Simp::RPM.new(file).name
|
86
|
+
end
|
87
|
+
end
|
88
|
+
rescue
|
89
|
+
raise "Error: There was an issue getting information from #{file}"
|
90
|
+
end
|
91
|
+
|
92
|
+
commit_head = nil
|
93
|
+
# It turns out that an invalid date will just return
|
94
|
+
# everything
|
95
|
+
commit_head = `git log --before="#{start}" --pretty=format:%H --max-count=1 #{File.basename(file)}`.chomp
|
96
|
+
|
97
|
+
# Did we find something different?
|
98
|
+
if commit_head.empty? then
|
99
|
+
pkg_info[file][:is_new] = true
|
100
|
+
else
|
101
|
+
pkg_info[file][:is_new] = !system('git','diff','--quiet',commit_head,File.basename(file))
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
return pkg_info
|
107
|
+
end
|
108
|
+
|
109
|
+
desc <<-EOM
|
110
|
+
Get a list of modified packages.
|
111
|
+
|
112
|
+
The package list is created from the given date or git identifier (tag, branch, or hash)
|
113
|
+
EOM
|
114
|
+
task :get_modified,[:start,:script_format] do |t,args|
|
115
|
+
args.with_defaults(:script_format => false)
|
116
|
+
|
117
|
+
args.start or raise "Error: You must specify a 'start'"
|
118
|
+
|
119
|
+
updated_pkgs = get_updated_packages(args.start, args.script_format)
|
120
|
+
updated_pkgs.keys.sort.each do |k|
|
121
|
+
updated_pkgs[k][:is_new] and puts "Updated: #{updated_pkgs[k][:alias]}"
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|