/[collab-qa]/debcluster/scripts/tasks/instest.rb
ViewVC logotype

Contents of /debcluster/scripts/tasks/instest.rb

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2001 - (show annotations) (download)
Wed Aug 24 11:40:55 2011 UTC (20 months, 4 weeks ago) by lucas
File size: 15177 byte(s)
find only candidate version
1 #!/usr/bin/ruby1.8 -w
2
3 require 'optparse'
4 require 'fileutils'
5 require 'pathname'
6
7 $package = nil
8 $chroot = nil
9 $uchroot = nil
10 $logfile = nil
11 $chroots = []
12 $tests_failed = []
13 $tests_ok = []
14
15 def create_chroot(chroot = $chroot)
16 chr = `schroot -c #{chroot} -b 2>&1`.chomp
17 if $?.exitstatus != 0
18 puts "chroot creation FAILED!\n#{chr}"
19 $tests_failed << 'create-chroot'
20 exit(0)
21 else
22 $chroots << chr
23 return chr
24 end
25 system("schroot -c #{chr} -r -- cp /proc/mounts /etc/mtab 2>&1")
26 end
27
28 def form(s)
29 return s.split(/\n/).map { |l| ' ' + l }.join("\n")
30 end
31
32 opts = OptionParser::new do |opts|
33 opts.banner = "Usage: ./buildpackage.rb [options]"
34 opts.separator ""
35 opts.separator "Options:"
36 opts.on("-p", "--package PACKAGE", "") { |p| $package = p }
37 opts.on("-c", "--chroot CHROOT", "") { |c| $chroot = c }
38 opts.on("-l", "--log LOGFILE", "Specify log file") { |l| $logfile = l }
39 opts.on("-u", "--upgrade-chroot CHROOT", "Specify a chroot to upgrade from (lenny chroot, usually)") { |c| $uchroot = c }
40 end
41 opts.parse!(ARGV)
42
43 $wdir = `mktemp -d /tmp/build.XXXXXX`.chomp
44 # cleanup
45 Dir::chdir($wdir)
46 ENV['http_proxy']=''
47
48 if $logfile != nil
49 system("mkdir -p #{File::dirname($logfile)}")
50 log = File::new($logfile, "w")
51 STDOUT.reopen(log)
52 STDERR.reopen(log)
53 end
54
55 # Copy chroot locally if needed
56 if ['lsid32', 'llenny32', 'lsid64', 'lsid64-instest', 'lsid64b', 'lsid64c', 'llucid32', 'llucid64', 'lsqueeze64-instest'].include?($chroot)
57 chr = $chroot.gsub(/^l/,'')
58 if not File::exists?("/debscratch/chroots/#{chr}.tgz")
59 system("lockfile-create /debscratch/chroots/#{chr}.lock")
60 if not File::exists?("/debscratch/chroots/#{chr}.tgz")
61 system("cp /dc/data/chroots/#{chr}.tgz /debscratch/chroots/#{chr}.tgz.#{$$}")
62 system("mv /debscratch/chroots/#{chr}.tgz.#{$$} /debscratch/chroots/#{chr}.tgz")
63 # Updating to refresh apt-p2p meta-informations
64 system("schroot -c #{$chroot} apt-get -o Debug::pkgProblemResolver=true update >/dev/null 2>&1")
65 end
66 system('lockfile-remove /debscratch/chroots/#{chr}.lock')
67 end
68 end
69
70 $tstart = Time::now
71 at_exit do
72 $chroots.each do |chr|
73 STDOUT.flush
74 system("schroot -c #{chr} -e")
75 if $?.exitstatus != 0
76 puts "Cleanup of chroot #{chr} failed. Running processes:"
77 loc = `schroot -c #{chr} -i | grep "Mount Location" | awk '{print $3}'`.chomp
78 loc = Pathname::new(loc).realpath
79 system("lsof +D #{loc}")
80 pids = `lsof -t +D #{loc}`.split.each do |pid|
81 if Pathname::new(`readlink /proc/#{pid}/root`.chomp).realpath == loc
82 system("kill -9 #{pid}")
83 else
84 puts "Skipping #{pid}: not correct root."
85 end
86 end
87 system("schroot -c #{chr} -e")
88 if $?.exitstatus != 0
89 puts "Cleanup of chroot still failed. Stopping there."
90 STDOUT.flush
91 sleep 86400
92 end
93 end
94 end
95 realtime = Time::now - $tstart
96 if $tests_failed.length == 0
97 puts "-- Result: OK"
98 else
99 puts "-- Result: FAILED"
100 end
101 puts "-- Total time: #{realtime}s"
102 puts "-- Tests OK: #{$tests_ok.join(' ')}"
103 puts "-- Tests Failed: #{$tests_failed.join(' ')}"
104
105 Dir::chdir("/")
106 system("rm -rf #{$wdir}")
107 end
108
109 # start!
110 puts "IT-Header: #{$package} #{$chroot} / #{$tstart}"
111
112 # first test. install b-deps first, then package.
113 chr = create_chroot
114 $defaultinst = false
115 print "-- Checking if the package is already installed: "
116 s = `schroot -c #{chr} -r -- apt-cache policy #{$package} 2>&1`.chomp
117 if s =~ /Installed: \(none\)/
118 puts "NO"
119 else
120 puts "YES"
121 $defaultinst = true
122 end
123 print "-- Finding version: #{$package} "
124 s = `schroot -c #{chr} -r -- apt-cache show --no-all-versions #{$package} 2>&1`.chomp
125 unstable_version = s.split(/\n/).grep(/^Version: /)[0].split(' ')[1]
126 puts unstable_version
127 STDOUT.flush
128 print "-- Finding depends and recommends: "
129 s = `schroot -c #{chr} -r -- apt-get -o Debug::pkgProblemResolver=true -s install #{$package} 2>&1`.chomp
130 if $?.exitstatus != 0
131 puts "FAILED\n#{form(s)}"
132 $tests_failed << 'find-deps'
133 exit(0)
134 end
135 pkgs = (s.split(/\n/).grep(/^Inst /).map { |e| e.split(' ')[1] } - [$package])
136 if pkgs != []
137 puts pkgs.join(' ')
138 print "-- Installing depends and recommends: "
139 s = `schroot -c #{chr} -r -- apt-get -o Debug::pkgProblemResolver=true -y install #{pkgs.join(' ')} 2>&1`
140 if $?.exitstatus != 0
141 puts "FAILED\n#{form(s)}"
142 $tests_failed << 'inst-deps'
143 puts "-- Installing depends failed, but we are trying to install the package directly anyway since apt might be able to do better."
144 else
145 puts "OK\n#{form(s)}"
146 $tests_ok << 'inst-deps'
147 end
148 else
149 puts "-- No depends to install, skipping dependencies installation."
150 end
151 STDOUT.flush
152
153 $use_workaround_db = false
154 def test_install_package(chr, testname, pkgm, instrecs)
155 if pkgm == :apt
156 if instrecs
157 cmd = "schroot -c #{chr} -r -- apt-get -o Debug::pkgProblemResolver=true -o APT::Install-Recommends=true -y install #{$package} 2>&1"
158 else
159 cmd = "schroot -c #{chr} -r -- apt-get -o Debug::pkgProblemResolver=true -o APT::Install-Recommends=false -y install #{$package} 2>&1"
160 end
161 elsif pkgm == :aptitude
162 cmd = "schroot -c #{chr} -r -- aptitude -y install #{$package} 2>&1"
163 end
164 s = `#{cmd}`
165 if $?.exitstatus == 0
166 puts "OK\n#{form(s)}"
167 else
168 puts "FAILED\n#{form(s)}"
169 if s =~ /Is the server running locally and accepting connections on Unix domain socket "\/var\/run\/postgresql\// or
170 s =~ /psql: could not connect to server: No such file or directory/ or
171 s =~ /connections on Unix domain socket "\/var\/run\/postgresql\// or
172 s =~ /Can't connect to local MySQL server through socket/ or
173 s =~ /warning: database package not installed\?/ or
174 $use_workaround_db
175 # postgresql hack
176 puts "-- Failed, maybe because postgresql or mysql was not running. Let's try after starting them."
177 file = File::new('/tmp/instest-pg-lock', 'w')
178 file.flock(File::LOCK_EX)
179 print "-- Installing postgresql and mysql, ignoring result: "
180 s = `schroot -c #{chr} -r -- apt-get -y install postgresql mysql-server 2>&1`
181 puts "\n#{form(s)}"
182 print "-- Starting postgresql: "
183 #system("schroot -c #{chr} -r -- sed -i \"s/#listen_addresses = 'localhost'/listen_addresses = ''/\" /etc/postgresql/8.4/main/postgresql.conf")
184 s = `schroot -c #{chr} -r -- /etc/init.d/postgresql start 2>&1`
185 if $?.exitstatus != 0
186 puts "FAILED\n#{form(s)}"
187 $tests_failed << testname
188 $tests_failed << 'start-postgresql'
189 exit(0)
190 end
191 puts "OK\n#{form(s)}"
192 print "-- Starting mysql: "
193 system("schroot -c #{chr} -r -- sed -i \"s/^bind-address.*/skip-networking/\" /etc/mysql/my.cnf")
194 s = `schroot -c #{chr} -r -- /etc/init.d/mysql start 2>&1`
195 if $?.exitstatus != 0
196 puts "FAILED\n#{form(s)}"
197 $tests_failed << testname
198 $tests_failed << 'start-mysql'
199 exit(0)
200 end
201 puts "OK\n#{form(s)}"
202
203 print "-- Retrying to install package: "
204 s = `#{cmd}`
205 if $?.exitstatus != 0
206 puts "FAILED\n#{form(s)}"
207 $tests_failed << testname
208 $tests_failed << 'inst-after-postgresql'
209 print "-- Stopping postgresql anyway: "
210 s = `schroot -c #{chr} -r -- /etc/init.d/postgresql stop 2>&1`
211 if $?.exitstatus != 0
212 puts "FAILED\n#{form(s)}"
213 $tests_failed << 'stop-postgresql'
214 else
215 puts "OK\n#{form(s)}"
216 end
217 print "-- Stopping mysql anyway: "
218 s = `schroot -c #{chr} -r -- /etc/init.d/mysql stop 2>&1`
219 if $?.exitstatus != 0
220 puts "FAILED\n#{form(s)}"
221 $tests_failed << 'stop-mysql'
222 else
223 puts "OK\n#{form(s)}"
224 end
225 exit(0)
226 end
227 puts "OK\n#{form(s)}"
228 $use_workaround_db = true
229 print "-- Stopping postgresql: "
230 s = `schroot -c #{chr} -r -- /etc/init.d/postgresql stop 2>&1`
231 if $?.exitstatus != 0
232 puts "FAILED\n#{form(s)}"
233 $tests_failed << testname
234 $tests_failed << 'stop-postgresql'
235 exit(0)
236 end
237 file.flock(File::LOCK_UN)
238 puts "OK\n#{form(s)}"
239 print "-- Stopping mysql: "
240 s = `schroot -c #{chr} -r -- /etc/init.d/mysql stop 2>&1`
241 if $?.exitstatus != 0
242 puts "FAILED\n#{form(s)}"
243 $tests_failed << testname
244 $tests_failed << 'stop-mysql'
245 exit(0)
246 end
247 puts "OK\n#{form(s)}"
248 else
249 $tests_failed << testname
250 exit(0)
251 end
252 end
253 if testname == 'inst-after-deps' and $tests_failed.include?('inst-deps')
254 # installing the deps failed for some reason, but installing the package
255 # worked. it might be caused by suboptimal apt choices. ignoring the inst-deps
256 # error.
257 $tests_failed.delete('inst-deps')
258 end
259 $tests_ok << testname
260 end
261
262 print "-- Installing the package after its depends and recommends: "
263 test_install_package(chr, 'inst-after-deps', :apt, true)
264 STDOUT.flush
265
266 dchr = create_chroot
267 print "-- Installing the package together with its depends, without recommends: "
268 test_install_package(dchr, 'inst-with-deps', :apt, false)
269 STDOUT.flush
270
271 print "-- Creating new chroot and installing aptitude: "
272 achr = create_chroot
273 s = `schroot -c #{achr} -r -- apt-get -o Debug::pkgProblemResolver=true -y install aptitude 2>&1`
274 if $?.exitstatus != 0
275 puts "FAILED while installing aptitude\n#{form(s)}"
276 $tests_failed << 'inst-aptitude'
277 exit(0)
278 else
279 puts "OK\n#{form(s)}"
280 end
281 print "-- Installing the package with aptitude: "
282 test_install_package(achr, 'inst-aptitude', :aptitude, true)
283 STDOUT.flush
284
285 chr = create_chroot
286 print "-- Installing the package together with its depends and recommends: "
287 pkgs_before = `schroot -c #{chr} -r -- dpkg -l 2>&1`.split(/\n/).grep(/^ii /).map { |e| e.split(/\s+/)[1] }
288 test_install_package(chr, 'inst-with-recs', :apt, true)
289 STDOUT.flush
290
291 if $defaultinst
292 puts "-- Package in default install, not testing removal."
293 else
294 pkgs_after = `schroot -c #{chr} -r -- dpkg -l 2>&1`.split(/\n/).grep(/^ii /).map { |e| e.split(/\s+/)[1] }
295 print "-- Removing the package: "
296 s = `schroot -c #{chr} -r -- apt-get -o Debug::pkgProblemResolver=true -y --force-yes remove #{$package} 2>&1`
297 if $?.exitstatus != 0
298 puts "FAILED\n#{form(s)}"
299 $tests_failed << 'rm-pkg'
300 else
301 puts "OK\n#{form(s)}"
302 $tests_ok << 'rm-pkg'
303 print "-- Removing all dependencies: "
304 # ignore problems with adduser and ucf at this point
305 # also about install-info, for now (bug filed against apt)
306 deps = (pkgs_after - pkgs_before - [$package, 'adduser', 'ucf', 'update-inetd', 'perl-modules', 'install-info'])
307 s = `schroot -c #{chr} -r -- apt-get -o Debug::pkgProblemResolver=true -y --force-yes remove #{deps.join(' ')} 2>&1`
308 if $?.exitstatus != 0
309 puts "FAILED\n#{form(s)}"
310 $tests_failed << 'rm-deps'
311 else
312 puts "OK\n#{form(s)}"
313 $tests_ok << 'rm-deps'
314 print "-- Purging package: "
315 s = `schroot -c #{chr} -r -- dpkg --purge #{$package} 2>&1`
316 if $?.exitstatus != 0
317 puts "FAILED\n#{form(s)}"
318 $tests_failed << 'purge-pkg'
319 else
320 puts "OK\n#{form(s)}"
321 $tests_ok << 'purge-pkg'
322 end
323 end
324 end
325 end
326
327 if $uchroot != nil
328 # Copy chroot locally if needed
329 if ['lsid32', 'llenny32', 'lsid64', 'lsid64-instest', 'lsid64b', 'lsid64c', 'llucid32', 'llucid64', 'lsqueeze64-instest'].include?($uchroot)
330 chr = $uchroot.gsub(/^l/,'')
331 if not File::exists?("/debscratch/chroots/#{chr}.tgz")
332 system("lockfile-create /debscratch/chroots/#{chr}.lock")
333 if not File::exists?("/debscratch/chroots/#{chr}.tgz")
334 system("cp /dc/data/chroots/#{chr}.tgz /debscratch/chroots/#{chr}.tgz.#{$$}")
335 system("mv /debscratch/chroots/#{chr}.tgz.#{$$} /debscratch/chroots/#{chr}.tgz")
336 # Updating to refresh apt-p2p meta-informations
337 system("schroot -c #{$uchroot} apt-get -o Debug::pkgProblemResolver=true update >/dev/null 2>&1")
338 end
339 system('lockfile-remove /debscratch/chroots/#{chr}.lock')
340 end
341 end
342 puts "-- Now testing upgrade from #{$uchroot}."
343 chr = create_chroot($uchroot)
344 print "-- Finding version in #{$uchroot}: #{$package} "
345 s = `schroot -c #{chr} -r -- apt-cache show #{$package} 2>&1`.chomp
346 sver = s.split(/\n/).grep(/^Version: /)
347 if sver == []
348 puts "NOT FOUND"
349 else
350 sver = sver[0].split(' ')[1]
351 puts sver
352 print "-- Installing #{$package} in #{$uchroot}: "
353 s = `schroot -c #{chr} -r -- apt-get -o Debug::pkgProblemResolver=true -y install #{$package} 2>&1`
354 if $?.exitstatus != 0
355 puts "FAILED\n#{form(s)}"
356 $tests_failed << 'inst-old'
357 else
358 puts "OK\n#{form(s)}"
359 $tests_ok << 'inst-old'
360 print "-- Upgrading distribution: "
361 s = "## Updating /etc/apt/sources.list...\n"
362 s += `schroot -c #{chr} -r -- sed -i 's/ squeeze / sid /' /etc/apt/sources.list 2>&1`
363 s += "## Running apt-get update...\n"
364 s += `schroot -c #{chr} -r -- apt-get -o Debug::pkgProblemResolver=true update 2>&1`
365 # s += "## Running apt-get -y install apt...\n"
366 # s += `schroot -c #{chr} -r -- apt-get -o Debug::pkgProblemResolver=true -y install apt 2>&1`
367 s += "## Running apt-get -y upgrade...\n"
368 s += `schroot -c #{chr} -r -- apt-get -o Debug::pkgProblemResolver=true -y upgrade 2>&1`
369 s += "## Running apt-get -y dist-upgrade...\n"
370 s += `schroot -c #{chr} -r -- apt-get -o Debug::pkgProblemResolver=true -y dist-upgrade 2>&1`
371 if $?.exitstatus != 0
372 puts "FAILED\n#{form(s)}"
373 $tests_failed << 'upgrade-old'
374 else
375 puts "OK\n#{form(s)}"
376 $tests_ok << 'upgrade-old'
377 print "-- Finding version of #{$package}: "
378 l = `schroot -c #{chr} -r -- dpkg -l 2>&1`.split(/\n/).grep(/^ii\s+#{Regexp::escape($package)}\s/)
379 if l.length == 1
380 new_version = l[0].split(/\s+/)[2]
381 puts new_version
382 elsif l == []
383 new_version = "UNINSTALLED"
384 puts new_version
385 else
386 p l
387 exit(0)
388 end
389 print "-- New version is unstable version: "
390 if new_version == unstable_version
391 puts "OK"
392 $tests_ok << 'pkg-upgrade'
393 else
394 puts "FAILED (#{new_version} != #{unstable_version})"
395 $tests_failed << 'pkg-upgrade'
396 print "-- Packages that will be removed if installed: "
397 s = `schroot -c #{chr} -r -- apt-get -o Debug::pkgProblemResolver=true -s install #{$package} 2>&1`.chomp
398 if $?.exitstatus != 0
399 puts "FAILED\n#{form(s)}"
400 $tests_failed << 'find-rm-after-upgrade'
401 exit(0)
402 end
403 pkgs = (s.split(/\n/).grep(/^Remv /).map { |e| e.split(' ')[1] })
404 puts pkgs.join(' ')
405 print "-- Trying to install new version anyway: "
406 s = `schroot -c #{chr} -r -- apt-get -o Debug::pkgProblemResolver=true -y install #{$package} 2>&1`
407 if $?.exitstatus != 0
408 puts "FAILED\n#{form(s)}"
409 tests_failed << 'inst-new-after-upgrade'
410 else
411 puts "OK\n#{form(s)}"
412 end
413 end
414 end
415 end
416 end
417 end

Properties

Name Value
svn:executable *

  ViewVC Help
Powered by ViewVC 1.1.5