c1020d06d74060fa98e7b06faf5248a458488fe2
[packages/precise/mcollective.git] / Rakefile
1 # Rakefile to build a project using HUDSON
2
3 begin
4   require 'rdoc/task'
5 rescue LoadError
6   require 'rake/rdoctask'
7 end
8
9 require 'rake/packagetask'
10 require 'rake/clean'
11 require 'find'
12 require 'rubygems/package_task'
13
14 PROJ_DOC_TITLE = "The Marionette Collective"
15 PROJ_VERSION = "2.3.1"
16 PROJ_RELEASE = "2"
17 PROJ_NAME = "mcollective"
18 PROJ_RPM_NAMES = [PROJ_NAME]
19 PROJ_FILES = ["#{PROJ_NAME}.init", "COPYING", "doc", "etc", "lib", "plugins", "ext", "bin"]
20 PROJ_FILES.concat(Dir.glob("mc-*"))
21 RDOC_EXCLUDES = ["mcollective/vendor", "spec", "ext", "website", "plugins"]
22
23 ENV["RPM_VERSION"] ? CURRENT_VERSION = ENV["RPM_VERSION"] : CURRENT_VERSION = PROJ_VERSION
24 ENV["BUILD_NUMBER"] ? CURRENT_RELEASE = ENV["BUILD_NUMBER"] : CURRENT_RELEASE = PROJ_RELEASE
25 ENV["DEB_DISTRIBUTION"] ? PKG_DEB_DISTRIBUTION = ENV["DEB_DISTRIBUTION"] : PKG_DEB_DISTRIBUTION = "unstable"
26
27 CLEAN.include(["build", "doc"])
28
29 def announce(msg='')
30   STDERR.puts "================"
31   STDERR.puts msg
32   STDERR.puts "================"
33 end
34
35 def init
36   FileUtils.mkdir("build") unless File.exist?("build")
37 end
38
39 def safe_system *args
40   raise RuntimeError, "Failed: #{args.join(' ')}" unless system *args
41 end
42
43 spec = Gem::Specification.new do |s|
44   s.name = "mcollective-client"
45   s.version = PROJ_VERSION
46   s.author = "R.I.Pienaar"
47   s.email = "rip@puppetlabs.com"
48   s.homepage = "https://docs.puppetlabs.com/mcollective/"
49   s.summary = "Client libraries for The Marionette Collective"
50   s.description = "Client libraries for the mcollective Application Server"
51   s.files = FileList["{bin,lib}/**/*"].to_a
52   s.require_path = "lib"
53   s.test_files = FileList["spec/**/*"].to_a
54   s.has_rdoc = true
55   s.executables = "mco"
56   s.default_executable = "mco"
57   s.add_dependency "systemu"
58   s.add_dependency "json"
59   s.add_dependency "stomp"
60   s.add_dependency "i18n"
61
62   excluded_files = ["bin/mcollectived", "lib/mcollective/runner.rb", "lib/mcollective/vendor/json", "lib/mcollective/vendor/systemu", "lib/mcollective/vendor/i18n", "lib/mcollective/vendor/load"]
63
64   excluded_files.each do |file|
65     s.files.delete_if {|f| f.match(/^#{file}/)}
66   end
67 end
68
69 Gem::PackageTask.new(spec) do |pkg|
70   pkg.need_tar = false
71   pkg.need_zip = false
72   pkg.package_dir = "build"
73 end
74
75 desc "Build documentation, tar balls and rpms"
76 task :default => [:clean, :doc, :package]
77
78 # task for building docs
79 rd = Rake::RDocTask.new(:doc) { |rdoc|
80   rdoc.rdoc_dir = 'doc'
81   rdoc.title    = "#{PROJ_DOC_TITLE} version #{CURRENT_VERSION}"
82   rdoc.options << '--line-numbers' << '--main' << 'MCollective'
83
84   RDOC_EXCLUDES.each do |ext|
85     rdoc.options << '--exclude' << ext
86   end
87 }
88
89 desc "Run spec tests"
90 task :test do
91     sh "cd spec;rake"
92 end
93
94 desc "Create a tarball for this release"
95 task :package => [:clean, :doc] do
96   announce "Creating #{PROJ_NAME}-#{CURRENT_VERSION}.tgz"
97
98   FileUtils.mkdir_p("build/#{PROJ_NAME}-#{CURRENT_VERSION}")
99   safe_system("cp -R #{PROJ_FILES.join(' ')} build/#{PROJ_NAME}-#{CURRENT_VERSION}")
100
101   announce "Setting MCollective.version to #{CURRENT_VERSION}"
102   safe_system("cd build/#{PROJ_NAME}-#{CURRENT_VERSION}/lib && sed -i -e s/@DEVELOPMENT_VERSION@/#{CURRENT_VERSION}/ mcollective.rb")
103
104   safe_system("cd build && tar --exclude .svn -cvzf #{PROJ_NAME}-#{CURRENT_VERSION}.tgz #{PROJ_NAME}-#{CURRENT_VERSION}")
105 end
106
107 desc "Creates the website as a tarball"
108 task :website => [:clean] do
109   FileUtils.mkdir_p("build/marionette-collective.org/html")
110
111   Dir.chdir("website") do
112     safe_system("jekyll ../build/marionette-collective.org/html")
113   end
114
115   unless File.exist?("build/marionette-collective.org/html/index.html")
116     raise "Failed to build website"
117   end
118
119   Dir.chdir("build") do
120     safe_system("tar -cvzf marionette-collective-org-#{Time.now.to_i}.tgz marionette-collective.org")
121   end
122 end
123
124 desc "Creates a RPM"
125 task :rpm => [:clean, :doc, :package] do
126   announce("Building RPM for #{PROJ_NAME}-#{CURRENT_VERSION}-#{CURRENT_RELEASE}")
127
128   sourcedir = `rpm --eval '%_sourcedir'`.chomp
129   specsdir = `rpm --eval '%_specdir'`.chomp
130   srpmsdir = `rpm --eval '%_srcrpmdir'`.chomp
131   rpmdir = `rpm --eval '%_rpmdir'`.chomp
132   lsbdistrel = `lsb_release -r -s | cut -d . -f1`.chomp
133   lsbdistro = `lsb_release -i -s`.chomp
134
135   `which rpmbuild-md5`
136   rpmcmd = $?.success? ? 'rpmbuild-md5' : 'rpmbuild'
137
138   case lsbdistro
139   when 'CentOS'
140     rpmdist = ".el#{lsbdistrel}"
141   when 'Fedora'
142     rpmdist = ".fc#{lsbdistrel}"
143   else
144     rpmdist = ""
145   end
146
147   safe_system %{cp build/#{PROJ_NAME}-#{CURRENT_VERSION}.tgz #{sourcedir}}
148   safe_system %{cat ext/redhat/#{PROJ_NAME}.spec|sed -e s/%{rpm_release}/#{CURRENT_RELEASE}/g | sed -e s/%{version}/#{CURRENT_VERSION}/g > #{specsdir}/#{PROJ_NAME}.spec}
149
150   if ENV['SIGNED'] == '1'
151     safe_system %{#{rpmcmd} --sign -D 'version #{CURRENT_VERSION}' -D 'rpm_release #{CURRENT_RELEASE}' -D 'dist #{rpmdist}' -D 'use_lsb 0' -ba #{specsdir}/#{PROJ_NAME}.spec}
152   else
153     safe_system %{#{rpmcmd} -D 'version #{CURRENT_VERSION}' -D 'rpm_release #{CURRENT_RELEASE}' -D 'dist #{rpmdist}' -D 'use_lsb 0' -ba #{specsdir}/#{PROJ_NAME}.spec}
154   end
155
156   safe_system %{cp #{srpmsdir}/#{PROJ_NAME}-#{CURRENT_VERSION}-#{CURRENT_RELEASE}#{rpmdist}.src.rpm build/}
157
158   safe_system %{cp #{rpmdir}/*/#{PROJ_NAME}*-#{CURRENT_VERSION}-#{CURRENT_RELEASE}#{rpmdist}.*.rpm build/}
159 end
160
161 desc "Create the .debs"
162 task :deb => [:clean, :doc, :package] do
163   announce("Building debian packages")
164
165   FileUtils.mkdir_p("build/deb")
166   Dir.chdir("build/deb") do
167     safe_system %{tar -xzf ../#{PROJ_NAME}-#{CURRENT_VERSION}.tgz}
168     safe_system %{cp ../#{PROJ_NAME}-#{CURRENT_VERSION}.tgz #{PROJ_NAME}_#{CURRENT_VERSION}.orig.tar.gz}
169
170     Dir.chdir("#{PROJ_NAME}-#{CURRENT_VERSION}") do
171       safe_system %{cp -R ext/debian .}
172       safe_system %{cp -R ext/debian/mcollective.init .}
173       safe_system %{cp -R ext/Makefile .}
174
175       File.open("debian/changelog", "w") do |f|
176         f.puts("mcollective (#{CURRENT_VERSION}-#{CURRENT_RELEASE}) #{PKG_DEB_DISTRIBUTION}; urgency=low")
177         f.puts
178         f.puts("  * Automated release for #{CURRENT_VERSION}-#{CURRENT_RELEASE} by rake deb")
179         f.puts
180         f.puts("    See http://marionette-collective.org/releasenotes.html for full details")
181         f.puts
182         f.puts(" -- The Marionette Collective <mcollective-dev@googlegroups.com>  #{Time.new.strftime('%a, %d %b %Y %H:%M:%S %z')}")
183       end
184
185       if ENV['SIGNED'] == '1'
186         if ENV['SIGNWITH']
187           safe_system %{debuild -i -k#{ENV['SIGNWITH']}}
188         else
189           safe_system %{debuild -i}
190         end
191       else
192         safe_system %{debuild -i -us -uc}
193       end
194     end
195
196     safe_system %{cp *.deb *.dsc *.diff.gz *.orig.tar.gz *.changes ..}
197   end
198 end
199
200 desc "Update the website error code reference based on current local"
201 task :update_msgweb do
202   mcollective_dir = File.join(File.dirname(__FILE__))
203
204   $:.insert(0, File.join(mcollective_dir, "lib"))
205
206   require 'mcollective'
207
208   messages = YAML.load_file(File.join(mcollective_dir, "lib", "mcollective", "locales", "en.yml"))
209
210   webdir = File.join(mcollective_dir, "website", "messages")
211
212   I18n.load_path = Dir[File.join(mcollective_dir, "lib", "mcollective", "locales", "*.yml")]
213   I18n.locale = :en
214
215   messages["en"].keys.each do |msg_code|
216     md_file = File.join(webdir, "#{msg_code}.md")
217
218     puts "....writing %s" % md_file
219
220     File.open(md_file, "w") do |md|
221       md.puts "---"
222       md.puts "layout: default"
223       md.puts "title: Message detail for %s" % msg_code
224       md.puts "toc: false"
225       md.puts "---"
226       md.puts
227       md.puts "Detail for Marionette Collective message %s" % msg_code
228       md.puts "==========================================="
229       md.puts
230       md.puts "Example Message"
231       md.puts "---------------"
232       md.puts
233       md.puts "    %s" % (MCollective::Util.t("%s.example" % msg_code, :raise => true) rescue MCollective::Util.t("%s.pattern" % msg_code))
234       md.puts
235       md.puts "Additional Information"
236       md.puts "----------------------"
237       md.puts
238       md.puts MCollective::Util.t("%s.expanded" % msg_code, :raise => true)
239     end
240   end
241 end