blob: 8ca0b7224de40665de3a35a08e7c23e405dc4f40 [file] [log] [blame]
[email protected]4dc496d2012-01-04 21:07:371# Copyright (c) 2012 The Chromium Authors. All rights reserved.
[email protected]7d4b3e82010-12-22 02:43:302# Use of this source code is governed by a BSD-style license that can be
3# found in the LICENSE file.
4"""Define the supported projects."""
5
[email protected]624180d2012-04-20 18:00:146import json
[email protected]ba0cc0e2011-08-23 17:57:557import logging
[email protected]7d4b3e82010-12-22 02:43:308import os
9import re
10import sys
[email protected]de063502011-06-14 20:17:0911import urllib2
[email protected]7d4b3e82010-12-22 02:43:3012
[email protected]a3e45632011-04-21 01:55:4813import find_depot_tools # pylint: disable=W0611
[email protected]7d4b3e82010-12-22 02:43:3014import checkout
[email protected]a3e45632011-04-21 01:55:4815
[email protected]03878dc2011-07-29 15:53:2216import async_push
[email protected]5dba4db2011-07-25 22:42:5517import context
[email protected]68fa02b2011-04-12 21:03:5718import errors
[email protected]7d4b3e82010-12-22 02:43:3019import pending_manager
[email protected]d91910e2013-05-16 14:26:0820from post_processors import chromium_copyright
[email protected]7d4b3e82010-12-22 02:43:3021from verification import presubmit_check
[email protected]bfa5ce82011-01-11 21:47:4022from verification import project_base
[email protected]90b03452011-01-10 20:34:2023from verification import reviewer_lgtm
[email protected]c7991612011-01-18 22:04:0924from verification import tree_status
[email protected]08d4ba92014-01-10 17:21:1625from verification import trigger_experimental_try_job
[email protected]9f317612013-02-05 21:30:4926from verification import try_job_steps
[email protected]3ef39fe2012-09-11 12:20:3427from verification import try_job_on_rietveld
[email protected]54c00052013-02-01 23:22:3728from verification import try_server
29
[email protected]7d4b3e82010-12-22 02:43:3030
[email protected]95477b72011-12-06 16:01:3531ROOT_DIR = os.path.dirname(os.path.abspath(__file__))
[email protected]8eeff6b2013-10-10 23:21:5032INTERNAL_DIR = os.path.abspath(
33 os.path.join(ROOT_DIR, os.pardir, 'commit-queue-internal'))
[email protected]95477b72011-12-06 16:01:3534
35# These come from commit-queue in the internal repo.
[email protected]8eeff6b2013-10-10 23:21:5036if os.path.isdir(INTERNAL_DIR):
37 sys.path.insert(0, INTERNAL_DIR)
[email protected]95477b72011-12-06 16:01:3538 import chromium_committers # pylint: disable=F0401
[email protected]4dc496d2012-01-04 21:07:3739 import gyp_committers # pylint: disable=F0401
[email protected]95477b72011-12-06 16:01:3540 import nacl_committers # pylint: disable=F0401
[email protected]e4bc2d62013-02-20 12:52:0941 import skia_committers # pylint: disable=F0401
[email protected]8eeff6b2013-10-10 23:21:5042else:
[email protected]95477b72011-12-06 16:01:3543 print >> sys.stderr, (
[email protected]8eeff6b2013-10-10 23:21:5044 'Failed to find commit-queue-internal; will fail to start!')
[email protected]95477b72011-12-06 16:01:3545 chromium_committers = None
[email protected]4dc496d2012-01-04 21:07:3746 gyp_committers = None
[email protected]95477b72011-12-06 16:01:3547 nacl_committers = None
[email protected]e4bc2d62013-02-20 12:52:0948 skia_committers = None
[email protected]1ee1dd02014-01-28 18:23:2849
[email protected]4f4997d2012-03-09 02:11:5050
[email protected]bdc32c62011-02-24 01:56:4551# It's tricky here because 'chrome' is remapped to 'svn' on src.chromium.org but
52# the other repositories keep their repository name. So don't list it here.
53SVN_HOST_ALIASES = [
54 'svn://svn.chromium.org',
55 'svn://chrome-svn',
56 'svn://chrome-svn.corp',
57 'svn://chrome-svn.corp.google.com'
58]
59
60CHROME_SVN_BASES = [item + '/chrome' for item in SVN_HOST_ALIASES] + [
[email protected]dadef192011-01-18 01:04:4961 'http://src.chromium.org/svn',
[email protected]a129cf12011-05-16 19:30:2162 'https://src.chromium.org/svn',
[email protected]5266e1f2012-05-17 20:12:2263 'http://src.chromium.org/chrome',
64 'https://src.chromium.org/chrome',
[email protected]bdc32c62011-02-24 01:56:4565]
66
[email protected]666cf562013-04-09 03:53:5167BLINK_SVN_BASES = [item + '/blink' for item in SVN_HOST_ALIASES] + [
68 'http://src.chromium.org/blink',
69 'https://src.chromium.org/blink',
70]
71
[email protected]e1415ab2012-07-16 13:54:2072# Steps that are never considered to determine the try job success.
[email protected]4f4997d2012-03-09 02:11:5073IGNORED_STEPS = (
74 'svnkill', 'update_scripts', 'taskkill', 'cleanup_temp', 'process_dumps')
75
[email protected]e1415ab2012-07-16 13:54:2076# To be used in a regexp to match the branch part of an git url.
[email protected]1ab44ce2013-03-07 15:28:5077BRANCH_MATCH = r'\@[a-zA-Z0-9\-_\.]+'
[email protected]e1415ab2012-07-16 13:54:2078
[email protected]7d4b3e82010-12-22 02:43:3079
[email protected]4acc60a2011-08-22 19:48:2380def _read_lines(filepath, what):
[email protected]68fa02b2011-04-12 21:03:5781 try:
[email protected]4acc60a2011-08-22 19:48:2382 return open(filepath).readlines()
[email protected]68fa02b2011-04-12 21:03:5783 except IOError:
[email protected]4acc60a2011-08-22 19:48:2384 raise errors.ConfigurationError('Put the %s in %s' % (what, filepath))
85
86
[email protected]95477b72011-12-06 16:01:3587def _get_chromium_committers():
[email protected]4acc60a2011-08-22 19:48:2388 """Gets the list of all allowed committers."""
[email protected]95477b72011-12-06 16:01:3589 if not chromium_committers:
90 # Fake values.
91 entries = ['georges']
92 else:
93 entries = chromium_committers.get_list()
[email protected]ba0cc0e2011-08-23 17:57:5594 logging.info('Found %d committers' % len(entries))
[email protected]95477b72011-12-06 16:01:3595 return ['^%s$' % re.escape(i) for i in entries]
[email protected]1bee4992011-04-12 00:27:5796
97
[email protected]e4bc2d62013-02-20 12:52:0998def _get_skia_committers():
99 """Gets the list of all allowed committers."""
100 if not skia_committers:
101 # Fake values.
102 entries = ['georges']
103 else:
104 entries = skia_committers.get_list()
105 logging.info('Found %d committers' % len(entries))
106 return ['^%s$' % re.escape(i) for i in entries]
107
108
[email protected]95477b72011-12-06 16:01:35109def _get_nacl_committers():
[email protected]4acc60a2011-08-22 19:48:23110 """Gets the list of all allowed committers."""
[email protected]95477b72011-12-06 16:01:35111 if not nacl_committers:
112 # Fake values.
113 entries = ['georges']
114 else:
115 entries = nacl_committers.get_list()
[email protected]ba0cc0e2011-08-23 17:57:55116 logging.info('Found %d committers' % len(entries))
[email protected]95477b72011-12-06 16:01:35117 return ['^%s$' % re.escape(i) for i in entries]
[email protected]4acc60a2011-08-22 19:48:23118
119
[email protected]4dc496d2012-01-04 21:07:37120def _get_gyp_committers():
121 """Gets the list of all allowed committers."""
122 if not gyp_committers:
123 # Fake values.
124 entries = ['georges']
125 else:
126 entries = gyp_committers.get_list()
127 logging.info('Found %d committers' % len(entries))
128 return ['^%s$' % re.escape(i) for i in entries]
129
130
[email protected]de063502011-06-14 20:17:09131def _chromium_lkgr():
132 try:
133 return int(
[email protected]d3547fb2012-01-13 20:31:34134 urllib2.urlopen('https://chromium-status.appspot.com/lkgr').read())
135 except (ValueError, IOError):
136 return None
137
138
139def _nacl_lkgr():
140 try:
141 return int(
142 urllib2.urlopen('https://nativeclient-status.appspot.com/lkgr').read())
[email protected]de063502011-06-14 20:17:09143 except (ValueError, IOError):
144 return None
145
[email protected]03878dc2011-07-29 15:53:22146
147def _chromium_status_pwd(root_dir):
148 filepath = os.path.join(root_dir, '.chromium_status_pwd')
[email protected]4acc60a2011-08-22 19:48:23149 return _read_lines(filepath, 'chromium-status password')[0].strip()
[email protected]03878dc2011-07-29 15:53:22150
151
[email protected]654a44a2013-04-09 02:37:03152def _gen_blink(user, root_dir, rietveld_obj, no_try):
153 """Generates a PendingManager commit queue for blink/trunk."""
[email protected]654a44a2013-04-09 02:37:03154 local_checkout = checkout.SvnCheckout(
155 root_dir,
156 'blink',
157 user,
[email protected]db6a8012013-04-16 21:45:38158 None,
[email protected]654a44a2013-04-09 02:37:03159 'svn://svn.chromium.org/blink/trunk',
160 [])
161 context_obj = context.Context(
162 rietveld_obj,
163 local_checkout,
164 async_push.AsyncPush(
165 'https://chromium-status.appspot.com/cq',
166 _chromium_status_pwd(root_dir)))
167
[email protected]666cf562013-04-09 03:53:51168 project_bases = [
169 '^%s/trunk(|/.*)$' % re.escape(base) for base in BLINK_SVN_BASES]
[email protected]04c822d2013-07-26 04:14:34170 project_bases.append(
171 r'^https?\:\/\/chromium.googlesource.com\/chromium\/blink(?:\.git)?%s$' %
172 BRANCH_MATCH)
[email protected]654a44a2013-04-09 02:37:03173 verifiers_no_patch = [
174 project_base.ProjectBaseUrlVerifier(project_bases),
175 reviewer_lgtm.ReviewerLgtmVerifier(
176 _get_chromium_committers(),
177 [re.escape(user)]),
178 ]
[email protected]9a2bd592013-04-26 17:20:01179 verifiers = []
[email protected]39dcb6d2013-05-17 02:40:02180 prereq_builder = 'blink_presubmit'
[email protected]9a2bd592013-04-26 17:20:01181 prereq_tests = ['presubmit']
182 step_verifiers = [
183 try_job_steps.TryJobSteps(builder_name=prereq_builder,
184 steps=prereq_tests)]
[email protected]654a44a2013-04-09 02:37:03185 if not no_try:
[email protected]62485992013-06-12 19:26:18186 blink_tests = [
[email protected]9e666df2014-01-16 01:21:43187 'blink_heap_unittests',
[email protected]e75ed782013-09-30 23:39:26188 'blink_platform_unittests',
[email protected]68659ec2013-04-10 21:22:42189 'webkit_lint',
[email protected]62485992013-06-12 19:26:18190 'webkit_python_tests',
[email protected]68659ec2013-04-10 21:22:42191 'webkit_tests',
[email protected]62485992013-06-12 19:26:18192 'webkit_unit_tests',
[email protected]62485992013-06-12 19:26:18193 'wtf_unittests',
[email protected]68659ec2013-04-10 21:22:42194 ]
[email protected]8c403192013-05-09 23:24:24195
196 # A "compile-only" bot runs the webkit_lint tests (which are fast)
197 # in order to pick up the default build targets. We don't use the
198 # "compile" step because that will build all the chromium targets, not
199 # just the blink-specific ones.
200 compile_only = [ 'webkit_lint' ]
201
[email protected]654a44a2013-04-09 02:37:03202 builders_and_tests = {
[email protected]8c403192013-05-09 23:24:24203 'mac_layout': compile_only,
204 'win_layout': compile_only,
205
[email protected]f962fbc2013-10-24 01:28:47206 'linux_blink': blink_tests,
[email protected]d55fded2013-07-28 04:32:27207 'linux_blink_rel': blink_tests,
208 'mac_blink_rel': blink_tests,
209 'win_blink_rel': blink_tests,
[email protected]654a44a2013-04-09 02:37:03210 }
211
[email protected]9a2bd592013-04-26 17:20:01212 step_verifiers += [
213 try_job_steps.TryJobSteps(builder_name=b, prereq_builder=prereq_builder,
214 prereq_tests=prereq_tests, steps=s)
[email protected]654a44a2013-04-09 02:37:03215 for b, s in builders_and_tests.iteritems()
216 ]
217
[email protected]9a2bd592013-04-26 17:20:01218 verifiers.append(try_job_on_rietveld.TryRunnerRietveld(
219 context_obj,
220 'http://build.chromium.org/p/tryserver.chromium/',
221 user,
222 step_verifiers,
223 IGNORED_STEPS,
224 'src'))
[email protected]654a44a2013-04-09 02:37:03225
[email protected]570e1382013-04-18 21:16:20226 verifiers.append(tree_status.TreeStatusVerifier(
227 'https://blink-status.appspot.com'))
[email protected]654a44a2013-04-09 02:37:03228 return pending_manager.PendingManager(
229 context_obj,
230 verifiers_no_patch,
231 verifiers)
232
233
[email protected]98663522011-05-28 00:35:36234def _gen_chromium(user, root_dir, rietveld_obj, no_try):
[email protected]7d4b3e82010-12-22 02:43:30235 """Generates a PendingManager commit queue for chrome/trunk/src."""
[email protected]98663522011-05-28 00:35:36236 local_checkout = checkout.SvnCheckout(
237 root_dir,
238 'chromium',
239 user,
[email protected]db6a8012013-04-16 21:45:38240 None,
[email protected]9ca30712011-06-12 00:56:12241 'svn://svn.chromium.org/chrome/trunk/src',
[email protected]d91910e2013-05-16 14:26:08242 [chromium_copyright.process])
[email protected]03878dc2011-07-29 15:53:22243 context_obj = context.Context(
244 rietveld_obj,
245 local_checkout,
246 async_push.AsyncPush(
[email protected]5d62dd02011-09-22 21:58:58247 'https://chromium-status.appspot.com/cq',
[email protected]03878dc2011-07-29 15:53:22248 _chromium_status_pwd(root_dir)))
[email protected]7d4b3e82010-12-22 02:43:30249
[email protected]bfa5ce82011-01-11 21:47:40250 project_bases = [
[email protected]1bee4992011-04-12 00:27:57251 '^%s/trunk/src(|/.*)$' % re.escape(base) for base in CHROME_SVN_BASES]
[email protected]104c6532012-05-29 18:42:23252
253 aliases = (
254 # Old path.
[email protected]04c822d2013-07-26 04:14:34255 'git.chromium.org/git/chromium',
[email protected]104c6532012-05-29 18:42:23256 # New path.
[email protected]04c822d2013-07-26 04:14:34257 'git.chromium.org/chromium/src',
258 'chromium.googlesource.com/chromium/src',
[email protected]d50e0ec2013-09-13 02:16:05259 'chromium.googlesource.com/a/chromium/src',
[email protected]104c6532012-05-29 18:42:23260 )
[email protected]e1415ab2012-07-16 13:54:20261 project_bases.extend(
[email protected]04c822d2013-07-26 04:14:34262 r'^https?\:\/\/%s(?:\.git)?%s$' % (re.escape(i), BRANCH_MATCH)
263 for i in aliases)
[email protected]bfa5ce82011-01-11 21:47:40264 verifiers_no_patch = [
[email protected]4005b772011-02-09 22:58:24265 project_base.ProjectBaseUrlVerifier(project_bases),
[email protected]bfa5ce82011-01-11 21:47:40266 reviewer_lgtm.ReviewerLgtmVerifier(
[email protected]95477b72011-12-06 16:01:35267 _get_chromium_committers(),
[email protected]bfe33352011-02-02 21:04:12268 [re.escape(user)]),
[email protected]4005b772011-02-09 22:58:24269 ]
[email protected]9a2bd592013-04-26 17:20:01270 verifiers = []
271 prereq_builder = 'chromium_presubmit'
272 prereq_tests = ['presubmit']
273 step_verifiers = [
274 try_job_steps.TryJobSteps(builder_name=prereq_builder,
275 steps=prereq_tests)]
[email protected]7d4b3e82010-12-22 02:43:30276 if not no_try:
[email protected]2b7ee5a2012-02-22 19:54:27277 # To add tests to this list, they MUST be in
278 # /chrome/trunk/tools/build/masters/master.chromium/master_gatekeeper_cfg.py
279 # or somehow close the tree whenever they break.
[email protected]fd08e112012-09-13 13:04:25280 standard_tests = [
[email protected]ec495a12011-01-10 20:36:56281 'base_unittests',
[email protected]b7d8a702011-09-14 16:40:46282 'browser_tests',
[email protected]70851bb2011-07-29 17:48:46283 'cacheinvalidation_unittests',
[email protected]aca10a52013-04-30 20:36:44284 'check_deps',
[email protected]14d61382013-12-17 09:41:51285 'check_deps2git',
[email protected]75e588b2012-08-09 20:29:49286 'content_browsertests',
[email protected]e5a35cf2011-08-11 12:24:14287 'content_unittests',
[email protected]70851bb2011-07-29 17:48:46288 'crypto_unittests',
[email protected]fd08e112012-09-13 13:04:25289 #'gfx_unittests',
[email protected]f8b9d8c2011-09-23 21:52:07290 # Broken in release.
[email protected]4d43a132013-05-09 18:17:24291 #'url_unittests',
[email protected]70851bb2011-07-29 17:48:46292 'gpu_unittests',
[email protected]ec495a12011-01-10 20:36:56293 'ipc_tests',
[email protected]d1571342012-06-18 19:19:24294 'interactive_ui_tests',
[email protected]70851bb2011-07-29 17:48:46295 'jingle_unittests',
[email protected]ec495a12011-01-10 20:36:56296 'media_unittests',
297 'net_unittests',
[email protected]ad3cfc22012-11-20 17:45:27298 'ppapi_unittests',
[email protected]70851bb2011-07-29 17:48:46299 'printing_unittests',
[email protected]5776dd72011-07-21 00:44:46300 'sql_unittests',
[email protected]70851bb2011-07-29 17:48:46301 'sync_unit_tests',
[email protected]ec495a12011-01-10 20:36:56302 'unit_tests',
[email protected]2de26112012-01-25 14:12:35303 #'webkit_unit_tests',
[email protected]fd08e112012-09-13 13:04:25304 ]
[email protected]1c64d372013-11-15 01:08:04305 # Use a smaller set of tests for *_aura, since there's a lot of overlap with
306 # the corresponding *_rel builders.
307 # Note: *_aura are Release builders even if their names convey otherwise.
308 linux_aura_tests = [
309 'app_list_unittests',
310 'aura_unittests',
311 'browser_tests',
312 'compositor_unittests',
313 'content_browsertests',
314 'content_unittests',
[email protected]f779f1b2013-11-28 03:26:11315 'events_unittests',
[email protected]1c64d372013-11-15 01:08:04316 'interactive_ui_tests',
317 'unit_tests',
318 ]
[email protected]2b7ee5a2012-02-22 19:54:27319 builders_and_tests = {
[email protected]f1461e12012-05-07 18:59:54320 # TODO(maruel): Figure out a way to run 'sizes' where people can
321 # effectively update the perf expectation correctly. This requires a
322 # clobber=True build running 'sizes'. 'sizes' is not accurate with
323 # incremental build. Reference:
324 # http://chromium.org/developers/tree-sheriffs/perf-sheriffs.
325 # TODO(maruel): An option would be to run 'sizes' but not count a failure
326 # of this step as a try job failure.
[email protected]4d0de682013-02-21 06:49:18327 'android_dbg': ['slave_steps'],
328 'android_clang_dbg': ['slave_steps'],
[email protected]96f94e32013-07-26 19:49:22329 'android_aosp': ['compile'],
[email protected]e7430322012-11-27 20:46:53330 'ios_dbg_simulator': [
331 'compile',
[email protected]6fffa842013-09-07 01:17:37332 'base_unittests',
333 'content_unittests',
334 'crypto_unittests',
335 'url_unittests',
336 'net_unittests',
337 'sql_unittests',
338 'ui_unittests',
[email protected]e7430322012-11-27 20:46:53339 ],
340 'ios_rel_device': ['compile'],
[email protected]1c64d372013-11-15 01:08:04341 'linux_aura': linux_aura_tests,
[email protected]e7430322012-11-27 20:46:53342 'linux_clang': ['compile'],
[email protected]c4774eb2013-04-10 17:26:14343 'linux_chromeos_clang': ['compile'],
[email protected]e7430322012-11-27 20:46:53344 # Note: It is a Release builder even if its name convey otherwise.
345 'linux_chromeos': standard_tests + [
[email protected]208725c2013-05-21 04:01:36346 'app_list_unittests',
[email protected]76d1b272012-11-28 02:16:48347 'aura_unittests',
[email protected]2604a832013-03-13 18:06:36348 'ash_unittests',
[email protected]6c6e15d2012-11-27 21:26:24349 'chromeos_unittests',
[email protected]8dab50f2013-01-18 05:59:01350 'components_unittests',
[email protected]6c6e15d2012-11-27 21:26:24351 'dbus_unittests',
352 'device_unittests',
[email protected]f779f1b2013-11-28 03:26:11353 'events_unittests',
[email protected]79a53612013-11-15 19:19:07354 'google_apis_unittests',
[email protected]e7430322012-11-27 20:46:53355 'sandbox_linux_unittests',
356 ],
[email protected]fd08e112012-09-13 13:04:25357 'linux_rel': standard_tests + [
[email protected]b9d66d32013-05-01 02:12:38358 'cc_unittests',
[email protected]0b59ddf2013-12-18 21:39:35359 'chromedriver_unittests',
[email protected]8dab50f2013-01-18 05:59:01360 'components_unittests',
[email protected]79a53612013-11-15 19:19:07361 'google_apis_unittests',
[email protected]fd08e112012-09-13 13:04:25362 'nacl_integration',
363 'remoting_unittests',
[email protected]fd08e112012-09-13 13:04:25364 'sandbox_linux_unittests',
365 'sync_integration_tests',
[email protected]6ff436c2014-01-24 06:08:23366 'telemetry_perf_unittests',
367 'telemetry_unittests',
[email protected]fd08e112012-09-13 13:04:25368 ],
[email protected]168261c2012-07-30 23:43:56369 'mac': ['compile'],
[email protected]fd08e112012-09-13 13:04:25370 'mac_rel': standard_tests + [
[email protected]28455be2013-10-17 23:23:06371 'app_list_unittests',
[email protected]b9d66d32013-05-01 02:12:38372 'cc_unittests',
[email protected]0b59ddf2013-12-18 21:39:35373 'chromedriver_unittests',
[email protected]8dab50f2013-01-18 05:59:01374 'components_unittests',
[email protected]de4a66d2013-11-06 03:54:15375 'google_apis_unittests',
[email protected]b62bbfa2013-09-20 22:01:20376 'message_center_unittests',
[email protected]fd08e112012-09-13 13:04:25377 'nacl_integration',
378 'remoting_unittests',
[email protected]fd08e112012-09-13 13:04:25379 'sync_integration_tests',
[email protected]6ff436c2014-01-24 06:08:23380 'telemetry_perf_unittests',
[email protected]e5a00002013-07-24 23:20:09381 'telemetry_unittests',
[email protected]fd08e112012-09-13 13:04:25382 ],
[email protected]e7430322012-11-27 20:46:53383 'win': ['compile'],
[email protected]fd08e112012-09-13 13:04:25384 'win_rel': standard_tests + [
[email protected]28455be2013-10-17 23:23:06385 'app_list_unittests',
[email protected]96d655e2013-11-12 06:59:32386 'ash_unittests',
387 'aura_unittests',
[email protected]b9d66d32013-05-01 02:12:38388 'cc_unittests',
[email protected]d4ef6bc2013-12-17 23:06:14389 'chrome_elf_unittests',
[email protected]0b59ddf2013-12-18 21:39:35390 'chromedriver_unittests',
[email protected]8dab50f2013-01-18 05:59:01391 'components_unittests',
[email protected]96d655e2013-11-12 06:59:32392 'compositor_unittests',
[email protected]f779f1b2013-11-28 03:26:11393 'events_unittests',
[email protected]570af682013-12-14 02:32:29394 'google_apis_unittests',
[email protected]fd08e112012-09-13 13:04:25395 'installer_util_unittests',
396 'mini_installer_test',
[email protected]9c311962013-12-11 20:17:56397 'nacl_integration',
[email protected]fd08e112012-09-13 13:04:25398 'remoting_unittests',
[email protected]fd08e112012-09-13 13:04:25399 'sync_integration_tests',
[email protected]6ff436c2014-01-24 06:08:23400 'telemetry_perf_unittests',
[email protected]e5a00002013-07-24 23:20:09401 'telemetry_unittests',
[email protected]96d655e2013-11-12 06:59:32402 'views_unittests',
[email protected]fd08e112012-09-13 13:04:25403 ],
[email protected]601203d2013-02-25 17:23:15404 'win_x64_rel': [
[email protected]7a572722013-10-07 18:10:10405 'base_unittests',
[email protected]601203d2013-02-25 17:23:15406 ],
[email protected]2b7ee5a2012-02-22 19:54:27407 }
[email protected]9fd2b0e2013-02-20 19:47:49408
409 swarm_enabled_tests = (
410 'base_unittests',
[email protected]4d3c1832013-02-21 14:07:18411 'browser_tests',
[email protected]a154ae92013-05-02 13:29:59412 'interactive_ui_tests',
[email protected]9fd2b0e2013-02-20 19:47:49413 'net_unittests',
414 'unit_tests',
415 )
416
[email protected]e9ad0aa2013-10-08 13:49:04417 # pylint: disable=W0612
[email protected]b33765f2013-03-14 19:31:28418 swarm_test_map = dict(
[email protected]9fd2b0e2013-02-20 19:47:49419 (test, test + '_swarm') for test in swarm_enabled_tests)
420
[email protected]e9ad0aa2013-10-08 13:49:04421 # Commenting out the items below will make the CQ not use swarm for its
422 # execution. Uncomment to make the CQ use Swarming again.
[email protected]9fd2b0e2013-02-20 19:47:49423 swarm_enabled_builders_and_tests = {
[email protected]35af1242013-11-04 20:14:01424 ('linux_rel', 'linux_swarm_triggered'): swarm_test_map,
[email protected]7a203fa2013-11-12 14:11:11425 ('mac_rel', 'mac_swarm_triggered'): swarm_test_map,
[email protected]7a139382013-12-17 22:24:13426 ('win_rel', 'win_swarm_triggered'): swarm_test_map,
[email protected]9fd2b0e2013-02-20 19:47:49427 }
428
[email protected]9a2bd592013-04-26 17:20:01429 step_verifiers += [
430 try_job_steps.TryJobSteps(
431 builder_name=b, prereq_builder=prereq_builder,
432 prereq_tests=prereq_tests, steps=s)
[email protected]9fd2b0e2013-02-20 19:47:49433 for b, s in builders_and_tests.iteritems()
434 if b not in swarm_enabled_builders_and_tests
[email protected]43e38572013-02-06 15:57:31435 ] + [
[email protected]9fd2b0e2013-02-20 19:47:49436 try_job_steps.TryJobTriggeredSteps(
437 builder_name='android_dbg_triggered_tests',
438 trigger_name='android_dbg',
[email protected]9a2bd592013-04-26 17:20:01439 prereq_builder=prereq_builder,
440 prereq_tests=prereq_tests,
[email protected]7849c5f2013-02-21 22:04:05441 steps={'slave_steps': 'slave_steps'}),
[email protected]43e38572013-02-06 15:57:31442 ]
[email protected]ca597bd2012-10-10 06:44:59443
[email protected]9fd2b0e2013-02-20 19:47:49444 # Add the swarm enabled builders with swarm accepted tests.
[email protected]b735f6d2013-10-22 18:23:47445 for (builder, triggered), builder_swarm_enabled_tests in (
[email protected]9fd2b0e2013-02-20 19:47:49446 swarm_enabled_builders_and_tests.iteritems()):
447 regular_tests = list(set(builders_and_tests[builder]) -
[email protected]e9ad0aa2013-10-08 13:49:04448 set(builder_swarm_enabled_tests))
[email protected]9fd2b0e2013-02-20 19:47:49449
450 step_verifiers.append(
451 try_job_steps.TryJobTriggeredOrNormalSteps(
[email protected]b735f6d2013-10-22 18:23:47452 builder_name=triggered,
[email protected]9fd2b0e2013-02-20 19:47:49453 trigger_name=builder,
[email protected]9a2bd592013-04-26 17:20:01454 prereq_builder=prereq_builder,
455 prereq_tests=prereq_tests,
[email protected]e9ad0aa2013-10-08 13:49:04456 steps=builder_swarm_enabled_tests,
[email protected]0d0a4812013-02-21 16:26:37457 trigger_bot_steps=regular_tests,
458 use_triggered_bot=False))
[email protected]9fd2b0e2013-02-20 19:47:49459
[email protected]08d4ba92014-01-10 17:21:16460 # Experimental recipe-based Chromium trybots. To avoid possible capacity
461 # problems, only enable for a small percentage of try runs.
[email protected]2f2aabf2014-01-15 16:26:52462 # Disable as emergency measure - crbug.com/334681
[email protected]08d4ba92014-01-10 17:21:16463 verifiers.append(
464 trigger_experimental_try_job.TriggerExperimentalTryJobVerifier(
465 context_obj,
[email protected]07978642014-01-21 22:39:32466 percentage=0.25,
[email protected]08d4ba92014-01-10 17:21:16467 try_job_description={
[email protected]08d4ba92014-01-10 17:21:16468 'linux_chromium_rel': ['defaulttests'],
[email protected]08d4ba92014-01-10 17:21:16469 'mac_chromium_rel': ['defaulttests'],
470 }))
471
[email protected]9a2bd592013-04-26 17:20:01472 verifiers.append(try_job_on_rietveld.TryRunnerRietveld(
473 context_obj,
474 'http://build.chromium.org/p/tryserver.chromium/',
475 user,
476 step_verifiers,
477 IGNORED_STEPS,
478 'src'))
[email protected]7d4b3e82010-12-22 02:43:30479
[email protected]c7991612011-01-18 22:04:09480 verifiers.append(tree_status.TreeStatusVerifier(
[email protected]570e1382013-04-18 21:16:20481 'https://chromium-status.appspot.com'))
[email protected]7d4b3e82010-12-22 02:43:30482 return pending_manager.PendingManager(
[email protected]5dba4db2011-07-25 22:42:55483 context_obj,
[email protected]bfa5ce82011-01-11 21:47:40484 verifiers_no_patch,
[email protected]9ca30712011-06-12 00:56:12485 verifiers)
[email protected]7d4b3e82010-12-22 02:43:30486
487
[email protected]f2752442013-02-21 16:17:52488def _skia_status_pwd(root_dir):
489 filepath = os.path.join(root_dir, '.skia_status_pwd')
490 return _read_lines(filepath, 'skia-status password')[0].strip()
491
492
[email protected]b5b01842013-04-03 14:52:18493def _gen_skia(user, root_dir, rietveld_obj, no_try):
[email protected]e4bc2d62013-02-20 12:52:09494 """Generates a PendingManager commit queue for Skia.
[email protected]0d0a4812013-02-21 16:26:37495
[email protected]e4bc2d62013-02-20 12:52:09496 Adds the following verifiers to the PendingManager:
497 * ProjectBaseUrlVerifier
498 * ReviewerLgtmVerifier
499 * PresubmitCheckVerifier
500 * TreeStatusVerifier
[email protected]b5b01842013-04-03 14:52:18501 * TryRunnerRietveld (runs compile trybots)
[email protected]e4bc2d62013-02-20 12:52:09502 """
[email protected]fcfd5792013-02-22 13:55:42503 naked_url = '://skia.googlecode.com/svn/trunk'
[email protected]e4bc2d62013-02-20 12:52:09504 local_checkout = checkout.SvnCheckout(
505 root_dir,
506 'skia',
507 user,
[email protected]db6a8012013-04-16 21:45:38508 None,
[email protected]e4bc2d62013-02-20 12:52:09509 'https' + naked_url)
510 context_obj = context.Context(
511 rietveld_obj,
512 local_checkout,
513 async_push.AsyncPush(
514 'https://skia-tree-status.appspot.com/cq',
[email protected]a3c14002013-03-04 18:27:02515 _skia_status_pwd(root_dir)),
516 server_hooks_missing=True)
[email protected]e4bc2d62013-02-20 12:52:09517
518 project_bases = [
519 '^%s(|/.*)$' % re.escape(base + naked_url) for base in ('http', 'https')
520 ]
[email protected]7bc57342013-12-05 17:55:09521 project_bases.append(
522 r'^https?\:\/\/skia.googlesource.com\/skia(?:\.git)?%s$' %
523 BRANCH_MATCH)
[email protected]e4bc2d62013-02-20 12:52:09524 verifiers_no_patch = [
525 project_base.ProjectBaseUrlVerifier(project_bases),
526 reviewer_lgtm.ReviewerLgtmVerifier(
527 _get_skia_committers(),
528 [re.escape(user)]),
529 ]
530 verifiers = [
531 presubmit_check.PresubmitCheckVerifier(context_obj),
532 tree_status.TreeStatusVerifier(
[email protected]570e1382013-04-18 21:16:20533 'https://skia-tree-status.appspot.com')
[email protected]e4bc2d62013-02-20 12:52:09534 ]
535
[email protected]b5b01842013-04-03 14:52:18536 if not no_try:
[email protected]2db110c2013-09-21 19:17:16537 # TODO(skia-infrastructure-team): Use skia.org instead of the below when it
538 # is ready.
539 try_server_url = 'http://skiabot-master.pogerlabs.com:10117/'
[email protected]a1cb43d2013-04-09 17:16:51540
[email protected]316cd862013-08-06 16:57:28541 # Get the required build steps and builder names from the try server.
[email protected]2db110c2013-09-21 19:17:16542 compile_required_build_steps = json.load(
543 urllib2.urlopen(
544 try_server_url + 'json/cq_required_steps'))['cq_required_steps']
[email protected]a1cb43d2013-04-09 17:16:51545 builder_names = list(
546 json.load(urllib2.urlopen(try_server_url + 'json/cqtrybots')))
[email protected]b5b01842013-04-03 14:52:18547
548 step_verifiers = []
549 for builder_name in builder_names:
550 step_verifiers.append(
551 try_job_steps.TryJobSteps(
552 builder_name=builder_name,
553 steps=compile_required_build_steps))
554 verifiers.append(try_job_on_rietveld.TryRunnerRietveld(
555 context_obj=context_obj,
556 try_server_url=try_server_url,
557 commit_user=user,
558 step_verifiers=step_verifiers,
559 ignored_steps=[],
560 solution='src'))
561
[email protected]e4bc2d62013-02-20 12:52:09562 return pending_manager.PendingManager(
563 context_obj,
564 verifiers_no_patch,
565 verifiers)
566
567
[email protected]98663522011-05-28 00:35:36568def _gen_nacl(user, root_dir, rietveld_obj, no_try):
[email protected]8ed39982011-02-10 20:56:58569 """Generates a PendingManager commit queue for Native Client."""
[email protected]8ed39982011-02-10 20:56:58570 offset = 'trunk/src/native_client'
[email protected]98663522011-05-28 00:35:36571 local_checkout = checkout.SvnCheckout(
572 root_dir,
573 'nacl',
574 user,
[email protected]db6a8012013-04-16 21:45:38575 None,
[email protected]98663522011-05-28 00:35:36576 'svn://svn.chromium.org/native_client/' + offset)
[email protected]03878dc2011-07-29 15:53:22577 context_obj = context.Context(
[email protected]613b7732011-08-18 01:33:29578 rietveld_obj,
579 local_checkout,
580 async_push.AsyncPush(
[email protected]5d62dd02011-09-22 21:58:58581 'https://nativeclient-status.appspot.com/cq',
[email protected]613b7732011-08-18 01:33:29582 _chromium_status_pwd(root_dir)))
[email protected]8ed39982011-02-10 20:56:58583
[email protected]a129cf12011-05-16 19:30:21584 host_aliases = SVN_HOST_ALIASES + [
585 'http://src.chromium.org', 'https://src.chromium.org']
[email protected]bdc32c62011-02-24 01:56:45586 svn_bases = [i + '/native_client' for i in host_aliases]
[email protected]8ed39982011-02-10 20:56:58587 project_bases = [
[email protected]bdc32c62011-02-24 01:56:45588 '^%s/%s(|/.*)$' % (re.escape(base), offset) for base in svn_bases
[email protected]8ed39982011-02-10 20:56:58589 ]
[email protected]9d968752013-03-08 02:16:04590 aliases = (
[email protected]04c822d2013-07-26 04:14:34591 'git.chromium.org/native_client/src/native_client',
592 'chromium.googlesource.com/native_client/src/native_client',
[email protected]9d968752013-03-08 02:16:04593 )
594 project_bases.extend(
[email protected]04c822d2013-07-26 04:14:34595 r'^https?\:\/\/%s(?:\.git)?%s$' % (re.escape(i), BRANCH_MATCH)
596 for i in aliases)
[email protected]8ed39982011-02-10 20:56:58597 verifiers_no_patch = [
598 project_base.ProjectBaseUrlVerifier(project_bases),
[email protected]8ed39982011-02-10 20:56:58599 reviewer_lgtm.ReviewerLgtmVerifier(
[email protected]95477b72011-12-06 16:01:35600 _get_nacl_committers(),
[email protected]8ed39982011-02-10 20:56:58601 [re.escape(user)]),
602 ]
603 verifiers = [
[email protected]037618f2012-10-31 13:06:18604 presubmit_check.PresubmitCheckVerifier(context_obj),
[email protected]8ed39982011-02-10 20:56:58605 ]
606 if not no_try:
[email protected]23df40b2011-07-21 00:44:22607 # Grab the list of all the builders here. The commit queue needs to know
608 # which builders were triggered. TODO: makes this more automatic.
609 url = 'http://build.chromium.org/p/tryserver.nacl/json/builders'
[email protected]2b7ee5a2012-02-22 19:54:27610 builders_and_tests = dict(
611 (key, []) for key in json.load(urllib2.urlopen(url))
612 if (key.startswith('nacl-') and
613 'toolchain' not in key and
[email protected]5a1c25c2012-05-04 19:54:35614 'valgrind' not in key and
[email protected]ec5d6a92012-05-31 01:34:19615 'perf_panda' not in key and
616 'arm_hw' not in key and
[email protected]c3565e72012-06-29 16:14:48617 'shared' not in key and
[email protected]ec5d6a92012-05-31 01:34:19618 'coverage' not in key)
[email protected]2b7ee5a2012-02-22 19:54:27619 )
[email protected]bba00202012-07-24 20:04:13620 verifiers.append(try_server.TryRunnerSvn(
[email protected]5dba4db2011-07-25 22:42:55621 context_obj,
[email protected]8ed39982011-02-10 20:56:58622 'http://build.chromium.org/p/tryserver.nacl/',
623 user,
[email protected]2b7ee5a2012-02-22 19:54:27624 builders_and_tests,
[email protected]4f4997d2012-03-09 02:11:50625 IGNORED_STEPS,
[email protected]bba00202012-07-24 20:04:13626 'native_client',
[email protected]a45a6492011-07-21 18:17:33627 ['--root', 'native_client'],
[email protected]bba00202012-07-24 20:04:13628 _nacl_lkgr))
[email protected]8ed39982011-02-10 20:56:58629
630 verifiers.append(tree_status.TreeStatusVerifier(
[email protected]570e1382013-04-18 21:16:20631 'https://nativeclient-status.appspot.com'))
[email protected]8ed39982011-02-10 20:56:58632 return pending_manager.PendingManager(
[email protected]5dba4db2011-07-25 22:42:55633 context_obj,
[email protected]8ed39982011-02-10 20:56:58634 verifiers_no_patch,
[email protected]a45a6492011-07-21 18:17:33635 verifiers)
[email protected]8ed39982011-02-10 20:56:58636
637
[email protected]4dc496d2012-01-04 21:07:37638def _gen_gyp(user, root_dir, rietveld_obj, no_try):
639 """Generates a PendingManager commit queue for GYP."""
[email protected]4dc496d2012-01-04 21:07:37640 naked_url = '://gyp.googlecode.com/svn/trunk'
641 local_checkout = checkout.SvnCheckout(
642 root_dir,
643 'gyp',
644 user,
[email protected]db6a8012013-04-16 21:45:38645 None,
[email protected]4dc496d2012-01-04 21:07:37646 'https' + naked_url)
647 context_obj = context.Context(
648 rietveld_obj,
649 local_checkout,
650 async_push.AsyncPush(
651 'https://chromium-status.appspot.com/cq/receiver',
652 _chromium_status_pwd(root_dir)))
653
654 project_bases = [
655 '^%s(|/.*)$' % re.escape(base + naked_url) for base in ('http', 'https')
656 ]
657 verifiers_no_patch = [
658 project_base.ProjectBaseUrlVerifier(project_bases),
659 reviewer_lgtm.ReviewerLgtmVerifier(
660 _get_gyp_committers(),
661 [re.escape(user)]),
662 ]
663 verifiers = []
664 if not no_try:
665 # Grab the list of all the builders here. The commit queue needs to know
666 # which builders were triggered. TODO: makes this more automatic.
667 # GYP is using the Nacl try server.
668 url = 'http://build.chromium.org/p/tryserver.nacl/json/builders'
[email protected]2b7ee5a2012-02-22 19:54:27669 builders_and_tests = dict(
670 (key, []) for key in json.load(urllib2.urlopen(url))
671 if key.startswith('gyp-')
672 )
[email protected]bba00202012-07-24 20:04:13673 verifiers.append(try_server.TryRunnerSvn(
[email protected]4dc496d2012-01-04 21:07:37674 context_obj,
675 'http://build.chromium.org/p/tryserver.nacl/',
676 user,
[email protected]2b7ee5a2012-02-22 19:54:27677 builders_and_tests,
[email protected]4f4997d2012-03-09 02:11:50678 IGNORED_STEPS,
[email protected]bba00202012-07-24 20:04:13679 'gyp',
[email protected]4dc496d2012-01-04 21:07:37680 ['--root', 'gyp'],
[email protected]bba00202012-07-24 20:04:13681 lambda: None))
[email protected]4dc496d2012-01-04 21:07:37682
683 verifiers.append(tree_status.TreeStatusVerifier(
[email protected]570e1382013-04-18 21:16:20684 'https://gyp-status.appspot.com/status'))
[email protected]4dc496d2012-01-04 21:07:37685 return pending_manager.PendingManager(
686 context_obj,
687 verifiers_no_patch,
688 verifiers)
689
690
[email protected]708cd902012-04-24 17:52:27691def _gen_tools(user, root_dir, rietveld_obj, _no_try):
[email protected]4202f322011-08-18 01:20:07692 """Generates a PendingManager commit queue for everything under
693 chrome/trunk/tools.
[email protected]5a1cc9d2010-12-23 03:11:21694
[email protected]4202f322011-08-18 01:20:07695 These don't have a try server but have presubmit checks.
[email protected]5a1cc9d2010-12-23 03:11:21696 """
[email protected]708cd902012-04-24 17:52:27697 # Ignore no_try.
[email protected]104c6532012-05-29 18:42:23698 path = 'tools'
699 project_bases = [
700 '^%s/trunk/%s(|/.*)$' % (re.escape(base), path)
701 for base in CHROME_SVN_BASES
702 ]
[email protected]104c6532012-05-29 18:42:23703 aliases = (
[email protected]04c822d2013-07-26 04:14:34704 # Old path.
705 'git.chromium.org/git/chromium/tools',
706 # New path.
707 'git.chromium.org/chromium/tools',
708 'chromium.googlesource.com/chromium/tools',
[email protected]d50e0ec2013-09-13 02:16:05709 'chromium.googlesource.com/a/chromium/tools',
[email protected]104c6532012-05-29 18:42:23710 )
[email protected]04c822d2013-07-26 04:14:34711 project_bases.extend(
712 r'^https?\:\/\/%s\/([a-z0-9\-_]+)(?:\.git)?%s$' % (
713 re.escape(i), BRANCH_MATCH) for i in aliases)
[email protected]104c6532012-05-29 18:42:23714 return _internal_simple(path, project_bases, user, root_dir, rietveld_obj)
[email protected]6c025cf2011-05-27 12:44:52715
716
[email protected]708cd902012-04-24 17:52:27717def _gen_chromium_deps(user, root_dir, rietveld_obj, _no_try):
[email protected]6c025cf2011-05-27 12:44:52718 """Generates a PendingManager commit queue for
719 chrome/trunk/deps/.
720 """
[email protected]708cd902012-04-24 17:52:27721 # Ignore no_try.
[email protected]104c6532012-05-29 18:42:23722 path = 'deps'
723 project_bases = [
724 '^%s/trunk/%s(|/.*)$' % (re.escape(base), path)
725 for base in CHROME_SVN_BASES
726 ]
727 return _internal_simple(path, project_bases, user, root_dir, rietveld_obj)
[email protected]c47cf502011-02-02 15:48:58728
729
[email protected]104c6532012-05-29 18:42:23730def _internal_simple(path, project_bases, user, root_dir, rietveld_obj):
[email protected]5a1cc9d2010-12-23 03:11:21731 """Generates a PendingManager commit queue for chrome/trunk/tools/build."""
[email protected]98663522011-05-28 00:35:36732 local_checkout = checkout.SvnCheckout(
733 root_dir,
734 os.path.basename(path),
735 user,
[email protected]db6a8012013-04-16 21:45:38736 None,
[email protected]9ca30712011-06-12 00:56:12737 'svn://svn.chromium.org/chrome/trunk/' + path,
[email protected]d91910e2013-05-16 14:26:08738 [chromium_copyright.process])
[email protected]03878dc2011-07-29 15:53:22739 context_obj = context.Context(
[email protected]613b7732011-08-18 01:33:29740 rietveld_obj,
741 local_checkout,
742 async_push.AsyncPush(
[email protected]5d62dd02011-09-22 21:58:58743 'https://chromium-status.appspot.com/cq',
[email protected]613b7732011-08-18 01:33:29744 _chromium_status_pwd(root_dir)))
[email protected]7d4b3e82010-12-22 02:43:30745
[email protected]bfa5ce82011-01-11 21:47:40746 verifiers_no_patch = [
[email protected]4005b772011-02-09 22:58:24747 project_base.ProjectBaseUrlVerifier(project_bases),
[email protected]bfa5ce82011-01-11 21:47:40748 reviewer_lgtm.ReviewerLgtmVerifier(
[email protected]95477b72011-12-06 16:01:35749 _get_chromium_committers(),
[email protected]bfe33352011-02-02 21:04:12750 [re.escape(user)]),
[email protected]4005b772011-02-09 22:58:24751 ]
752 verifiers = [
[email protected]b95596d2012-05-04 22:50:58753 presubmit_check.PresubmitCheckVerifier(context_obj, timeout=900),
[email protected]4005b772011-02-09 22:58:24754 ]
[email protected]bfa5ce82011-01-11 21:47:40755
[email protected]7d4b3e82010-12-22 02:43:30756 return pending_manager.PendingManager(
[email protected]5dba4db2011-07-25 22:42:55757 context_obj,
[email protected]bfa5ce82011-01-11 21:47:40758 verifiers_no_patch,
[email protected]9ca30712011-06-12 00:56:12759 verifiers)
[email protected]7d4b3e82010-12-22 02:43:30760
761
762def supported_projects():
763 """List the projects that can be managed by the commit queue."""
[email protected]1ee1dd02014-01-28 18:23:28764 return sorted(
765 x[5:] for x in dir(sys.modules[__name__]) if x.startswith('_gen_'))
[email protected]7d4b3e82010-12-22 02:43:30766
767
[email protected]98663522011-05-28 00:35:36768def load_project(project, user, root_dir, rietveld_obj, no_try):
[email protected]1ee1dd02014-01-28 18:23:28769 """Loads the specified project."""
[email protected]7859f232012-10-08 17:09:36770 assert os.path.isabs(root_dir)
[email protected]1ee1dd02014-01-28 18:23:28771 return getattr(sys.modules[__name__], '_gen_' + project)(
772 user, root_dir, rietveld_obj, no_try)