blob: c4b804da8cde14e6c1c31fae40eac126e4485cb0 [file] [log] [blame]
Oleh Prypin1a0593f2019-03-11 09:43:28 +01001#!/usr/bin/env lucicfg
2
3# Copyright (c) 2019 The WebRTC project authors. All rights reserved.
4# Use of this source code is governed by a BSD-style license that can be
5# found in the LICENSE file.
6
7# https://chromium.googlesource.com/infra/luci/luci-go/+/master/lucicfg/doc/
8
9WEBRTC_GIT = "https://webrtc.googlesource.com/src"
10WEBRTC_GERRIT = "https://webrtc-review.googlesource.com/src"
11
12# Top-level configs:
13
14lucicfg.config(
15 config_dir = ".",
16 tracked_files = [
17 "commit-queue.cfg",
18 "cr-buildbucket.cfg",
19 "luci-logdog.cfg",
20 "luci-milo.cfg",
Oleh Prypin71d17422019-03-28 08:43:16 +010021 "luci-notify.cfg",
Oleh Prypin1a0593f2019-03-11 09:43:28 +010022 "luci-scheduler.cfg",
23 "project.cfg",
24 ],
25)
26
27luci.project(
28 name = "webrtc",
29 buildbucket = "cr-buildbucket.appspot.com",
30 logdog = "luci-logdog.appspot.com",
31 milo = "luci-milo.appspot.com",
Oleh Prypin71d17422019-03-28 08:43:16 +010032 notify = "luci-notify.appspot.com",
Oleh Prypin1a0593f2019-03-11 09:43:28 +010033 scheduler = "luci-scheduler.appspot.com",
34 swarming = "chromium-swarm.appspot.com",
35 acls = [
36 acl.entry(
37 [acl.BUILDBUCKET_READER, acl.LOGDOG_READER, acl.PROJECT_CONFIGS_READER, acl.SCHEDULER_READER],
38 groups = ["all"],
39 ),
40 acl.entry(acl.LOGDOG_WRITER, groups = ["luci-logdog-chromium-writers"]),
41 acl.entry(acl.SCHEDULER_OWNER, groups = ["project-webrtc-admins"]),
42 ],
43)
44
45luci.logdog(
46 gs_bucket = "chromium-luci-logdog",
47)
48
49luci.milo(
50 logo = "https://storage.googleapis.com/chrome-infra/webrtc-logo-vert-retro-255x305.png",
51)
52
53luci.cq(
54 status_host = "chromium-cq-status.appspot.com",
55 submit_max_burst = 1,
56 submit_burst_delay = 1 * time.minute,
57)
58
59luci.gitiles_poller(
60 name = "webrtc-gitiles-trigger-master",
61 bucket = "ci",
62 repo = WEBRTC_GIT,
63)
64
65# Bucket definitions:
66
67luci.bucket(
68 name = "try",
69 acls = [
70 acl.entry(acl.BUILDBUCKET_TRIGGERER, groups = [
71 "service-account-cq",
72 "project-webrtc-tryjob-access",
73 ]),
74 ],
75)
76
77luci.bucket(
78 name = "ci",
79 acls = [
80 acl.entry(acl.BUILDBUCKET_TRIGGERER, users = [
81 "luci-scheduler@appspot.gserviceaccount.com",
82 ]),
83 ],
84)
85
86luci.bucket(
87 name = "perf",
88 acls = [
89 acl.entry(acl.BUILDBUCKET_TRIGGERER, users = [
90 "luci-scheduler@appspot.gserviceaccount.com",
91 "webrtc-ci-builder@chops-service-accounts.iam.gserviceaccount.com",
92 ]),
93 ],
94)
95
96luci.bucket(
97 name = "cron",
98 acls = [
99 acl.entry(acl.BUILDBUCKET_TRIGGERER, users = [
100 "luci-scheduler@appspot.gserviceaccount.com",
101 ]),
102 ],
103)
104
105# Commit queue definitions:
106
107luci.cq_group(
108 name = "cq",
109 tree_status_host = "webrtc-status.appspot.com",
110 watch = [cq.refset(
111 repo = WEBRTC_GERRIT,
112 refs = ["refs/heads/master", "refs/branch-heads/.+"],
113 )],
114 acls = [
115 acl.entry(acl.CQ_COMMITTER, groups = ["project-webrtc-committers"]),
116 acl.entry(acl.CQ_DRY_RUNNER, groups = ["project-webrtc-tryjob-access"]),
117 ],
118 retry_config = cq.RETRY_ALL_FAILURES,
119)
120
121luci.cq_group(
122 name = "infra_cq",
123 watch = [cq.refset(
124 repo = WEBRTC_GERRIT,
125 refs = ["refs/heads/infra/config"],
126 )],
127 acls = [
128 acl.entry(acl.CQ_COMMITTER, groups = ["project-webrtc-admins"]),
129 acl.entry(acl.CQ_DRY_RUNNER, groups = ["project-webrtc-tryjob-access"]),
130 ],
131 retry_config = cq.RETRY_ALL_FAILURES,
132)
133
134luci.cq_tryjob_verifier(
135 builder = "presubmit",
136 cq_group = "infra_cq",
137)
138
Oleh Prypin71d17422019-03-28 08:43:16 +0100139# Notifier definitions:
140
141luci.notifier(
142 name = "ci_notifier",
143 on_failure = True,
144 notify_emails = ["webrtc-sheriffs-robots@google.com"],
145 template = "ci",
146)
147
148luci.notifier(
149 name = "cron_notifier",
150 on_failure = True,
151 notify_emails = ["webrtc-troopers-robots@google.com"],
152 template = "cron",
153)
154
Oleh Prypin1a0593f2019-03-11 09:43:28 +0100155# Recipe definitions:
156
157def recipe(recipe, pkg = "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"):
158 return luci.recipe(
159 name = recipe.split("/")[-1],
160 cipd_package = pkg,
161 cipd_version = "refs/heads/master",
162 recipe = recipe,
163 )
164
165recipe("chromium_trybot")
166recipe("run_presubmit")
167recipe("webrtc/auto_roll_webrtc_deps")
168recipe("webrtc/ios")
169recipe("webrtc/ios_api_framework")
170recipe("webrtc/libfuzzer")
171recipe("webrtc/more_configs")
172recipe("webrtc/noop")
173recipe("webrtc/standalone")
174recipe("lkgr_finder", pkg = "infra/recipe_bundles/chromium.googlesource.com/infra/infra")
175
176# Console definitions:
177
178luci.console_view(name = "ci", title = "Main", repo = WEBRTC_GIT, header = "console-header.textpb")
179luci.console_view(name = "perf", title = "Perf", repo = WEBRTC_GIT, header = "console-header.textpb")
180luci.list_view(name = "cron", title = "Cron")
181luci.console_view(name = "fyi", title = "FYI", repo = WEBRTC_GIT, header = "console-header.textpb")
182luci.list_view(name = "try", title = "Tryserver")
183
184def add_milo(builder, views):
185 """Add Milo console entries for the builder.
186
187 Args:
188 builder: builder name (str).
189 views: dict where keys are names of consoles and values are either a
190 category for the console (str, pipe-separated) or True, which means
191 adding to a list view rather than a console.
192 """
193 for view_name, category in views.items():
194 if category == None:
195 continue
196 elif type(category) == "string":
197 category, _, short_name = category.rpartition("|")
198 luci.console_view_entry(
199 console_view = view_name,
200 builder = builder,
201 category = category or None,
202 short_name = short_name or None,
203 )
204 elif category == True:
205 luci.list_view_entry(
206 list_view = view_name,
207 builder = builder,
208 )
209 else:
210 fail("Unexpected value for category: %r" % category)
211
212# Builder-defining functions:
213
214def webrtc_builder(name, recipe = "standalone", dimensions = {}, priority = 30, **kwargs):
215 dimensions = merge_dicts({"cpu": "x86-64"}, dimensions)
216
217 return luci.builder(
218 name = name,
219 recipe = recipe,
220 dimensions = {k: v for k, v in dimensions.items() if v != None},
221 execution_timeout = 2 * time.hour,
222 priority = priority,
223 build_numbers = True,
224 swarming_tags = ["vpython:native-python-wrapper"],
225 **kwargs
226 )
227
228def ci_builder(
229 name,
230 ci_cat,
231 perf_cat = None,
232 fyi_cat = None,
233 properties = {},
234 dimensions = {},
235 prioritized = False,
Oleh Prypinf5432c52019-03-19 15:10:37 +0100236 enabled = True,
Oleh Prypin1a0593f2019-03-11 09:43:28 +0100237 **kwargs):
238 if prioritized:
239 kwargs["triggering_policy"] = scheduler.greedy_batching(
240 max_batch_size = 1,
241 max_concurrent_invocations = 3,
242 )
243 kwargs["priority"] = 29
244
Oleh Prypinf5432c52019-03-19 15:10:37 +0100245 if enabled:
246 add_milo(name, {"ci": ci_cat, "perf": perf_cat, "fyi": fyi_cat})
Oleh Prypin1a0593f2019-03-11 09:43:28 +0100247 return webrtc_builder(
248 name = name,
249 properties = merge_dicts({"mastername": "client.webrtc"}, properties),
250 dimensions = merge_dicts({"pool": "luci.webrtc.ci"}, dimensions),
251 bucket = "ci",
252 service_account = "webrtc-ci-builder@chops-service-accounts.iam.gserviceaccount.com",
Oleh Prypinf5432c52019-03-19 15:10:37 +0100253 triggered_by = ["webrtc-gitiles-trigger-master"] if enabled else None,
Oleh Prypin71d17422019-03-28 08:43:16 +0100254 repo = WEBRTC_GIT,
255 notifies = ["ci_notifier"] if enabled else None,
Oleh Prypin1a0593f2019-03-11 09:43:28 +0100256 **kwargs
257 )
258
259def try_builder(
260 name,
261 try_cat = True,
262 fyi_cat = None,
263 properties = {},
264 dimensions = {},
265 cq = {},
266 **kwargs):
267 add_milo(name, {"try": try_cat, "fyi": fyi_cat})
268 if cq != None:
269 luci.cq_tryjob_verifier(
270 builder = name,
271 cq_group = "cq",
272 **cq
273 )
274
275 return webrtc_builder(
276 name = name,
277 properties = merge_dicts({"mastername": "tryserver.webrtc"}, properties),
278 dimensions = merge_dicts({"pool": "luci.webrtc.try"}, dimensions),
279 bucket = "try",
280 service_account = "webrtc-try-builder@chops-service-accounts.iam.gserviceaccount.com",
281 **kwargs
282 )
283
284def perf_builder(
285 name,
286 perf_cat,
287 recipe = "standalone",
288 properties = {},
289 dimensions = {},
290 **kwargs):
291 add_milo(name, {"perf": perf_cat})
292 return webrtc_builder(
293 name = name,
294 recipe = recipe,
295 properties = merge_dicts({"mastername": "client.webrtc.perf"}, properties),
296 dimensions = merge_dicts({"pool": "luci.webrtc.perf", "os": "Linux", "cpu": None}, dimensions),
297 bucket = "perf",
298 service_account = "webrtc-ci-builder@chops-service-accounts.iam.gserviceaccount.com",
299 # log_base of 1.7 means:
300 # when there are P pending builds, LUCI will batch the first B builds.
301 # P: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ...
302 # B: 1 1 2 2 3 3 3 3 4 4 4 4 4 4 5 ...
303 triggering_policy = scheduler.logarithmic_batching(log_base = 17 / 10),
304 **kwargs
305 )
306
307def cron_builder(name, dimensions = {}, **kwargs):
308 add_milo(name, {"cron": True})
309 return webrtc_builder(
310 name = name,
311 dimensions = merge_dicts({"pool": "luci.webrtc.cron", "os": "Linux"}, dimensions),
312 bucket = "cron",
313 service_account = "chromium-webrtc-autoroll@webrtc-ci.iam.gserviceaccount.com",
Oleh Prypin71d17422019-03-28 08:43:16 +0100314 repo = WEBRTC_GIT,
315 notifies = ["cron_notifier"],
Oleh Prypin1a0593f2019-03-11 09:43:28 +0100316 **kwargs
317 )
318
319# Helpers:
320
321def merge_dicts(a, b):
322 """Return the result of merging two dicts.
323
324 If matching values are both dicts or both lists, they will be merged (non-recursively).
325
326 Args:
327 a: first dict.
328 b: second dict (takes priority).
329 Returns:
330 Merged dict.
331 """
332 a = dict(a)
333 for k, bv in b.items():
334 av = a.get(k)
335 if type(av) == "dict" and type(bv) == "dict":
336 a[k] = dict(av)
337 a[k].update(bv)
338 elif type(av) == "list" and type(bv) == "list":
339 a[k] = av + bv
340 else:
341 a[k] = bv
342 return a
343
344def normal_builder_factory(**common_kwargs):
345 def builder(*args, **kwargs):
346 return ci_builder(*args, **merge_dicts(common_kwargs, kwargs))
347
348 def try_job(*args, **kwargs):
349 return try_builder(*args, **merge_dicts(common_kwargs, kwargs))
350
351 return builder, try_job
352
353# Mixins:
354
355linux_builder, linux_try_job = normal_builder_factory(
356 dimensions = {"os": "Linux", "inside_docker": "0"},
357)
358
359android_builder, android_try_job = normal_builder_factory(
360 dimensions = {"os": "Linux"},
361)
362
363win_builder, win_try_job = normal_builder_factory(
364 dimensions = {"os": "Windows"},
365)
366
367mac_builder, mac_try_job = normal_builder_factory(
368 dimensions = {"os": "Mac"},
369)
370
371ios_builder, ios_try_job = normal_builder_factory(
372 dimensions = {"os": "Mac-10.13"},
373 recipe = "ios",
374 properties = {"$depot_tools/osx_sdk": {"sdk_version": "10l232m"}},
375 caches = [swarming.cache("osx_sdk")],
376)
377
378# Actual builder configuration:
379
380android_builder("Android32 (M Nexus5X)(dbg)", "Android|arm|dbg")
381android_try_job("android_compile_arm_dbg", cq = None)
382android_try_job("android_arm_dbg")
383android_builder("Android32 (M Nexus5X)", "Android|arm|rel")
384android_try_job("android_arm_rel")
385android_builder("Android32 Builder arm", "Android|arm|size", perf_cat = "Android|arm|Builder|", prioritized = True)
386android_try_job("android_compile_arm_rel")
387perf_builder("Perf Android32 (L Nexus4)", "Android|arm|Tester|L Nexus4", triggered_by = ["Android32 Builder arm"])
388perf_builder("Perf Android32 (K Nexus5)", "Android|arm|Tester|K Nexus5", triggered_by = ["Android32 Builder arm"])
389perf_builder("Perf Android32 (L Nexus5)", "Android|arm|Tester|L Nexus5", triggered_by = ["Android32 Builder arm"])
390perf_builder("Perf Android32 (L Nexus6)", "Android|arm|Tester|L Nexus6", triggered_by = ["Android32 Builder arm"])
391perf_builder("Perf Android32 (L Nexus7.2)", "Android|arm|Tester|L Nexus7.2", triggered_by = ["Android32 Builder arm"])
392perf_builder("Perf Android32 (N Nexus6)", "Android|arm|Tester|N Nexus6", triggered_by = ["Android32 Builder arm"])
393android_builder("Android64 (M Nexus5X)(dbg)", "Android|arm64|dbg")
394android_try_job("android_compile_arm64_dbg", cq = None)
395android_try_job("android_arm64_dbg", cq = None)
396android_builder("Android64 (M Nexus5X)", "Android|arm64|rel")
397android_try_job("android_arm64_rel")
398android_builder("Android64 Builder arm64", "Android|arm64|size", perf_cat = "Android|arm64|Builder|", prioritized = True)
399android_try_job("android_compile_arm64_rel")
400perf_builder("Perf Android64 (L Nexus9)", "Android|arm64|Tester|L Nexus9", triggered_by = ["Android64 Builder arm64"])
401perf_builder("Perf Android64 (N Pixel)", "Android|arm64|Tester|N Pixel", triggered_by = ["Android64 Builder arm64"])
402android_builder("Android64 Builder x64 (dbg)", "Android|x64|dbg")
403android_try_job("android_compile_x64_dbg")
404android_try_job("android_compile_x64_rel", cq = None)
405android_builder("Android32 Builder x86 (dbg)", "Android|x86|dbg")
406android_try_job("android_compile_x86_dbg")
407android_builder("Android32 Builder x86", "Android|x86|rel")
408android_try_job("android_compile_x86_rel")
409android_builder("Android32 (more configs)", "Android|arm|more", recipe = "more_configs")
410android_try_job("android_arm_more_configs", recipe = "more_configs")
411android_try_job("android_chromium_compile", recipe = "chromium_trybot")
412
413ios_builder("iOS32 Debug", "iOS|arm|dbg")
414ios_try_job("ios_compile_arm_dbg")
415ios_builder("iOS32 Release", "iOS|arm|rel")
416ios_try_job("ios_compile_arm_rel")
417ios_builder("iOS64 Debug", "iOS|arm64|dbg")
418ios_try_job("ios_compile_arm64_dbg")
419ios_builder("iOS64 Release", "iOS|arm64|rel")
420ios_try_job("ios_compile_arm64_rel")
421ios_builder("iOS64 Sim Debug (iOS 10.0)", "iOS|x64|10")
422ios_try_job("ios_sim_x64_dbg_ios10")
423ios_builder("iOS64 Sim Debug (iOS 11)", "iOS|x64|11")
424ios_try_job("ios_sim_x64_dbg_ios11")
425ios_builder("iOS64 Sim Debug (iOS 12)", "iOS|x64|12")
426ios_try_job("ios_sim_x64_dbg_ios12")
427ios_builder("iOS API Framework Builder", "iOS|fat|size", recipe = "ios_api_framework", prioritized = True)
428ios_try_job("ios_api_framework", recipe = "ios_api_framework")
429
430linux_builder("Linux32 Debug", "Linux|x86|dbg")
431linux_try_job("linux_x86_dbg")
432linux_builder("Linux32 Release", "Linux|x86|rel")
433linux_try_job("linux_x86_rel")
434linux_builder("Linux64 Debug", "Linux|x64|dbg")
435linux_try_job("linux_dbg", cq = None)
436linux_try_job("linux_compile_dbg")
437linux_builder("Linux64 Release", "Linux|x64|rel")
438linux_try_job("linux_rel")
439linux_builder("Linux64 Builder", "Linux|x64|size", perf_cat = "Linux|x64|Builder|", prioritized = True)
440linux_try_job("linux_compile_rel")
441perf_builder("Perf Linux Trusty", "Linux|x64|Tester|Trusty", triggered_by = ["Linux64 Builder"])
442linux_builder("Linux32 Debug (ARM)", "Linux|arm|dbg")
443linux_try_job("linux_compile_arm_dbg")
444linux_builder("Linux32 Release (ARM)", "Linux|arm|rel")
445linux_try_job("linux_compile_arm_rel")
446linux_builder("Linux64 Debug (ARM)", "Linux|arm64|dbg")
447linux_try_job("linux_compile_arm64_dbg")
448linux_builder("Linux64 Release (ARM)", "Linux|arm64|rel")
449linux_try_job("linux_compile_arm64_rel")
450linux_builder("Linux64 Release (GCC)", "Linux|x64|gcc")
451linux_try_job("linux_compile_gcc_rel")
452linux_builder("Linux Asan", "Linux|x64|asan")
453linux_try_job("linux_asan")
454linux_builder("Linux MSan", "Linux|x64|msan")
455linux_try_job("linux_msan")
456linux_builder("Linux Tsan v2", "Linux|x64|tsan")
457linux_try_job("linux_tsan2")
458linux_builder("Linux UBSan", "Linux|x64|ubsan")
459linux_try_job("linux_ubsan")
460linux_builder("Linux UBSan vptr", "Linux|x64|ubsan")
461linux_try_job("linux_ubsan_vptr")
462linux_builder("Linux64 Release (Libfuzzer)", "Linux|x64|fuzz", recipe = "libfuzzer")
463linux_try_job("linux_libfuzzer_rel", recipe = "libfuzzer")
464linux_builder("Linux (more configs)", "Linux|x64|more", recipe = "more_configs")
465linux_try_job("linux_more_configs", recipe = "more_configs")
466linux_try_job("linux_chromium_compile", recipe = "chromium_trybot")
467
468mac_builder("Mac64 Debug", "Mac|x64|dbg")
469mac_try_job("mac_dbg", cq = None)
470mac_try_job("mac_compile_dbg")
471mac_builder("Mac64 Release", "Mac|x64|rel")
472mac_try_job("mac_rel")
473mac_try_job("mac_compile_rel", cq = None)
474mac_builder("Mac64 Builder", ci_cat = None, perf_cat = "Mac|x64|Builder|")
475perf_builder("Perf Mac 10.11", "Mac|x64|Tester|10.11", triggered_by = ["Mac64 Builder"])
476mac_builder("Mac Asan", "Mac|x64|asan")
477mac_try_job("mac_asan")
478mac_try_job("mac_chromium_compile", recipe = "chromium_trybot", dimensions = {"cores": "8"})
479
480win_builder("Win32 Debug", "Win MSVC|x86|dbg")
481win_try_job("win_x86_msvc_dbg")
482win_try_job("win_compile_x86_msvc_dbg", cq = None)
Oleh Prypin63041b82019-03-19 22:56:01 +0000483win_builder("Win32 Release", "Win MSVC|x86|rel")
484win_try_job("win_x86_msvc_rel")
Oleh Prypin1a0593f2019-03-11 09:43:28 +0100485win_try_job("win_compile_x86_msvc_rel", cq = None)
486win_builder("Win64 Debug", "Win MSVC|x64|dbg")
487win_try_job("win_x64_msvc_dbg")
488win_try_job("win_compile_x64_msvc_dbg", cq = None)
489win_builder("Win64 Release", "Win MSVC|x64|rel")
490win_try_job("win_x64_msvc_rel")
491win_try_job("win_compile_x64_msvc_rel", cq = None)
492win_builder("Win32 Debug (Clang)", "Win Clang|x86|dbg")
493win_try_job("win_x86_clang_dbg", cq = None)
494win_try_job("win_compile_x86_clang_dbg")
495win_builder("Win32 Release (Clang)", "Win Clang|x86|rel")
496win_try_job("win_x86_clang_rel")
497win_try_job("win_compile_x86_clang_rel", cq = None)
498win_builder("Win32 Builder (Clang)", ci_cat = None, perf_cat = "Win|x86|Builder|")
499perf_builder("Perf Win7", "Win|x86|Tester|7", triggered_by = ["Win32 Builder (Clang)"])
500win_builder("Win64 Debug (Clang)", "Win Clang|x64|dbg")
501win_try_job("win_x64_clang_dbg", cq = None)
502win_try_job("win_x64_clang_dbg_win8", cq = None)
503win_try_job("win_x64_clang_dbg_win10", cq = None)
504win_try_job("win_compile_x64_clang_dbg")
505win_builder("Win64 Release (Clang)", "Win Clang|x64|rel")
506win_try_job("win_x64_clang_rel", cq = None)
507win_try_job("win_compile_x64_clang_rel")
508win_builder("Win32 ASan", "Win Clang|x86|asan")
509win_try_job("win_asan")
510win_builder("Win64 UWP", ci_cat = None, fyi_cat = "")
511win_try_job("win_x64_uwp", cq = None, try_cat = None, fyi_cat = "")
512win_builder("Win (more configs)", "Win Clang|x86|more", recipe = "more_configs")
513win_try_job("win_x86_more_configs", recipe = "more_configs")
514win_try_job("win_chromium_compile", recipe = "chromium_trybot")
515
516linux_try_job(
517 "presubmit",
518 recipe = "run_presubmit",
519 properties = {"repo_name": "webrtc", "runhooks": True},
520 priority = 28,
521 cq = {"disable_reuse": True},
522)
523linux_try_job("noop", recipe = "noop", cq = {
524 "equivalent_builder": "external/*/g3.webrtc-internal.try/internal_compile_lite",
525 "equivalent_builder_percentage": 100,
526 "equivalent_builder_whitelist": "project-webrtc-internal-tryjob-access",
527})
528
529cron_builder(
530 "Auto-roll - WebRTC DEPS",
531 recipe = "auto_roll_webrtc_deps",
532 schedule = "0 */1 * * *", # Hourly.
533)
534cron_builder(
535 "WebRTC lkgr finder",
536 recipe = "lkgr_finder",
537 properties = {"lkgr_project": "webrtc", "allowed_lag": 4},
538 schedule = "*/10 * * * *", # Every 10 minutes.
539)