~ubuntu-branches/ubuntu/wily/ruby-passenger/wily-proposed

« back to all changes in this revision

Viewing changes to build/packaging.rb

  • Committer: Package Import Robot
  • Author(s): Felix Geyer
  • Date: 2013-11-23 23:50:02 UTC
  • mfrom: (1.1.4)
  • Revision ID: package-import@ubuntu.com-20131123235002-8fdhsq7afj15o2z2
Tags: 4.0.25-1
* New upstream release.
* Refresh fix_install_path.patch.
* Build for Ruby 2.0 instead of 1.8. (Closes: #725591)
* Add fix_ftbfs_fortify_source.patch.
* Install passenger template files.

Show diffs side-by-side

added added

removed removed

Lines of Context:
25
25
 
26
26
def recursive_copy_files(files, destination_dir, preprocess = false, variables = {})
27
27
        require 'fileutils' if !defined?(FileUtils)
 
28
        if !STDOUT.tty?
 
29
                puts "Copying files..."
 
30
        end
28
31
        files.each_with_index do |filename, i|
29
32
                dir = File.dirname(filename)
30
33
                if !File.exist?("#{destination_dir}/#{dir}")
40
43
                                FileUtils.install(filename, "#{destination_dir}/#{filename}", :preserve => true)
41
44
                        end
42
45
                end
43
 
                printf "\r[%5d/%5d] [%3.0f%%] Copying files...", i + 1, files.size, i * 100.0 / files.size
44
 
                STDOUT.flush
45
 
        end
46
 
        printf "\r[%5d/%5d] [%3.0f%%] Copying files...\n", files.size, files.size, 100
 
46
                if STDOUT.tty?
 
47
                        printf "\r[%5d/%5d] [%3.0f%%] Copying files...", i + 1, files.size, i * 100.0 / files.size
 
48
                        STDOUT.flush
 
49
                end
 
50
        end
 
51
        if STDOUT.tty?
 
52
                printf "\r[%5d/%5d] [%3.0f%%] Copying files...\n", files.size, files.size, 100
 
53
        end
 
54
end
 
55
 
 
56
def word_wrap(text, max = 72)
 
57
        while index = (lines = text.split("\n")).find_index{ |line| line.size > max }
 
58
                line = lines[index]
 
59
                pos = max
 
60
                while pos >= 0 && line[pos..pos] != " "
 
61
                        pos -= 1
 
62
                end
 
63
                if pos < 0
 
64
                        raise "Cannot wrap line: #{line}"
 
65
                else
 
66
                        lines[index] = line[0 .. pos - 1]
 
67
                        lines.insert(index + 1, line[pos + 1 .. -1])
 
68
                        text = lines.join("\n")
 
69
                end
 
70
        end
 
71
        return text
47
72
end
48
73
 
49
74
 
50
75
task :clobber => 'package:clean'
51
76
 
 
77
task 'package:set_official' do
 
78
        ENV['OFFICIAL_RELEASE'] = '1'
 
79
end
 
80
 
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'
55
85
        require 'yaml'
56
86
        require 'uri'
57
87
        require 'net/http'
58
88
        require 'net/https'
 
89
        require 'digest/sha1'
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: ..."
78
109
        end
79
110
 
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"
 
114
        end
 
115
 
 
116
        tag = "#{tag_prefix}-#{version}"
 
117
        sh "git tag -s #{tag} -u 0A212A8C -m 'Release #{version}'"
81
118
 
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}"
85
122
                
86
123
                if is_open_source
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"
 
126
 
89
127
                        puts "Updating version number on website..."
90
128
                        if is_beta
91
129
                                uri = URI.parse("https://www.phusionpassenger.com/latest_beta_version")
104
142
                                        "Status: #{response.code}\n\n" +
105
143
                                        response.body
106
144
                        end
 
145
 
 
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)
 
149
                        end
 
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|
 
168
                                f.write(formula)
 
169
                        end
 
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"
 
173
 
 
174
                        puts "Initiating building of Debian packages"
 
175
                        Rake::Task['package:initiate_debian_building'].invoke
 
176
 
 
177
                        puts "Building OS X binaries..."
 
178
                        sh "cd ../passenger_autobuilder && " +
 
179
                                "git pull && " +
 
180
                                "./autobuild-osx https://github.com/phusion/passenger.git passenger psg_autobuilder_chroot@juvia-helper.phusion.nl --tag=#{tag}"
107
181
                        puts "--------------"
108
182
                        puts "All done."
109
183
                else
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
 
187
 
 
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"
 
192
 
 
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}'"
 
198
 
 
199
                        puts "Initiating building of Debian packages"
 
200
                        Rake::Task['package:initiate_debian_building'].invoke
 
