mirror of
https://git.launchpad.net/~ubuntu-release/britney/+git/britney2-ubuntu
synced 2025-06-05 14:51:37 +00:00
Promote packages with unbuilt reverse dependencies if testing version succeeds
Commit 463 ("Don't promote packages with unbuilt reverse dependencies") turned out to be too strict: This holds up too many innocent packages in -proposed. If unstable has an unbuilt/uninstallable reverse dependency D of a package P, trigger a test anyway (which will then most likely run against the testing version of D). If that succeeds, the unstable P did not break D and can be accepted. If it fails, D needs to be fixed. Ideally we would set up some clever apt pinning to force installation of testing-D, to avoid running into the uninstallability of unstable-D, but this is tricky and error prone. Drop the temporary "UNINST" state from commit 466 again. Instead, excuses.html will now show a test against the testing version of D together with a note that the unstable version is unbuilt/uninstallable. This should ideally clear up all cases where a requested result is neither present or pending. Log an error if that still happens (will be checked in the next couple of runs), and ensure in the tests that we don't trigger any outstanding "FIXME" log messages.
This commit is contained in:
parent
65c6e4df2a
commit
c9173b3ca3
@ -38,7 +38,6 @@ ADT_EXCUSES_LABELS = {
|
|||||||
"ALWAYSFAIL": '<span style="background:#e5c545">Always failed</span>',
|
"ALWAYSFAIL": '<span style="background:#e5c545">Always failed</span>',
|
||||||
"REGRESSION": '<span style="background:#ff6666">Regression</span>',
|
"REGRESSION": '<span style="background:#ff6666">Regression</span>',
|
||||||
"RUNNING": '<span style="background:#99ddff">Test in progress</span>',
|
"RUNNING": '<span style="background:#99ddff">Test in progress</span>',
|
||||||
"UNINST": '<span style="background:#99ddff">Unbuilt/uninstallable</span>',
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -170,11 +169,19 @@ class AutoPackageTest(object):
|
|||||||
continue
|
continue
|
||||||
for rdep in rdeps:
|
for rdep in rdeps:
|
||||||
rdep_src = binaries_info[rdep][SOURCE]
|
rdep_src = binaries_info[rdep][SOURCE]
|
||||||
|
# if rdep_src/unstable is known to be not built yet or
|
||||||
|
# uninstallable, try to run tests against testing; if that
|
||||||
|
# works, then the unstable src does not break the testing
|
||||||
|
# rdep_src and is fine
|
||||||
|
if rdep_src in self.excludes:
|
||||||
|
rdep_src_info = self.britney.sources['testing'][rdep_src]
|
||||||
|
self.log_verbose('Reverse dependency %s of %s/%s is unbuilt or uninstallable, running test against testing version %s' %
|
||||||
|
(rdep_src, src, ver, rdep_src_info[VERSION]))
|
||||||
|
else:
|
||||||
rdep_src_info = sources_info[rdep_src]
|
rdep_src_info = sources_info[rdep_src]
|
||||||
if rdep_src_info[AUTOPKGTEST] or self.has_autodep8(rdep_src_info):
|
if rdep_src_info[AUTOPKGTEST] or self.has_autodep8(rdep_src_info):
|
||||||
if rdep_src not in reported_pkgs:
|
if rdep_src not in reported_pkgs:
|
||||||
# we don't care about the version of rdep
|
tests.append((rdep_src, rdep_src_info[VERSION]))
|
||||||
tests.append((rdep_src, sources_info[rdep_src][VERSION]))
|
|
||||||
reported_pkgs.add(rdep_src)
|
reported_pkgs.add(rdep_src)
|
||||||
|
|
||||||
tests.sort(key=lambda (s, v): s)
|
tests.sort(key=lambda (s, v): s)
|
||||||
@ -395,12 +402,11 @@ class AutoPackageTest(object):
|
|||||||
#
|
#
|
||||||
|
|
||||||
def request(self, packages, excludes=None):
|
def request(self, packages, excludes=None):
|
||||||
if excludes is None:
|
if excludes:
|
||||||
excludes = []
|
|
||||||
self.excludes.update(excludes)
|
self.excludes.update(excludes)
|
||||||
|
|
||||||
self.log_verbose('Requested autopkgtests for %s, exclusions: %s' %
|
self.log_verbose('Requested autopkgtests for %s, exclusions: %s' %
|
||||||
(['%s/%s' % i for i in packages], str(excludes)))
|
(['%s/%s' % i for i in packages], str(self.excludes)))
|
||||||
for src, ver in packages:
|
for src, ver in packages:
|
||||||
for (testsrc, testver) in self.tests_for_source(src, ver):
|
for (testsrc, testver) in self.tests_for_source(src, ver):
|
||||||
if testsrc not in self.excludes:
|
if testsrc not in self.excludes:
|
||||||
@ -496,7 +502,7 @@ class AutoPackageTest(object):
|
|||||||
def results(self, trigsrc, trigver):
|
def results(self, trigsrc, trigver):
|
||||||
'''Return test results for triggering package
|
'''Return test results for triggering package
|
||||||
|
|
||||||
Return (passed, src, ver, arch -> ALWAYSFAIL|PASS|FAIL|RUNNING|UNINST)
|
Return (passed, src, ver, arch -> ALWAYSFAIL|PASS|FAIL|RUNNING)
|
||||||
iterator for all package tests that got triggered by trigsrc/trigver.
|
iterator for all package tests that got triggered by trigsrc/trigver.
|
||||||
'''
|
'''
|
||||||
for testsrc, testver in self.tests_for_source(trigsrc, trigver):
|
for testsrc, testver in self.tests_for_source(trigsrc, trigver):
|
||||||
@ -525,13 +531,13 @@ class AutoPackageTest(object):
|
|||||||
arch_status[arch] = 'RUNNING'
|
arch_status[arch] = 'RUNNING'
|
||||||
passed = False
|
passed = False
|
||||||
except KeyError:
|
except KeyError:
|
||||||
# neither done nor pending; excluded?
|
# ignore if adt or swift results are disabled,
|
||||||
if testsrc in self.excludes:
|
# otherwise this is unexpected
|
||||||
arch_status[arch] = 'UNINST'
|
if not hasattr(self.britney.options, 'adt_swift_url'):
|
||||||
passed = False
|
|
||||||
continue
|
continue
|
||||||
|
# FIXME: Ignore this error for now as it crashes britney, but investigate!
|
||||||
# ignore if adt or swift results are disabled
|
self.log_error('FIXME: Result for %s/%s/%s (triggered by %s/%s) is neither known nor pending!' %
|
||||||
|
(testsrc, testver, arch, trigsrc, trigver))
|
||||||
continue
|
continue
|
||||||
|
|
||||||
# disabled or ignored?
|
# disabled or ignored?
|
||||||
|
@ -1860,7 +1860,11 @@ class Britney(object):
|
|||||||
'r': self.options.series, 'a': arch}
|
'r': self.options.series, 'a': arch}
|
||||||
archmsg.append('<a href="%s">%s: %s</a>' %
|
archmsg.append('<a href="%s">%s: %s</a>' %
|
||||||
(url, arch, ADT_EXCUSES_LABELS[arch_status[arch]]))
|
(url, arch, ADT_EXCUSES_LABELS[arch_status[arch]]))
|
||||||
e.addhtml('autopkgtest for %s %s: %s' % (adtsrc, adtver, ', '.join(archmsg)))
|
if adtsrc in autopkgtest_excludes:
|
||||||
|
note = ' (%s is unbuilt/uninstallable)' % self.sources['unstable'][adtsrc][VERSION]
|
||||||
|
else:
|
||||||
|
note = ''
|
||||||
|
e.addhtml('autopkgtest for %s %s%s: %s' % (adtsrc, adtver, note, ', '.join(archmsg)))
|
||||||
|
|
||||||
# hints can override failures
|
# hints can override failures
|
||||||
if not passed:
|
if not passed:
|
||||||
|
@ -106,6 +106,8 @@ class TestAutoPkgTest(TestBase):
|
|||||||
except IOError:
|
except IOError:
|
||||||
self.pending_requests = None
|
self.pending_requests = None
|
||||||
|
|
||||||
|
self.assertNotIn('FIXME', out)
|
||||||
|
|
||||||
return out
|
return out
|
||||||
|
|
||||||
def test_no_request_for_uninstallable(self):
|
def test_no_request_for_uninstallable(self):
|
||||||
@ -378,7 +380,7 @@ lightgreen 1 i386 green 2
|
|||||||
NOT_CONSIDERED)
|
NOT_CONSIDERED)
|
||||||
os.unlink(self.fake_amqp)
|
os.unlink(self.fake_amqp)
|
||||||
|
|
||||||
# add unbuilt lightgreen
|
# add unbuilt lightgreen; should run tests against the old version
|
||||||
self.data.add_src('lightgreen', True, {'Version': '2', 'Testsuite': 'autopkgtest'})
|
self.data.add_src('lightgreen', True, {'Version': '2', 'Testsuite': 'autopkgtest'})
|
||||||
self.do_test(
|
self.do_test(
|
||||||
[],
|
[],
|
||||||
@ -387,14 +389,14 @@ lightgreen 1 i386 green 2
|
|||||||
r'\blightgreen\b.*>1</a> to .*>2<',
|
r'\blightgreen\b.*>1</a> to .*>2<',
|
||||||
r'autopkgtest for green 2: .*amd64.*Pass.*i386.*Pass',
|
r'autopkgtest for green 2: .*amd64.*Pass.*i386.*Pass',
|
||||||
r'autopkgtest for darkgreen 1: .*amd64.*Pass.*i386.*Pass',
|
r'autopkgtest for darkgreen 1: .*amd64.*Pass.*i386.*Pass',
|
||||||
r'autopkgtest for lightgreen 2: .*amd64.*Unbuilt/uninstallable.*i386.*Unbuilt/uninstallable',
|
r'autopkgtest for lightgreen 1 \(2 is unbuilt/uninstallable\): .*amd64.*Regression.*i386.*Regression',
|
||||||
r'lightgreen has no up-to-date binaries on any arch'],
|
r'lightgreen has no up-to-date binaries on any arch'],
|
||||||
['Valid candidate'])
|
['Valid candidate'])
|
||||||
|
|
||||||
# lightgreen's tests should not be triggered yet while it is unbuilt
|
# lightgreen's tests should not be triggered yet while it is unbuilt
|
||||||
self.assertEqual(self.amqp_requests, set())
|
self.assertEqual(self.amqp_requests, set())
|
||||||
|
|
||||||
# now lightgreen gets built and a test result
|
# now lightgreen 2 gets built, should trigger a new test run
|
||||||
self.swift.set_results({'autopkgtest-series': {
|
self.swift.set_results({'autopkgtest-series': {
|
||||||
'series/i386/l/lightgreen/20150101_100200@': (0, 'lightgreen 2'),
|
'series/i386/l/lightgreen/20150101_100200@': (0, 'lightgreen 2'),
|
||||||
'series/amd64/l/lightgreen/20150101_102000@': (0, 'lightgreen 2'),
|
'series/amd64/l/lightgreen/20150101_102000@': (0, 'lightgreen 2'),
|
||||||
|
Loading…
x
Reference in New Issue
Block a user