Bug 1339604 - stylo builds + tests should only run on limited branches to reduce budget impact r=dustin

This commit is contained in:
Kim Moir 2017-02-17 13:31:39 -05:00
parent 019c477d9c
commit 30bca95fc0
5 changed files with 96 additions and 34 deletions

View File

@ -272,6 +272,7 @@ linux64-stylo/opt:
secrets: true
custom-build-variant-cfg: stylo
tooltool-downloads: public
run-on-projects: [ 'stylo', 'autoland', 'mozilla-inbound', 'mozilla-central' ]
linux64-stylo/debug:
description: "Linux64 Debug Stylo"
@ -296,6 +297,7 @@ linux64-stylo/debug:
secrets: true
custom-build-variant-cfg: stylo-debug
tooltool-downloads: public
run-on-projects: [ 'stylo', 'autoland', 'mozilla-inbound', 'mozilla-central' ]
linux64-jsdcov/opt:
description: "Linux64-JSDCov Opt"

View File

@ -936,6 +936,17 @@ reftest-stylo:
by-test-platform:
linux64-stylo/opt: []
linux64-stylo/debug: []
e10s:
by-test-platform:
linux64-stylo/opt:
by-project:
mozilla-inbound: false
default: both
linux64-stylo/debug:
# only e10s on inbound
by-project:
mozilla-inbound: true
default: both
mozharness:
script: desktop_unittest.py
no-read-buildbot-config: true

View File

@ -53,6 +53,32 @@ class TestResolveKeyedBy(unittest.TestCase):
resolve_keyed_by({'x': {'a': 10}}, 'x', 'n'),
{'x': {'a': 10}})
def test_nested(self):
x = {
'by-foo': {
'F1': {
'by-bar': {
'B1': 11,
'B2': 12,
},
},
'F2': 20,
'default': 0,
},
}
self.assertEqual(
resolve_keyed_by({'x': x}, 'x', 'x', foo='F1', bar='B1'),
{'x': 11})
self.assertEqual(
resolve_keyed_by({'x': x}, 'x', 'x', foo='F1', bar='B2'),
{'x': 12})
self.assertEqual(
resolve_keyed_by({'x': x}, 'x', 'x', foo='F2'),
{'x': 20})
self.assertEqual(
resolve_keyed_by({'x': x}, 'x', 'x', foo='F99', bar='B1'),
{'x': 0})
def test_no_by_empty_dict(self):
self.assertEqual(
resolve_keyed_by({'x': {}}, 'x', 'n'),

View File

@ -119,7 +119,7 @@ test_description_schema = Schema({
# one task without e10s. E10s tasks have "-e10s" appended to the test name
# and treeherder group.
Required('e10s', default='both'): optionally_keyed_by(
'test-platform',
'test-platform', 'project',
Any(bool, 'both')),
# The EC2 instance size to run these tests on.
@ -456,7 +456,8 @@ def handle_keyed_by(config, tests):
]
for test in tests:
for field in fields:
resolve_keyed_by(test, field, item_name=test['test-name'])
resolve_keyed_by(test, field, item_name=test['test-name'],
project=config.params['project'])
yield test

View File

@ -34,13 +34,22 @@ def optionally_keyed_by(*arguments):
'some-value': optionally_keyed_by(
'test-platform', 'build-platform',
Any('a', 'b', 'c'))
The resulting schema will allow nesting of `by-test-platform` and
`by-build-platform` in either order.
"""
subschema = arguments[-1]
schema = arguments[-1]
fields = arguments[:-1]
options = [subschema]
for field in fields:
options.append({'by-' + field: {basestring: subschema}})
return voluptuous.Any(*options)
# build the nestable schema by generating schema = Any(schema,
# by-fld1, by-fld2, by-fld3) once for each field. So we don't allow
# infinite nesting, but one level of nesting for each field.
for _ in arguments:
options = [schema]
for field in fields:
options.append({'by-' + field: {basestring: schema}})
schema = voluptuous.Any(*options)
return schema
def resolve_keyed_by(item, field, item_name, **extra_values):
@ -50,7 +59,7 @@ def resolve_keyed_by(item, field, item_name, **extra_values):
(modifying `item` directly). The field is specified using dotted notation
to traverse dictionaries.
For example, given item
For example, given item::
job:
test-platform: linux128
@ -61,7 +70,7 @@ def resolve_keyed_by(item, field, item_name, **extra_values):
default: 12
a call to `resolve_keyed_by(item, 'job.chunks', item['thing-name'])
would mutate item in-place to
would mutate item in-place to::
job:
chunks: 12
@ -70,6 +79,17 @@ def resolve_keyed_by(item, field, item_name, **extra_values):
If extra_values are supplied, they represent additional values available
for reference from by-<field>.
Items can be nested as deeply as the schema will allow::
chunks:
by-test-platform:
win.*:
by-project:
ash: ..
cedar: ..
linux: 13
default: 12
"""
# find the field, returning the item unchanged if anything goes wrong
container, subfield = item, field
@ -84,33 +104,35 @@ def resolve_keyed_by(item, field, item_name, **extra_values):
if subfield not in container:
return item
value = container[subfield]
if not isinstance(value, dict) or len(value) != 1 or not value.keys()[0].startswith('by-'):
return item
while True:
if not isinstance(value, dict) or len(value) != 1 or not value.keys()[0].startswith('by-'):
return item
keyed_by = value.keys()[0][3:] # strip off 'by-' prefix
key = extra_values.get(keyed_by) if keyed_by in extra_values else item[keyed_by]
alternatives = value.values()[0]
keyed_by = value.keys()[0][3:] # strip off 'by-' prefix
key = extra_values.get(keyed_by) if keyed_by in extra_values else item[keyed_by]
alternatives = value.values()[0]
# exact match
if key in alternatives:
container[subfield] = alternatives[key]
return item
# exact match
if key in alternatives:
value = container[subfield] = alternatives[key]
continue
# regular expression match
matches = [(k, v) for k, v in alternatives.iteritems() if re.match(k + '$', key)]
if len(matches) > 1:
raise Exception(
"Multiple matching values for {} {!r} found while "
"determining item {} in {}".format(
keyed_by, key, field, item_name))
elif matches:
value = container[subfield] = matches[0][1]
continue
# default
if 'default' in alternatives:
value = container[subfield] = alternatives['default']
continue
# regular expression match
matches = [(k, v) for k, v in alternatives.iteritems() if re.match(k + '$', key)]
if len(matches) > 1:
raise Exception(
"Multiple matching values for {} {!r} found while determining item {} in {}".format(
"No {} matching {!r} nor 'default' found while determining item {} in {}".format(
keyed_by, key, field, item_name))
elif matches:
container[subfield] = matches[0][1]
return item
# default
if 'default' in alternatives:
container[subfield] = alternatives['default']
return item
raise Exception(
"No {} matching {!r} nor 'default' found while determining item {} in {}".format(
keyed_by, key, field, item_name))