201
 
 
202
                        sh "cd ../passenger_autobuilder && " +
 
203
                                "git pull && " +
 
204
                                "./autobuild-osx TODO passenger-enterprise psg_autobuilder_chroot@juvia-helper.phusion.nl --tag=#{tag}"
114
205
                end
115
206
        else
116
207
                puts "Did not upload anything."
119
210
 
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"
123
 
        sh "mkdir -p pkg"
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
 
216
        end
 
217
        begin
 
218
                if release_file
 
219
                        File.open(release_file, "w").close
 
220
                end
 
221
                command = "gem build #{PhusionPassenger::PACKAGE_NAME}.gemspec"
 
222
                if !boolean_option('SKIP_SIGNING')
 
223
                        command << " --sign --key 0x0A212A8C"
 
224
                end
 
225
                sh(command)
 
226
        ensure
 
227
                if release_file
 
228
                        File.unlink(release_file) rescue nil
 
229
                end
 
230
        end
 
231
        sh "mkdir -p #{PKG_DIR}"
 
232
        sh "mv #{PhusionPassenger::PACKAGE_NAME}-#{PhusionPassenger::VERSION_STRING}.gem #{PKG_DIR}/"
125
233
end
126
234
 
127
235
task 'package:tarball' => Packaging::PREGENERATED_FILES do
129
237
        require 'fileutils'
130
238
 
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
 
245
        end
 
246
        sh "cd #{PKG_DIR} && tar -c #{basename} | gzip --best > #{basename}.tar.gz"
 
247
        sh "rm -rf #{PKG_DIR}/#{basename}"
137
248
end
138
249
 
139
250
task 'package:sign' do
172
283
        end
173
284
end
174
285
 
 
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
 
290
 
 
291
        if is_open_source
 
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}"
 
296
        else
 
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}"
 
302
        end
 
303
 
 
304
        sh "ssh psg_apt_automation@juvia-helper.phusion.nl at now <<<'#{command}'"
 
305
end
 
306
 
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}"
180
312
end
181
313
 
 
314
def change_shebang(filename, value)
 
315
        contents = File.open(filename, "r") do |f|
 
316
                f.read
 
317
        end
 
318
        contents.gsub!(/\A#\!.+$/, "#!#{value}")
 
319
        File.open(filename, "w") do |f|
 
320
                f.write(contents)
 
321
        end
 
322
end
 
323
 
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"
205
349
        
206
350
        sh "rm -rf #{fakeroot}"
207
351
        sh "mkdir -p #{fakeroot}"
211
355
        sh "cp #{PhusionPassenger.ruby_libdir}/phusion_passenger.rb #{fake_rubylibdir}/"
212
356
        sh "cp -R #{PhusionPassenger.ruby_libdir}/phusion_passenger #{fake_rubylibdir}/"
213
357
 
 
358
        # Node.js sources
 
359
        sh "mkdir -p #{fake_nodelibdir}"
 
360
        sh "cp -R #{PhusionPassenger.node_libdir}/phusion_passenger #{fake_nodelibdir}/"
 
361
 
214
362
        # Phusion Passenger common libraries
215
363
        sh "mkdir -p #{fake_libdir}"
216
364
        sh "cp -R #{PhusionPassenger.lib_dir}/common #{fake_libdir}/"
240
388
        # Headers necessary for building the Nginx module
241
389
        sh "mkdir -p #{fake_include_dir}"
242
390
        # Infer headers that the Nginx module needs
243
 
        headers = []
 
391
        headers = [
 
392
                ["ext/common/Exceptions.h", "Exceptions.h"]
 
393
        ]
244
394
        Dir["ext/nginx/*.[ch]"].each do |filename|
245
395
                File.read(filename).split("\n").grep(%r{#include "common/(.+)"}) do |match|
246
396
                        headers << ["ext/common/#{$1}", $1]
256
406
        end
257
407
 
258
408
        # Nginx module sources
259
 
        sh "mkdir -p #{fake_resources_dir}/ngx_http_passenger_module"
260
 
        sh "cp ext/nginx/* #{fake_resources_dir}/ngx_http_passenger_module/"
 
409
        sh "mkdir -p #{fake_nginx_module_source_dir}"
 
410
        sh "cp ext/nginx/* #{fake_nginx_module_source_dir}/"
261
411
        
262
412
        # Documentation
263
413
        sh "mkdir -p #{fake_docdir}"
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")
 
423
                end
271
424
        end
272
425
        
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")
 
432
                end
277
433
        end
278
434
        
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"
 
459
        end
 
460
 
 
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"
 
466
                end
301
467
        end
302
468
 
303
469
        sh "find #{fakeroot} -name .DS_Store -print0 | xargs -0 rm -f"