40
43
FileUtils.install(filename, "#{destination_dir}/#{filename}", :preserve => true)
43
printf "\r[%5d/%5d] [%3.0f%%] Copying files...", i + 1, files.size, i * 100.0 / files.size
46
printf "\r[%5d/%5d] [%3.0f%%] Copying files...\n", files.size, files.size, 100
47
printf "\r[%5d/%5d] [%3.0f%%] Copying files...", i + 1, files.size, i * 100.0 / files.size
52
printf "\r[%5d/%5d] [%3.0f%%] Copying files...\n", files.size, files.size, 100
56
def word_wrap(text, max = 72)
57
while index = (lines = text.split("\n")).find_index{ |line| line.size > max }
60
while pos >= 0 && line[pos..pos] != " "
64
raise "Cannot wrap line: #{line}"
66
lines[index] = line[0 .. pos - 1]
67
lines.insert(index + 1, line[pos + 1 .. -1])
68
text = lines.join("\n")
50
75
task :clobber => 'package:clean'
77
task 'package:set_official' do
78
ENV['OFFICIAL_RELEASE'] = '1'
52
81
desc "Build, sign & upload gem & tarball"
53
task 'package:release' => ['package:gem', 'package:tarball', 'package:sign'] do
82
task 'package:release' => ['package:set_official', 'package:gem', 'package:tarball', 'package:sign'] do
54
83
require 'phusion_passenger'
84
require 'phusion_passenger/platform_info'
58
88
require 'net/https'
59
90
basename = "#{PhusionPassenger::PACKAGE_NAME}-#{PhusionPassenger::VERSION_STRING}"
60
91
version = PhusionPassenger::VERSION_STRING
61
92
is_enterprise = basename =~ /enterprise/
77
108
"admin_password: ..."
80
sh "git tag -s #{tag_prefix}-#{version} -u 0A212A8C -m 'Release #{version}'"
111
if !PhusionPassenger::PlatformInfo.find_command("hub")
112
STDERR.puts "-------------------"
113
abort "*** ERROR: Please 'brew install hub' first"
116
tag = "#{tag_prefix}-#{version}"
117
sh "git tag -s #{tag} -u 0A212A8C -m 'Release #{version}'"
82
119
puts "Proceed with pushing tag to remote Git repo and uploading the gem and signatures? [y/n]"
83
120
if STDIN.readline == "y\n"
84
121
sh "git push origin #{tag_prefix}-#{version}"
87
sh "s3cmd -P put pkg/passenger-#{version}.{gem,tar.gz,gem.asc,tar.gz.asc} s3://phusion-passenger/releases/"
88
sh "gem push pkg/passenger-#{version}.gem"
124
sh "s3cmd -P put #{PKG_DIR}/passenger-#{version}.{gem,tar.gz,gem.asc,tar.gz.asc} s3://phusion-passenger/releases/"
125
sh "gem push #{PKG_DIR}/passenger-#{version}.gem"
89
127
puts "Updating version number on website..."
91
129
uri = URI.parse("https://www.phusionpassenger.com/latest_beta_version")
104
142
"Status: #{response.code}\n\n" +
146
puts "Submitting Homebrew pull request..."
147
sha1 = File.open("#{PKG_DIR}/passenger-#{version}.tar.gz", "rb") do |f|
148
Digest::SHA1.hexdigest(f.read)
150
homebrew_dir = "/tmp/homebrew"
151
sh "rm -rf #{homebrew_dir}"
152
sh "git clone git@github.com:phusion/homebrew.git #{homebrew_dir}"
153
sh "cd #{homebrew_dir} && git remote add mxcl https://github.com/mxcl/homebrew.git"
154
sh "cd #{homebrew_dir} && git fetch mxcl"
155
sh "cd #{homebrew_dir} && git reset --hard mxcl/master"
156
formula = File.read("/tmp/homebrew/Library/Formula/passenger.rb")
157
formula.gsub!(/passenger-.+?\.tar\.gz/, "passenger-#{version}.tar.gz") ||
158
abort("Unable to substitute Homebrew formula tarball filename")
159
formula.gsub!(/sha1 .*/, "sha1 '#{sha1}'") ||
160
abort("Unable to substitute Homebrew formula SHA-1")
161
necessary_dirs = ORIG_TARBALL_FILES.call.map{ |filename| filename.split("/").first }.uniq
162
necessary_dirs -= PhusionPassenger::Packaging::HOMEBREW_EXCLUDE
163
necessary_dirs += ["buildout"]
164
necessary_dirs_str = word_wrap(necessary_dirs.inspect).split("\n").join("\n ")
165
formula.sub!(/necessary_files = .*?\]/m, "necessary_files = Dir#{necessary_dirs_str}") ||
166
abort("Unable to substitute file whitelist")
167
File.open("/tmp/homebrew/Library/Formula/passenger.rb", "w") do |f|
170
sh "cd #{homebrew_dir} && git commit -a -m 'passenger #{version}'"
171
sh "cd #{homebrew_dir} && git push -f"
172
sh "cd #{homebrew_dir} && hub pull-request 'Update passenger to version #{version}' -b mxcl:master"
174
puts "Initiating building of Debian packages"
175
Rake::Task['package:initiate_debian_building'].invoke
177
puts "Building OS X binaries..."
178
sh "cd ../passenger_autobuilder && " +
180
"./autobuild-osx https://github.com/phusion/passenger.git passenger psg_autobuilder_chroot@juvia-helper.phusion.nl --tag=#{tag}"
107
181
puts "--------------"
110
184
dir = "/u/apps/passenger_website/shared"
111
185
subdir = string_option('NAME', version)
112
sh "scp pkg/#{basename}.{gem,tar.gz,gem.asc,tar.gz.asc} app@shell.phusion.nl:#{dir}/"
186
git_url = `git config remote.origin.url`.strip
188
sh "scp #{PKG_DIR}/#{basename}.{gem,tar.gz,gem.asc,tar.gz.asc} app@shell.phusion.nl:#{dir}/"
113
189
sh "ssh app@shell.phusion.nl 'mkdir -p \"#{dir}/assets/#{subdir}\" && mv #{dir}/#{basename}.{gem,tar.gz,gem.asc,tar.gz.asc} \"#{dir}/assets/#{subdir}/\"'"
190
sh "curl -F file=@#{PKG_DIR}/#{basename}.gem --user admin:#{website_config['admin_password']} " +
191
"https://www.phusionpassenger.com/enterprise_gems/upload"
193
puts "Initiating building of binaries"
194
command = "cd /srv/passenger_autobuilder/app && " +
195
"/tools/silence-unless-failed chpst -l /tmp/passenger_autobuilder.lock " +
196
"./autobuild-with-pbuilder #{git_url} passenger-enterprise --tag=#{tag}"
197
sh "ssh psg_autobuilder_run@juvia-helper.phusion.nl at now <<<'#{command}'"
199
puts "Initiating building of Debian packages"
200
Rake::Task['package:initiate_debian_building'].invoke
202
sh "cd ../passenger_autobuilder && " +
204
"./autobuild-osx TODO passenger-enterprise psg_autobuilder_chroot@juvia-helper.phusion.nl --tag=#{tag}"
116
207
puts "Did not upload anything."
120
211
task 'package:gem' => Packaging::PREGENERATED_FILES do
121
212
require 'phusion_passenger'
122
sh "gem build #{PhusionPassenger::PACKAGE_NAME}.gemspec --sign --key 0x0A212A8C"
124
sh "mv #{PhusionPassenger::PACKAGE_NAME}-#{PhusionPassenger::VERSION_STRING}.gem pkg/"
213
if ENV['OFFICIAL_RELEASE']
214
release_file = "#{PhusionPassenger.resources_dir}/release.txt"
215
File.unlink(release_file) rescue nil
219
File.open(release_file, "w").close
221
command = "gem build #{PhusionPassenger::PACKAGE_NAME}.gemspec"
222
if !boolean_option('SKIP_SIGNING')
223
command << " --sign --key 0x0A212A8C"
228
File.unlink(release_file) rescue nil
231
sh "mkdir -p #{PKG_DIR}"
232
sh "mv #{PhusionPassenger::PACKAGE_NAME}-#{PhusionPassenger::VERSION_STRING}.gem #{PKG_DIR}/"
127
235
task 'package:tarball' => Packaging::PREGENERATED_FILES do
129
237
require 'fileutils'
131
239
basename = "#{PhusionPassenger::PACKAGE_NAME}-#{PhusionPassenger::VERSION_STRING}"
132
sh "rm -rf pkg/#{basename}"
133
sh "mkdir -p pkg/#{basename}"
134
recursive_copy_files(ORIG_TARBALL_FILES.call, "pkg/#{basename}")
135
sh "cd pkg && tar -c #{basename} | gzip --best > #{basename}.tar.gz"
136
sh "rm -rf pkg/#{basename}"
240
sh "rm -rf #{PKG_DIR}/#{basename}"
241
sh "mkdir -p #{PKG_DIR}/#{basename}"
242
recursive_copy_files(ORIG_TARBALL_FILES.call, "#{PKG_DIR}/#{basename}")
243
if ENV['OFFICIAL_RELEASE']
244
File.open("#{PKG_DIR}/#{basename}/resources/release.txt", "w").close
246
sh "cd #{PKG_DIR} && tar -c #{basename} | gzip --best > #{basename}.tar.gz"
247
sh "rm -rf #{PKG_DIR}/#{basename}"
139
250
task 'package:sign' do
286
task 'package:initiate_debian_building' do
287
version = PhusionPassenger::VERSION_STRING
288
is_enterprise = PhusionPassenger::PACKAGE_NAME =~ /enterprise/
289
is_open_source = !is_enterprise
292
command = "cd /srv/passenger_apt_automation && " +
293
"chpst -l /tmp/passenger_apt_automation.lock " +
294
"/tools/silence-unless-failed " +
295
"./new_release https://github.com/phusion/passenger.git passenger.repo passenger.apt release-#{version}"
297
git_url = `git config remote.origin.url`.strip
298
command = "cd /srv/passenger_apt_automation && " +
299
"chpst -l /tmp/passenger_apt_automation.lock " +
300
"/tools/silence-unless-failed " +
301
"./new_release #{git_url} passenger-enterprise.repo passenger-enterprise.apt enterprise-#{version}"
304
sh "ssh psg_apt_automation@juvia-helper.phusion.nl at now <<<'#{command}'"
175
307
desc "Remove gem, tarball and signatures"
176
308
task 'package:clean' do
177
309
require 'phusion_passenger'
179
311
sh "rm -f pkg/#{basename}.{gem,gem.asc,tar.gz,tar.gz.asc}"
314
def change_shebang(filename, value)
315
contents = File.open(filename, "r") do |f|
318
contents.gsub!(/\A#\!.+$/, "#!#{value}")
319
File.open(filename, "w") do |f|
182
324
desc "Create a fakeroot, useful for building native packages"
183
325
task :fakeroot => [:apache2, :nginx, :doc] do
184
326
require 'rbconfig'
190
332
# the files to be installed to /usr, and the Ruby interpreter
191
333
# on the packaging machine might be in /usr/local.
192
334
fake_rubylibdir = "#{fakeroot}/usr/lib/ruby/vendor_ruby"
193
fake_libdir = "#{fakeroot}/usr/lib/passenger"
335
fake_nodelibdir = "#{fakeroot}/usr/share/#{GLOBAL_NAMESPACE_DIRNAME}/node"
336
fake_libdir = "#{fakeroot}/usr/lib/#{GLOBAL_NAMESPACE_DIRNAME}"
194
337
fake_native_support_dir = "#{fakeroot}/usr/lib/ruby/vendor_ruby/#{CONFIG['ruby_version']}/#{CONFIG['arch']}"
195
338
fake_agents_dir = "#{fakeroot}/usr/lib/#{GLOBAL_NAMESPACE_DIRNAME}/agents"
196
339
fake_helper_scripts_dir = "#{fakeroot}/usr/share/#{GLOBAL_NAMESPACE_DIRNAME}/helper-scripts"
197
fake_resources_dir = "#{fakeroot}/usr/share/passenger"
198
fake_include_dir = "#{fakeroot}/usr/share/passenger/include"
340
fake_resources_dir = "#{fakeroot}/usr/share/#{GLOBAL_NAMESPACE_DIRNAME}"
341
fake_include_dir = "#{fakeroot}/usr/share/#{GLOBAL_NAMESPACE_DIRNAME}/include"
199
342
fake_docdir = "#{fakeroot}/usr/share/doc/#{GLOBAL_NAMESPACE_DIRNAME}"
200
343
fake_bindir = "#{fakeroot}/usr/bin"
201
344
fake_sbindir = "#{fakeroot}/usr/sbin"
202
345
fake_apache2_module_dir = "#{fakeroot}/usr/lib/apache2/modules"
203
346
fake_apache2_module = "#{fake_apache2_module_dir}/mod_passenger.so"
204
fake_ruby_extension_source_dir = "#{fakeroot}/usr/share/passenger/ruby_extension_source"
347
fake_ruby_extension_source_dir = "#{fakeroot}/usr/share/#{GLOBAL_NAMESPACE_DIRNAME}/ruby_extension_source"
348
fake_nginx_module_source_dir = "#{fakeroot}/usr/share/#{GLOBAL_NAMESPACE_DIRNAME}/ngx_http_passenger_module"
206
350
sh "rm -rf #{fakeroot}"
207
351
sh "mkdir -p #{fakeroot}"
268
418
sh "mkdir -p #{fake_bindir}"
269
419
Packaging::USER_EXECUTABLES.each do |exe|
270
420
sh "cp bin/#{exe} #{fake_bindir}/"
421
if !Packaging::EXECUTABLES_WITH_FREE_RUBY.include?(exe)
422
change_shebang("#{fake_bindir}/#{exe}", "/usr/bin/ruby")
273
426
# Superuser binaries
274
427
sh "mkdir -p #{fake_sbindir}"
275
428
Packaging::SUPER_USER_EXECUTABLES.each do |exe|
276
429
sh "cp bin/#{exe} #{fake_sbindir}/"
430
if !Packaging::EXECUTABLES_WITH_FREE_RUBY.include?(exe)
431
change_shebang("#{fake_sbindir}/#{exe}", "/usr/bin/ruby")
279
435
# Apache 2 module
288
444
File.open("#{fake_rubylibdir}/phusion_passenger/locations.ini", "w") do |f|
289
445
f.puts "[locations]"
290
446
f.puts "natively_packaged=true"
291
f.puts "bin=/usr/bin"
292
f.puts "agents=/usr/lib/passenger/agents"
293
f.puts "libdir=/usr/lib/passenger"
294
f.puts "helper_scripts=/usr/share/passenger/helper-scripts"
295
f.puts "resources=/usr/share/passenger"
296
f.puts "includedir=/usr/share/passenger/include"
297
f.puts "doc=/usr/share/doc/passenger"
298
f.puts "rubylibdir=/usr/lib/ruby/vendor_ruby"
299
f.puts "apache2_module=/usr/lib/apache2/modules/mod_passenger.so"
300
f.puts "ruby_extension_source=/usr/share/passenger/ruby_extension_source"
447
f.puts "bin_dir=/usr/bin"
448
f.puts "agents_dir=/usr/lib/#{GLOBAL_NAMESPACE_DIRNAME}/agents"
449
f.puts "lib_dir=/usr/lib/#{GLOBAL_NAMESPACE_DIRNAME}"
450
f.puts "helper_scripts_dir=/usr/share/#{GLOBAL_NAMESPACE_DIRNAME}/helper-scripts"
451
f.puts "resources_dir=/usr/share/#{GLOBAL_NAMESPACE_DIRNAME}"
452
f.puts "include_dir=/usr/share/#{GLOBAL_NAMESPACE_DIRNAME}/include"
453
f.puts "doc_dir=/usr/share/doc/#{GLOBAL_NAMESPACE_DIRNAME}"
454
f.puts "ruby_libdir=/usr/lib/ruby/vendor_ruby"
455
f.puts "node_libdir=/usr/share/#{GLOBAL_NAMESPACE_DIRNAME}/node"
456
f.puts "apache2_module_path=/usr/lib/apache2/modules/mod_passenger.so"
457
f.puts "ruby_extension_source_dir=/usr/share/#{GLOBAL_NAMESPACE_DIRNAME}/ruby_extension_source"
458
f.puts "nginx_module_source_dir=/usr/share/#{GLOBAL_NAMESPACE_DIRNAME}/ngx_http_passenger_module"
461
# Sanity check the locations.ini file
462
options = PhusionPassenger.parse_ini_file("#{fake_rubylibdir}/phusion_passenger/locations.ini")
463
PhusionPassenger::REQUIRED_LOCATIONS_INI_FIELDS.each do |field|
464
if !options[field.to_s]
465
raise "Bug in build/packaging.rb: the generated locations.ini is missing the '#{field}' field"
303
469
sh "find #{fakeroot} -name .DS_Store -print0 | xargs -0 rm -f"