Commit 856f6a90 authored by Robert Ma's avatar Robert Ma Committed by Commit Bot

[webkitpy] Migrate to Buildbucket and switch to a new Mac try bot

The immediate issue this CL tries to fix is crbug.com/830629, which is
fixed by using mac_chromium_rel_ng instead of mac10.12_blink_rel for
rebaselining on Mac 10.12. After crbug.com/818301, the remaining
*_blink_rel bots need to be replaced as well.

(NOTE: mac_chromium_rel_ng is planned to be upgraded to 10.13 soon.
When that happens, mac_chromium_10.12_rel_ng should be used for 10.12.
We are using mac_chromium_rel_ng for now only because of capacity
issues of mac_chromium_10.12_rel_ng.)

Meanwhile, we take this chance to add support for LUCI Buildbucket as
Buildbot (and its "master" concept) is being deprecated. Buildbuckets
for each bot can now be specified in builders.json. The special
treatment for android_blink_rel is also moved into builders.json to
reduce the amount of magic in the code.

Bug: 830629
Change-Id: I4c1777f93ff63ccd7bc35abaaea435eafd19e18c
Reviewed-on: https://chromium-review.googlesource.com/1003132
Commit-Queue: Robert Ma <robertma@chromium.org>
Reviewed-by: default avatarQuinten Yearsley <qyearsley@chromium.org>
Cr-Commit-Position: refs/heads/master@{#549676}
parent ad11084a
......@@ -63,6 +63,11 @@
"is_try_builder": true
},
"mac10.12_blink_rel": {
"port_name": "mac-mac10.12",
"specifiers": ["Mac10.12", "Release"]
},
"mac_chromium_rel_ng": {
"bucket": "master.tryserver.chromium.mac",
"port_name": "mac-mac10.12",
"specifiers": ["Mac10.12", "Release"],
"is_try_builder": true
......@@ -88,6 +93,7 @@
"is_try_builder": true
},
"android_blink_rel": {
"bucket": "master.tryserver.chromium.android",
"port_name": "android-kitkat",
"specifiers": ["KitKat", "Release"],
"is_try_builder": true
......
......@@ -81,11 +81,28 @@ class MockHost(MockSystemHost):
'port_name': 'mac-mac10.12',
'specifiers': ['Mac10.12', 'Release']
},
'Fake Test Linux Try Bot': {
'fake_blink_try_linux': {
'port_name': 'linux-trusty',
'specifiers': ['Trusty', 'Release'],
'is_try_builder': True,
},
'fake_blink_try_win': {
'port_name': 'win-win10',
'specifiers': ['Win10', 'Release'],
'is_try_builder': True,
},
'fake_mac_cq': {
'bucket': 'master.tryserver.chromium.mac',
'port_name': 'mac-mac10.12',
'specifiers': ['Mac10.12', 'Release'],
'is_try_builder': True,
},
'android_blink_rel': {
'bucket': 'master.tryserver.chromium.android',
'port_name': 'android-kitkat',
'specifiers': ['KitKat', 'Release'],
'is_try_builder': True,
},
})
def git(self, path=None):
......
......@@ -59,22 +59,32 @@ class GitCL(object):
command += ['--auth-refresh-token-json', self._auth_refresh_token_json]
return self._host.executive.run_command(command, cwd=self._cwd)
def trigger_try_jobs(self, builders, master=None):
# TODO(crbug.com/700552): Let "git cl try" get the master automatically.
# (It tries to do this, but its map is unreliable.)
if not master:
# Assume Blink try bots (all on tryserver.blink except Android).
if 'android_blink_rel' in builders:
self.trigger_try_jobs(['android_blink_rel'],
master='tryserver.chromium.android')
builders = set(builders) - {'android_blink_rel'}
self.trigger_try_jobs(builders, 'tryserver.blink')
return
command = ['try', '-m', master]
for builder in sorted(builders):
command.extend(['-b', builder])
self.run(command)
def trigger_try_jobs(self, builders, bucket=None):
"""Triggers try jobs on the given builders.
Args:
builder: A list of builder names.
bucket: When specified, all jobs are triggered to be in this bucket
(instead of the configured or default buckets).
"""
if bucket:
builders_by_bucket = {bucket: builders}
else:
builders_by_bucket = self._group_builders_by_bucket(builders)
# Sort both buckets and builders to ensure stable unit tests.
for bucket in sorted(builders_by_bucket):
command = ['try', '-B', bucket]
for builder in sorted(builders_by_bucket[bucket]):
command.extend(['-b', builder])
self.run(command)
def _group_builders_by_bucket(self, builders):
builders_by_bucket = collections.defaultdict(list)
for builder in builders:
bucket = self._host.builders.bucket_for_builder(builder)
builders_by_bucket[bucket].append(builder)
return builders_by_bucket
def get_issue_number(self):
return self.run(['issue']).split()[2]
......
......@@ -31,11 +31,9 @@ class MockGitCL(object):
self.calls.append(['git', 'cl'] + args)
return 'mock output'
def trigger_try_jobs(self, builders=None, master=None):
builders = builders or self._builders
if not master:
master = 'tryserver.blink'
command = ['try', '-m', master]
def trigger_try_jobs(self, builders, bucket=None):
bucket = bucket or 'master.tryserver.blink'
command = ['try', '-B', bucket]
for builder in sorted(builders):
command.extend(['-b', builder])
self.run(command)
......
......@@ -38,59 +38,59 @@ class GitCLTest(unittest.TestCase):
git_cl.run(['issue'])
self.assertEqual(host.executive.calls, [['git', 'cl', 'issue']])
def test_trigger_try_jobs_with_frozenset(self):
# The trigger_try_jobs method may be called with an immutable set.
# It has special logic which assumes most builders to trigger are
# on the master tryserver.blink.
def test_trigger_try_jobs_with_list(self):
# When no bucket is specified, master.tryserver.blink is used by
# default. Besides, `git cl try` invocations are grouped by buckets.
host = MockHost()
git_cl = GitCL(host, auth_refresh_token_json='token.json')
git_cl.trigger_try_jobs(frozenset(['builder-a', 'builder-b']))
git_cl.trigger_try_jobs(['android_blink_rel', 'fake_blink_try_linux',
'fake_blink_try_win', 'fake_mac_cq'])
self.assertEqual(host.executive.calls, [
[
'git', 'cl', 'try',
'-m', 'tryserver.blink',
'-b', 'builder-a', '-b', 'builder-b',
'-B', 'master.tryserver.blink',
'-b', 'fake_blink_try_linux', '-b', 'fake_blink_try_win',
'--auth-refresh-token-json', 'token.json'
],
])
def test_trigger_try_jobs_with_list(self):
host = MockHost()
git_cl = GitCL(host, auth_refresh_token_json='token.json')
git_cl.trigger_try_jobs(['builder-a', 'android_blink_rel'])
self.assertEqual(host.executive.calls, [
[
'git', 'cl', 'try',
'-m', 'tryserver.chromium.android',
'-B', 'master.tryserver.chromium.android',
'-b', 'android_blink_rel',
'--auth-refresh-token-json', 'token.json'
],
[
'git', 'cl', 'try',
'-m', 'tryserver.blink',
'-b', 'builder-a',
'-B', 'master.tryserver.chromium.mac',
'-b', 'fake_mac_cq',
'--auth-refresh-token-json', 'token.json'
],
])
def test_trigger_try_jobs_with_android_blink_rel(self):
def test_trigger_try_jobs_with_frozenset(self):
# The trigger_try_jobs method may be called with an immutable set.
# It has special logic which assumes most builders to trigger are
# on the master tryserver.blink.
host = MockHost()
git_cl = GitCL(host, auth_refresh_token_json='token.json')
git_cl.trigger_try_jobs(frozenset(['builder-a', 'android_blink_rel']))
git_cl.trigger_try_jobs(frozenset(['fake_blink_try_linux', 'fake_blink_try_win']))
self.assertEqual(host.executive.calls, [
[
'git', 'cl', 'try',
'-m', 'tryserver.chromium.android',
'-b', 'android_blink_rel',
'-B', 'master.tryserver.blink',
'-b', 'fake_blink_try_linux', '-b', 'fake_blink_try_win',
'--auth-refresh-token-json', 'token.json'
],
])
def test_trigger_try_jobs_with_explicit_bucket(self):
# An explicit bucket overrides configured or default buckets.
host = MockHost()
git_cl = GitCL(host, auth_refresh_token_json='token.json')
git_cl.trigger_try_jobs(['fake_blink_try_linux', 'fake_mac_cq'],
bucket='luci.dummy')
self.assertEqual(host.executive.calls, [
[
'git', 'cl', 'try',
'-m', 'tryserver.blink',
'-b', 'builder-a',
'-B', 'luci.dummy',
'-b', 'fake_blink_try_linux', '-b', 'fake_mac_cq',
'--auth-refresh-token-json', 'token.json'
],
])
......
......@@ -36,6 +36,9 @@ import json
from webkitpy.common.path_finder import PathFinder
# TODO(crbug.com/818301): Remove it when we no longer have bots in this bucket.
DEFAULT_BUCKET = 'master.tryserver.blink'
class BuilderList(object):
......@@ -79,6 +82,9 @@ class BuilderList(object):
def all_port_names(self):
return sorted({b['port_name'] for b in self._builders.values()})
def bucket_for_builder(self, builder_name):
return self._builders[builder_name].get('bucket', DEFAULT_BUCKET)
def port_name_for_builder_name(self, builder_name):
return self._builders[builder_name]['port_name']
......
......@@ -42,6 +42,8 @@ class BuilderListTest(unittest.TestCase):
'Blink C (dbg)': {'port_name': 'port-c', 'specifiers': ['C', 'Release']},
'Try A': {'port_name': 'port-a', 'specifiers': ['A', 'Release'], 'is_try_builder': True},
'Try B': {'port_name': 'port-b', 'specifiers': ['B', 'Release'], 'is_try_builder': True},
'CQ Try A': {'bucket': 'bucket.a', 'port_name': 'port-a', 'specifiers': ['A', 'Release'], 'is_try_builder': True},
'CQ Try B': {'bucket': 'bucket.b', 'port_name': 'port-b', 'specifiers': ['B', 'Release'], 'is_try_builder': True},
})
def test_constructor_validates_list(self):
......@@ -52,7 +54,8 @@ class BuilderListTest(unittest.TestCase):
def test_all_builder_names(self):
builders = self.sample_builder_list()
self.assertEqual(['Blink A', 'Blink B', 'Blink B (dbg)', 'Blink C (dbg)', 'Try A', 'Try B'], builders.all_builder_names())
self.assertEqual(['Blink A', 'Blink B', 'Blink B (dbg)', 'Blink C (dbg)', 'CQ Try A', 'CQ Try B', 'Try A', 'Try B'],
builders.all_builder_names())
def test_all_continuous_builder_names(self):
builders = self.sample_builder_list()
......@@ -60,12 +63,20 @@ class BuilderListTest(unittest.TestCase):
def test_all_try_builder_names(self):
builders = self.sample_builder_list()
self.assertEqual(['Try A', 'Try B'], builders.all_try_builder_names())
self.assertEqual(['CQ Try A', 'CQ Try B', 'Try A', 'Try B'], builders.all_try_builder_names())
def test_all_port_names(self):
builders = self.sample_builder_list()
self.assertEqual(['port-a', 'port-b', 'port-c'], builders.all_port_names())
def test_bucket_for_builder_default_bucket(self):
builders = self.sample_builder_list()
self.assertEqual('master.tryserver.blink', builders.bucket_for_builder('Try A'))
def test_bucket_for_builder_configured_bucket(self):
builders = self.sample_builder_list()
self.assertEqual('bucket.a', builders.bucket_for_builder('CQ Try A'))
def test_port_name_for_builder_name(self):
builders = self.sample_builder_list()
self.assertEqual('port-b', builders.port_name_for_builder_name('Blink B'))
......
......@@ -26,10 +26,10 @@ BUILDER_CONFIGS = {
'mac_chromium_rel_ng': TestConfiguration('Mac', '', 'release'),
'win7_chromium_rel_ng': TestConfiguration('Win', '', 'release')
}
BUILDER_MASTERS = {
'linux_chromium_rel_ng': 'tryserver.chromium.linux',
'mac_chromium_rel_ng': 'tryserver.chromium.mac',
'win7_chromium_rel_ng': 'tryserver.chromium.win'
BUILDER_BUCKETS = {
'linux_chromium_rel_ng': 'master.tryserver.chromium.linux',
'mac_chromium_rel_ng': 'master.tryserver.chromium.mac',
'win7_chromium_rel_ng': 'master.tryserver.chromium.win'
}
FLAG_FILE = 'additional-driver-flag.setting'
......@@ -82,9 +82,9 @@ class TryFlag(object):
self._clear_expectations()
self._git_cl.run(['upload', '--bypass-hooks', '-f',
'-m', 'Flag try job for %s.' % self._args.flag])
for builder in sorted(BUILDER_MASTERS.keys()):
master = BUILDER_MASTERS[builder]
self._git_cl.trigger_try_jobs([builder], master)
for builder in sorted(BUILDER_BUCKETS):
bucket = BUILDER_BUCKETS[builder]
self._git_cl.trigger_try_jobs([builder], bucket)
def _create_expectation_line(self, result, test_configuration):
test_name = result.test_name()
......
......@@ -56,11 +56,11 @@ class TryFlagTest(unittest.TestCase):
self.assertEqual(git_cl.calls, [
['git', 'cl', 'upload', '--bypass-hooks', '-f',
'-m', 'Flag try job for --foo.'],
['git', 'cl', 'try', '-m', 'tryserver.chromium.linux',
['git', 'cl', 'try', '-B', 'master.tryserver.chromium.linux',
'-b', 'linux_chromium_rel_ng'],
['git', 'cl', 'try', '-m', 'tryserver.chromium.mac',
['git', 'cl', 'try', '-B', 'master.tryserver.chromium.mac',
'-b', 'mac_chromium_rel_ng'],
['git', 'cl', 'try', '-m', 'tryserver.chromium.win',
['git', 'cl', 'try', '-B', 'master.tryserver.chromium.win',
'-b', 'win7_chromium_rel_ng']
])
......
......@@ -393,7 +393,7 @@ class RebaselineCLTest(BaseTestCase, LoggingTestCase):
self.command.trigger_try_jobs(['MOCK Try Linux', 'MOCK Try Win'])
self.assertEqual(
self.command.git_cl.calls,
[['git', 'cl', 'try', '-m', 'tryserver.blink',
[['git', 'cl', 'try', '-B', 'master.tryserver.blink',
'-b', 'MOCK Try Linux', '-b', 'MOCK Try Win']])
self.assertLog([
'INFO: Triggering try jobs:\n',
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment